项目专栏
文章平均质量分 97
无聊看看天T^T
事以密成,语以泄败
展开
-
高并发内存池(六):补充内容
内存申请大于256KB但小于128 * 8 * 1024KB:因为PageCache中存放的span所管理的最大页数为128,即span可分配的最大内存为128 * 8 * 1024 KB,所以当可以直接向PageCache申请一个合适的span(该span管理的页数为此次内存申请对齐后大小 / 页大小)内存申请大于128 * 8 *1024 KB:PageCache中已经没有合适的span了,直接向堆上申请。原创 2024-09-29 18:21:31 · 734 阅读 · 0 评论 -
高并发内存池(五):ThreadCache、CentralCache和PageCache的内存回收机制、阶段性代码展示和释放内存过程的调试
我们无法直接通过从Thread Cache中归还的内存结点的地址确定该内存结点要被归还给CentralCache中的哪个span,需要先将该内存结点的地址转换为页号(内存结点都是从页中分配的),再通过页号和span的映射关系确定要归还的span是哪个原创 2024-09-27 16:15:49 · 939 阅读 · 0 评论 -
高并发内存池(四):阶段性代码展示 与 申请内存过程的调试
static 修饰类中的函数时,会使该函数成为该类的静态成员函数,存储在程序的全局静态存储区(或代码段),而不是为每个对象分配的堆或栈空间,可以直接使用类名调用,不需要也不推荐使用实例化后的类对象进行调用,所有该类实例化出的对象共享该静态成员函数,该函数只能访问类的静态成员变量和其它静态成员函数原创 2024-09-22 20:54:07 · 1020 阅读 · 0 评论 -
高并发内存池(三):CentralCache与PageCache的实现
_usecount用于记录当前span分配出去了多少个块空间,每分配一块给threadcache,就要++use_count,如果threadcache还回来了一块,那就- -use_count,_usecount初始值为0。当span中的use_count为0的时候可以将其还给pc以供pc拼接更大的页,用来解决外碎片问题。原创 2024-09-19 21:52:43 · 744 阅读 · 0 评论 -
高并发内存池(二):ThreadCache、通用函数、自由链表的初步实现
是哈希桶结构,每个桶下都挂有一个自由链表,每个线程独享,用于分配单次申请的内存小于256KB的情况(而不是说它一共可分配的内存为256KB),每个线程从这里申请内存不需要加锁,更加高效所有线程共享,故使用桶锁来解决各个线程在申请内存时存在的竞争关系(因为只有某个线程缓存没有足够的内存时才会向中心缓存申请,所以这里的竞争没有那么激烈),每个线程的线程缓存会按需求从中心缓存中获取内存,中心缓存再在合适的时机回收线程缓存中的内存,从而达到内存分配在多线程中更加的均衡,中心缓存没对象时会去页缓存申请页。原创 2024-09-08 20:30:37 · 645 阅读 · 0 评论 -
高并发内存池(一):项目介绍与定长内存池的实现
32下指针4字节大小和64位环境下指针8字节大小且int均为4字节,如果在32位机器下使用*(int*)obj 令obj指向的内存结点的前4字节存放下个结点的地址是没问题的,但是如果是64位环境,指针占8字节解引用后仍只能获取前4个字节,即获取的地址是实际的一半就会出问题,所以我们采用解引用二级指针的方式,这样就不需要我们额外的判断当前程序运行时所处的环境了原创 2024-09-05 21:51:55 · 790 阅读 · 0 评论