
内存池
文章平均质量分 72
对SGI STL二级空间配置器(内存池)和 nginx内存池进行剖析
_索伦
结束,还是开始?
展开
-
Nginx:移植Nginx内存池 | 附测试用例
ngx_mem_pool.cpp 创建内存池和销毁内存池可以放在内存池的构造函数和析构函数中,这里没有放,所以在创建过程中把地址赋给内存池成员pool。原创 2022-06-28 17:00:03 · 671 阅读 · 0 评论 -
Nginx内存池:外部资源释放和内存池销毁
什么是外部资源? 若存在指针在该内存池中,指针指向堆区获得的空间(这块空间不包括在内存池中),如果直接对内存池清理,就会丢失外部资源的地址(因为指针被清理),导致内存泄漏。示例:在内存池中的char*指针指向堆内存。如果释放p,那么地址丢失,内存泄漏 所以Nginx针对这种情况,预置一个资源释放的函数(通过回调函数,函数指针来实现)。 就是这个cleanup: 而且为了效率,这些头信息也和large信息一样,都是在小块内存池上分配的: 使用ngx_palloc()开辟一个cleanup的头信息。 需要的内原创 2022-06-27 23:06:37 · 626 阅读 · 0 评论 -
Nginx内存池:重置函数和小块内存回收方案
Nginx的本质是一个HTTP服务器,是一个短链接的服务器。 如果客户端(浏览器)发起一个request请求,到达Nginx服务器以后,处理完成,Nginx会给客户端返回一个response响应,HTTP服务器就会主动断开TCP连接。 如果是HTTP1.1以后,有一个keep-alive: 60s,HTTP服务器(Nginx)返回响应后,会等待60s,60s内客户端又发来请求,就重置这个时间;如果客户端没有再发来请求,Nginx就主动断开连接,此时Nginx就可以调用ngx_reset_pool()重置.原创 2022-06-27 20:55:16 · 771 阅读 · 0 评论 -
Nginx内存池:内存分配方案 | 大块内存分配方法
如下,大块内存只有两个域:next域存储下一个大块内存的地址,和alloc记录大块内存的起始位置。 源码 该函数作为申请大块内存的函数,它一进来,还是先调用ngx_alloc(),即 使用malloc()来申请。 large是 ngx_pool_large_t类型的指针,所以他本身有两个域,next和alloc。所以该for()循环是为了将新申请的大块内存串联起来,遍历large的next,如果alloc为NULL,就让alloc指向这个大块内存首地址。串联成功后,就可以返回了。 示例:...原创 2022-06-27 18:43:56 · 1109 阅读 · 0 评论 -
Nginx内存池:内存分配方案 | 小块内存分配方案
内存分配时考虑了小块和大块,用不同函数实现, 如果申请的空间大小原创 2022-06-26 20:18:38 · 720 阅读 · 0 评论 -
Nginx内存池:内存池的创建
函数声明:该创建函数返回一个结构体,该结构体主要保存的内存池的主要头部信息,在上篇文章中提到过 内存池图示:接下来会对每一步骤进行解析 转到 ngx_memalign 的定义,如下,可以看出,如果定义了这两个宏,就进行字节对齐的申请,如果没有定义,就直接使用malloc()申请。 如下,如果不进行内存对齐,就调用这个函数,它直接使用malloc()。 如果进行内存对齐,就调用其他API: 对 内存池的ngx_pool_data_t进行初始化,如图:last指向除头部信息的开始(即可分配内存的起始位原创 2022-06-26 16:03:30 · 377 阅读 · 0 评论 -
Nginx内存池:重要的类型定义和函数接口
在SGI STL的内存池中,有小块内存和大块内存之分,分界线是128字节,因为这个内存池是给容器用的,所以比较小,而Nginx内存池的小块内存和大块内存分界线是一个页(4096字节)。。。下面介绍Nginx内存池的重要的类型定义和接口。第一个宏就是可从内存池分配的最大内存,大小是page(4k) - 1,就是4096 - 1 (4095)。 第二个宏是默认内存池大小,为16k大小。 第三个宏是内存池内存分配的字节对齐数字。 下面这个宏表示内存池的最小大小,里面有个ngx_align,转到定义后,可看到一个似原创 2022-06-25 18:22:01 · 878 阅读 · 0 评论 -
复习SGI STL二级空间配置器(内存池) | 笔记自用
在以前学习C++的时,写过一些剖析STL空间配置器的文章,如今回头再看一遍,想着复习一下。SGI STL空间配置器: 【该目录中查看】SGI STL包含了一级空间配置器和二级空间配置器,其中一级空间配置器allocator采用malloc和free来管理内存,和C++标准库中提供的allocator是一样的,但其二级空间配置器allocator采用了基于freelist自由链表原理的内存池机制实现内存管理。 容器的默认空间配置器是__STL_DEFAULT_ALLOCATOR( _Tp),它是一个宏定义,如原创 2022-06-22 23:38:51 · 534 阅读 · 0 评论