- 博客(14)
- 收藏
- 关注
原创 对HTTP/2中头部压缩的直观理解
假设每个请求的 Header 平均 500 Bytes,光是 Header 就浪费了 50KB 的流量。用于限制一个连接上能够传输的请求数量,避免动态表无限增大,请求数量到达上限后,就会关闭 HTTP/2 连接来释放内存。在 HTTP/1.1 中,请求之间是独立的。如果连接断了,动态表就丢了,重建连接需要重新积累上下文。对于那些既不在静态表,也不在动态表里的字符串(比如第一次出现的 URL 路径),HPACK 使用哈夫曼编码进行压缩。动态表容量有限,新的 Header 进来,旧的就会被挤出去。
2025-12-18 20:42:54
910
原创 关于内联函数的理解学习
如果函数有 100 行代码,内联 10 次,代码体积就膨胀 1000 行。这会导致最终的可执行文件变大,更糟糕的是会撑爆 CPU 的指令缓存,导致 Cache Miss 率飙升,反而变慢。如果确认安全且有性能收益,编译器会将函数体直接嵌入到调用处,就像把代码拷过去一样,但带有完整的类型安全机制。(2)而内联函数,如果编译器决定执行内联(编译器也有可能不执行内联,即使你声明了,他会有一个开销判断),就会直接省略前几步,将第 4 步函数体本身插入在主流程中。:弹出栈,恢复寄存器,跳转回原来的位置。
2025-12-11 20:19:35
168
原创 关于智能指针weak_ptr的理解认识
这是shared_ptr能够协同工作的核心。控制块是独立于数据对象之外的一块堆内存。它通常包含以下信息:强引用计数: 记录有多少个shared_ptr指向该对象。弱引用计数: 记录有多少个weak_ptr指向该对象。自定义删除器: 如果指定了特殊的释放方式,函数指针存这儿。Allocator: 内存分配器。关键点所有的拷贝(shared_ptr的复制)都只是让_cb里的强引用计数 +1(原子操作),而不是拷贝数据对象本身。3.两种创建方式(1)先new AA,在堆上分配对象内存。再创建。
2025-12-04 23:17:58
374
原创 关于内存描述符 mm_struct 结构的理解学习
比如:一段放代码(Text段),一段放全局变量(Data段),一段放动态申请的内存(Heap),一段放引用的动态库(so文件)。当 CPU 要执行指令访问某个虚拟地址时,硬件 MMU(内存管理单元)会直接读取这个 pgd,层层索引,最终找到物理内存的地址。Benefit(收益): 省去了切换页表(Switch CR3)的巨大开销,保住了 CPU 的 TLB 缓存(热数据)。创建速度快,但因为共用内存,一个线程乱写数据(比如野指针),整个进程里的所有线程都会遭殃(Crash)。子进程坏了,父进程不受影响。
2025-12-03 15:45:09
871
原创 生产者-消费者模型实现的线程池学习
老板说“不干了”(stop=true),按响超级门铃(notify_all),机器人醒来发现不干了且没货了,于是纷纷自毁(return),最后你确认它们都毁干净了(join),你也走了。:造了 3 个机器人(线程),它们一启动就冲到传送带(队列)前,发现没货,于是都关机休眠(wait)。:把一个任务(定义了做什么)丢到传送带上,然后按响门铃(notify_one)。:其中一个机器人醒了,发现有货,把货拿走(pop),同时解锁让别人有机会拿。代码:相关理解都注释在代码中。
2025-12-02 23:07:12
91
原创 虚函数 多态 简单示例学习
想象一个场景:有一个“播放”按钮,希望它连接电视时就播放电视节目,连接音响时就播放音乐。不想为每个设备都准备一个专用的“播放”按钮,希望的是同一个按钮,能根据连接的设备不同,自动执行正确的“播放”行为。结果就是,明明指针指向一个“超女”对象,但她只会用“报名者”的方式介绍自己,丢失了“超女”这个更具体的身份信息。),是个通用的“报名者”指针,但它实际上指向一个具体的“超女”对象。在基类中,将希望派生类去重新实现的函数声明为。时,编译器在编译代码的时候,只知道。的函数,都会自动成为虚函数。
2025-11-14 10:54:32
841
原创 关于bind和function的学习(基于前述生产-消费者模型)
内部通过堆内存和虚函数(或类似的动态派发技术)来存储和调用你传给它的任何可调用实体。它“擦除”了原始可调用实体的具体类型(是函数指针还是成员函数指针等),只保留了其调用签名这一公共接口。:普通函数,类的成员函数等等。类只需要提供一个“插座”,业务方可以把自己的“电器”(处理函数)插进来。这违反了软件设计的“开闭原则”(对扩展开放,对修改关闭)。处理数据的逻辑(也就是“业务逻辑”)是多变的。函数),明天可能是写入数据库,后天可能是调用另一个类的成员函数(类拿到数据后,就通过这个“插座”调用业务方的函数。
2025-11-12 17:39:58
802
1
原创 关于C++11中包装器和适配器的学习一
一、理解1.包装器:不改变原始功能代码的前提下,为其增加额外的通用行为。比如,在函数执行前后打印日志、计算函数执行时间、进行权限校验、开启和提交数据库事务等。这是一种非常有用的设计模式,符合“开闭原则”(对扩展开放,对修改关闭)。2.适配器:当我们有多个接口不同(例如,参数数量、类型不同,或者是成员函数与普通函数的区别)但功能相似的组件时,适配器可以将它们统一成一种标准接口,方便上层调用者以同样的方式使用它们。二、以代码为例让我们聚焦这部分代码。bindshow。
2025-11-12 16:58:35
285
原创 epoll理解以及边缘触发和水平触发
边缘触发(ET)与水平触发(LT)的区别:水平触发是状态触发,只要满足条件的状态存在,就会一直触发;我们假设高电平时候是满足条件,比如有读事件和写事件了,在高电平持续期间,水平触发会一直响应,即当有未处理完的读事件和写事件时,会一直提醒程序处理;边缘触发也存在一定问题,比如当客户端在同一时刻来了多个连接,这时候边缘触发只会触发一次,那么就会有连接没被受理。如果不设置为非阻塞,当队列为空时,程序就会一直卡在这里,如果有其他读事件发生,比如有报文发送过来,那服务端就无法接收。阻塞会,非阻塞不会。
2025-11-05 14:34:36
691
原创 关于select服务器(IO多路复用)的学习
摘要: 本文介绍了基于select模型实现的C++ TCP服务器核心代码,采用单线程处理多客户端并发连接。服务器功能包括:监听指定端口、接收客户端消息并原样返回。程序使用fd_set位图数据结构管理连接,通过select()系统调用监控socket事件,但存在1024并发连接限制和线性扫描性能瓶颈。代码分析展示了服务器初始化、事件循环处理流程,包括新连接accept处理、数据传输recv/send操作和连接断开时的资源清理。重点解析了select()的工作原理及其缺陷,包括临时fd_set副本的必要性、ma
2025-10-29 17:28:37
874
原创 关于简单的条件变量-生产消费者模型的学习理解
加锁,判断队列是否为空(二次检查防止虚假唤醒),如果为空,那么不能让这个锁一直占着,需要解锁,而解锁后如果一直检查锁有没有开会造成CPU空耗。它会不停地“加锁 -> 检查队列是否为空 -> 解锁 -> (如果为空)休眠一小会 -> 再重复”。它不是一把“锁”,而是一个“等待/通知”的机制。这就是我们的“取餐台”,一个先进先出(FIFO)的队列,用来存放生产者生产的“数据”(这里是。这确保了在同一时刻,只有一个线程能修改或访问队列,保证了操作的原子性和数据的一致性。,来唤醒一个正在睡眠的消费者线程。
2025-10-25 18:08:46
602
原创 在没有IDE的Linux服务器环境下,自动编译Makefile的使用
你想要生成的文件名,通常是可执行文件或目标文件。也可以是一个“动作”的名称,如。所需要执行的Shell命令。所需要的文件或其他的。或 make all。
2025-10-25 11:31:55
507
原创 关于静态库和动态库的理解
里的代码可能非常稳定,不怎么需要改动。但demo01.cpp是业务逻辑,可能天天都在改。每次我只改了demo01.cpp,却依然需要重新编译public.cpp,然后把所有.o文件链接起来。如果一个项目有成百上千个文件,仅仅改动一个文件就要全部重新编译,会浪费大量时间。把那些不常变动的、通用的功能(比如public.cpp,打包成一个文件,这个文件就是“库”。以后谁想用这些功能,直接拿这个打包好的“库”去用,无需再关心它的源码。这个“库”分为两种:静态库和动态库。一、静态库-.a文件静态库就像是“
2025-10-17 20:34:19
257
原创 配置Centos网络静态IP
掩码和网关照抄,IP为192.168.18.**,这个**和当前ip addr命令出现后的不同就行。(5)重启虚拟机,ip addr查看IP地址,发现地址是192.168.18.128,并且不会再变。(2).SecureCRT连接虚拟机后,在SecureCRT中输入以下命令,找到ens32或者是ens33,我这里是ens32。虚拟机可以和宿主机进行相互通信,虚拟机可以访问局域网中其它的主机,也可以访问互联网。用SecureCRT连接虚拟机时,如果不设置静态IP,每次重启虚拟机后连接都要重新配置,比较麻烦。
2025-10-16 16:03:05
280
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅