nginx内存池如何实现


这篇文章主要讲解了“nginx内存池如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nginx内存池如何实现”吧!最新稳定版本nginx1.20.2。
为了能高效、快速的分配内存,以及减少内存碎片等,nginx实现了自己的内存池基础组件。
主要实现文件ngx_palloc.h, ngx_palloc.c内存池中第一个成员是一个结构体:
使用ngx_pool_data_t结构体来表示当前内存池信息。
last :下次开始分配的地址
end: 内存池的结束地址
next: 内存池链表,将多个内存池连接起来max
整个内存池的最大大小current
指向从当前内存池开始查找可用内存chain
buffer使用的,这里不涉及large
当需要的内存大于内存池最大大小时,需要通过malloc直接分配,然后形成链表进行组织cleanup
清理工作的回调链表log
日志句柄当需要分配的内存比内存池的最大大小都大时,内存池无法满足分配,所以直接从系统中分配,然后构成一个链表进行维护。有一个回调任务的链表,当内存池销毁时,将依次遍历此链表,逐一回调handler进行清理工作。可以看出,很多节点都是从内存池中分配的,所以可以把精力都放在实际的数据上而不必在意其他细节上。从代码中可以看到,内存池最大不超过pagesize的大小分配函数分了内存对齐和内存不对齐,但这只控制了内存池中分配空间,不控制大内存分配。(1)分配小空间内存对齐 ngx_palloc内存不对齐 ngx_pnalloc当需要分配的空间小于max时,将使用小内存分配方式(即从内存池中分配空间),而ngx_pnalloc和ngx_palloc相比只是调用ngx_palloc_small时的最后一个参数为0。从pool->current指向的内存池开始遍历,寻找满足分配大小的空间,找到则返回首地址当现有内存池中都无法满足分配条件时,创建新的内存池其中,创建好新的内存池后,又做了一次遍历,将failed计数加一,当大于4时,将跳过此内存池,下次就不从它开始查找。
即认为超过4次你都不能满足分配,以后都不能满足分配,不再用你了,减少遍历个数,加快成功分配效率(2)分配大空间可以看出,为了避免分配空间,遍历large链查找可重用的节点,但是如果链表过大又可能太慢,所以只查找前三个,如果三个都没有找到,则直接分配(而且节点也是从内存池中分配的,所以后续清理时,不需要管节点,只需要释放申请的大内存本身)内存对齐可以看出,这里只是分配了一个节点,并没有设置handler以及data数据,所以还得看具体的调用方进行设置,因为这里返回了分配的节点。比如在函数ngx_create_temp_file中生成临时文件,将fd以及文件名注册到清理任务中,后续文件不使用了则不需要特殊处理,内存内存池释放时将统一清理。释放大内存重置内存中last重置failed计数这里有个现象:
在内存池中空间不足时,将调用ngx_palloc_block创建一个新的内存池,而last指向的是m += sizeof(ngx_pool_data_t);, 因此当前新分配的内存池将比第一个内存池可用大小多了(max,current,chain,large,cleanup,log)这几个字段大小(可能没有那么多,因为要对齐,可能对齐后就完全一样了),而现在重置时,p->d.last = (u_char *) p + sizeof(ngx_pool_t);每个内存池可用大小又变成一样的。回调清理任务释放大内存释放内存池本身通过遍历找到要释放的节点,将内存释放,并且将alloc设置成NULL,则有了节点重用的情况。正常分配的空间中都是垃圾数据,所以当前函数在分配空间后,将分配的空间清零。(1) 手动关闭指定fd遍历清理任务,找到ngx_pool_cleanup_file的handl免费云主机域名er,如果是要关闭的fd,则回调(2) 关闭fd(3) 删除文件并关闭fd感谢各位的阅读,以上就是“nginx内存池如何实现”的内容了,经过本文的学习后,相信大家对nginx内存池如何实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是百云主机,小编将为大家推送更多相关知识点的文章,欢迎关注!

相关推荐: 使用this.getClass().getResource()获取文件时遇到的坑怎么解决

这篇文章主要介绍“使用this.getClass().getResource()获取文件时遇到的坑怎么解决”,在日常操作中,相信很多人在使用this.getClass().getResource()获取文件时遇到的坑怎么解决问题上存在疑惑,小编查阅了各式资料,…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/18 14:38
下一篇 03/18 16:55

相关推荐