nginx slab 机制

本文介绍了Nginx中的Slab机制,重点讲解了其如何通过预置的后两位标记页面类型,利用位移操作提高效率,并避免内存碎片。通过管理slot和page,Nginx实现高效内存管理,包括不同大小的内存块分配与释放。文章还探讨了不同size的内存分配策略和页面类型的标识。
摘要由CSDN通过智能技术生成

 

       如果你们的文明是叫我们卑躬屈膝,那我就带你看见野蛮的骄傲.

                                                                                            --------------莫纳道鲁

       日本人比森林里的树叶还要繁密,比浊水溪的石头还要多,但是我反抗的决心比奇莱山还要坚定.

                                                                                                          --------------莫纳道鲁

       

       今天又看了一遍<<赛德克巴莱>>,为信仰而战,为灵魂而战,为自己而战.不可多得的一部好电影.

 

 

nginx中slab的亮点:

1.使用pre的后两位,用于标记page页面的类型

2.充分利用计算机的2进制特点,代码中充斥着位移,效率非常高.

3.构造小的内存块用于存储对象,这样就不会产生内存碎片.我对内存碎片的理解:内存碎片是指由于频繁的分配和回收内存,使得可用的单个内存块的大小总体上总是逐渐减小,无法合并相邻两块处于free状态的内存块,这样就产生了碎片.而slab算法不会产生内存碎片,即不会将整块内存逐渐分割,他总是可以直接定位内存块,直接使用,使用完成后将内存块设置为未使用状态即可,并不是使用完成后将该块内存放入链表中,等待下次分割或者直接使用.

 

structngx_slab_page_s {
     uintptr_t         slab; //后面详细讲解,用在不同地方,代表意义不同
    ngx_slab_page_t  *next;   //下一个page页
    uintptr_t         prev;     //上一个page页
};
 
typedefstruct {
    ngx_shmtx_sh_t    lock;
     //slot块大小的下限,而且这个下限必须大于8
    size_t            min_size;
     //最小左移距离,与上面的联合使用,必须大于3
    size_t            min_shift;
     //指向m_page数组
    ngx_slab_page_t  *pages;
     //管理free的页面
    ngx_slab_page_t   free;
 
     //数据区的起始地址
    u_char           *start;
     //数据区的结束地址
    u_char           *end;
 
     //共享内存锁
    ngx_shmtx_t       mutex;
 
    u_char           *log_ctx;
    u_char            zero;
 
    void             *data;
    void             *addr;
}ngx_slab_pool_t;

 

         nginx采用slab方法管理共享内存,即可以将一页内存分割成多个大小相等的内存块,不同的页分割出来的内存块大小可以不同.我们把页面叫做page,m_page数组管理page页面;一页分割出来的内存块叫做slot,m_slot数组管理slot.这里的m_slot表示manage slot,意思是管理slot;m_page表示managepage,寓意管理page.page数组表示真正用于存储数据的内存,m_slotm_page都是用于管理内存的.

 


仔细来研究一下这张图:

free:是ngx_slab_page_s类型对象,是一个链表头,用于连接空闲页面.

pages:是ngx_slab_page_s类型指针,固定指向m_page数组.它的用途是用于定位管理page[i]页面的m_page[i].

start:指向数据区的起始地址.

end:指向数据区的结束地址.

m_slot数组:数组中每个元素是一个链表头,用于连接m_page数组的元素.用于存储不同大小的slot.

m_slot[0]:链接page页面,并且page页面划分的slot块大小为2^3

m_slot[1]:链接page页面,并且page页面划分的slot块大小为2^4

m_slot[2]:链接page页面,并且page页面划分的slot块大小为2^5

……………….

m_slot[8]:链接page页面,并且page页面划分的slot块大小为2k(2048)

 

m_page数组:数组中每个元素对应一个page.

m_page[0]对应<

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值