如果你们的文明是叫我们卑躬屈膝,那我就带你看见野蛮的骄傲.
--------------莫纳道鲁
日本人比森林里的树叶还要繁密,比浊水溪的石头还要多,但是我反抗的决心比奇莱山还要坚定.
--------------莫纳道鲁
今天又看了一遍<<赛德克巴莱>>,为信仰而战,为灵魂而战,为自己而战.不可多得的一部好电影.
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_slot和m_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]对应<