2025年ifstream和ofstream创建的文件在那里(ifstream和ofstream的区别)

ifstream和ofstream创建的文件在那里(ifstream和ofstream的区别)最近不是很忙 所以闲暇之余学习开源代码 nginx 是一个很好的选择 是一个教科书般的存在 但是本人是小菜鸟一个 linux 下的开发 嗯嗯 正在学习中 所以我的学习环境是 vs2010 见谅见谅啊 首先找到 main 函数 在 core nginx c 路径下 现在可以开始 nginx 之旅了 内存池的必要 通常我们用 new 和 malloc 来分配内存的话 由于申请的大小不确定 所以频繁的使用时会带来内存碎片和效率降低的问题 为了克服这种问题提出了内存池的概念 内存池是一种内存分配方式




最近不是很忙,所以闲暇之余学习开源代码,nginx是一个很好的选择,是一个教科书般的存在,但是本人是小菜鸟一个,linux下的开发…嗯嗯,正在学习中,所以我的学习环境是vs2010,见谅见谅啊。

首先找到main函数,在core/nginx.c路径下

nginx源_nginx


现在可以开始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)

关于内存池的图


编程小号
上一篇 2025-02-24 09:57
下一篇 2025-02-27 14:17

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/72506.html