最近不是很忙,所以闲暇之余学习开源代码,nginx是一个很好的选择,是一个教科书般的存在,但是本人是小菜鸟一个,linux下的开发…嗯嗯,正在学习中,所以我的学习环境是vs2010,见谅见谅啊。
首先找到main函数,在core/nginx.c路径下
现在可以开始nginx之旅了…
内存池的必要
——通常我们用new和malloc来分配内存的话,由于申请的大小不确定,所以频繁的使用时会带来内存碎片和效率降低的问题。为了克服这种问题提出了内存池的概念。内存池是一种内存分配方式。内存池的优点是可以有效的减少内存碎片化,分配内存更加快速,减少内存泄漏等优点。
——因此,nginx为了长远的运行考虑,也是通过这种方式,对内存进行统一申请,释放,大大提高了运行效率。先来看看nginx是如何管理的。
基本的内存池结构
内存池的创建
ngx_create_pool(size_t size, ngx_log_t *log)
内存申请
ngx_palloc 从内存池中申请内存,并内存对其
对于内存对齐,现在来看看内存对齐的宏定义
当初我看到这里的时候,对于内存对齐很不理解,为什么要内存对齐呢·······而且这个公式看起来好复杂啊,所以在这里简单的提一句,想要详细了解还是需要后期好好理解,打个比方,这里有1-16个箱子,每个箱子能够存放4个球,如果存放红色的6个球需要两个箱子,1号箱子放满,但是2号箱子却没有放满,如果再放白色的12个球,把没有放满的箱子放满,那么还需要三个箱子,3号放满,4号放满,5号没有满,然后再继续存放球····乍一看,哇塞,内存好节省哦,但是如果你要去找白色的球的时候呢,需要在从2号开始找,3号,4号,5号,打开4次才能找到,如果一开始从3号箱子开始存放,是不是3次就能找到了呢,降低了访问的次数,提高了效率,所以内存对齐就是这个作用,将指针移动到需要内存对齐下一块内存的首地址上,开始存放数据,虽然会对内存造成浪费,但是能够有效的提高访问效率。
但是上面的宏定义如果做到的呢,输入的a为需要对齐的大小,一般为2的幂次方,如果输入首地址为7,对齐大小为sizeof(*void),,减1取反后的二进制为0100,输入的首地址加上减1后的对齐大小为10,二进制为1010,&运算后值为1000,十进制为8,是不是4的倍数呢,变成了对齐后的首地址了。
ngx_pnalloc从内存池中申请内存
这个和ngx_palloc比较就能看出来,申请内存没有经过内存对齐。
再看看内存池不够的时候,内存块申请
内存池的重置
ngx_reset_pool(ngx_pool_t *pool)内存池初始化
内存池的清理
ngx_pfree(ngx_pool_t *pool, void *p)
内存清理只释放大块的内存,对于小内存不清理
内存池的销毁
ngx_destroy_pool(ngx_pool_t *pool)
关于内存池的图
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/72506.html