关于 nginx 内存池的疑义
关于 nginx 内存池的疑问
以上这个函数是在遍历内存池没有找到可用大小的内存块的时候重新分配一块内存的函数.假设一个内存块大小是1024B前面占用40字节,然后后面实际可用的内存区是984B,正好我们需要申请的内存也是984B,但是现在有两种情况,如果ngx_memalign对齐指针之后指针正好指在984B内存区的起始位置,那申请应该能够给成功,如果ngx_memalign对齐指针之后指针向后偏移了几个字节,那么实际可用的内存区就不够984B了?这个函数难道没有什么问题吗?
求解释?为什么ngx_memalign指针对齐之后还能确保后面的分配能够正常分配?
------解决方案--------------------
痴长几岁而已。
1: static void *
2: ngx_palloc_block(ngx_pool_t *pool, size_t size)
3: {
4: u_char *m;
5: size_t psize;
6: ngx_pool_t *p, *new, *current;
7:
8: psize = (size_t) (pool->d.end - (u_char *) pool);//计算内存池第一个内存块的大小
9:
10: m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);//分配和第一个内存块同样大小的内存块
11: if (m == NULL) {
12: return NULL;
13: }
14:
15: new = (ngx_pool_t *) m;
16:
17: new->d.end = m + psize;//设置新内存块的end
18: new->d.next = NULL;
19: new->d.failed = 0;
20:
21: m += sizeof(ngx_pool_data_t);//将指针m移动到d后面的一个位置,作为起始位置
22: m = ngx_align_ptr(m, NGX_ALIGNMENT);//对m指针按4字节对齐处理
23: new->d.last = m + size;//设置新内存块的last,即申请使用size大小的内存
24:
25: current = pool->current;
26: //这里的循环用来找最后一个链表节点,这里failed用来控制循环的长度,如果分配失败次数达到5次,
27: //就忽略,不需要每次都从头找起
28: for (p = current; p->d.next; p = p->d.next) {
29: if (p->d.failed++ > 4) {
30: current = p->d.next;
31: }
32: }
33:
34: p->d.next = new;
35:
36: pool->current = current ? current : new;
37:
38: return m;
39: }
以上这个函数是在遍历内存池没有找到可用大小的内存块的时候重新分配一块内存的函数.假设一个内存块大小是1024B前面占用40字节,然后后面实际可用的内存区是984B,正好我们需要申请的内存也是984B,但是现在有两种情况,如果ngx_memalign对齐指针之后指针正好指在984B内存区的起始位置,那申请应该能够给成功,如果ngx_memalign对齐指针之后指针向后偏移了几个字节,那么实际可用的内存区就不够984B了?这个函数难道没有什么问题吗?
求解释?为什么ngx_memalign指针对齐之后还能确保后面的分配能够正常分配?
------解决方案--------------------
痴长几岁而已。