NGINX 内存池有感
写在前面
写NGINX系列的随笔,一来总结学到的东西,二来记录下疑惑的地方,在接下来的学习过程中去解决疑惑。
也希望同样对NGINX感兴趣的朋友能够解答我的疑惑,或者共同探讨研究。
整个NGINX系列的文章中,我会将我的疑惑用红色标出,希望能遇到前辈在评论中给我解答迷津。
内存池
Nginx是对我之前了解的内存池概念的一个颠覆。一直认为内存池的方式是管理着一批固定大小的buffer,申请时取一个,释放时,放回一个。
Nginx的内存池,提供了小内存、不固定长度内存申请的内存池方案。
Nginx的思想是内存池创建时malloc一个页(实际上是PAGE_SIZE -1 为什么减一?)的内存,有内存申请时,如果是小块内存(< 一个页)则直接在这个页上分配,如果不够了,则再申请一个页,将这两个页链起来,并在新页上分配内存。
如果是大块内存,则直接使用malloc接口,据说只有当分配的内存空间小于一页时才有必要缓存,否则的话不如直接调用malloc。据说这是一个经验,很多有内核编程经验的人都知道,至于这个经验怎么得到的,我不清楚。
Nginx内存池的接口,只提供大内存的释放接口,小内存没有提供是否接口,小内存等整个内存池释放时一起释放。
Nginx这样处理是因为对内存池的使用不是全局只有一个,也是动态的,比如一个TCP回话一个内存池,回话建立时创建,然后这个回话的所有申请需求都用这个池子申请,回话结束时,内存池也随着释放。
之前我理解的内存池只能处理固定大小的内存申请需求,不能处理不固定大小的内存申请需求。Nginx为了处理这样的需求,设计了这种机制,可以有效的降低malloc的次数,有效的减少内存碎片(用户地址空间的碎片怎么处理的,需要看看)。
NGINX 内存池有感的更多相关文章
- nginx——内存池篇
nginx--内存池篇 一.内存池概述 内存池是在真正使用内存之前,预先申请分配一定数量的.大小相等(一般情况下)的内存块留作备用.当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续 ...
- nginx 内存池分析
最近nginx的源码刚好研究到内存池,这儿就看下nginx内存池的相关的东西. 一,为什么要使用内存池 大多数的解释不外乎提升程序的处理性能及减小内存中的碎片,对于性能优化这点主要体现在: (1)系统 ...
- 初识nginx——内存池篇
初识nginx——内存池篇 为了自身使用的方便,Nginx封装了很多有用的数据结构,比如ngx_str_t ,ngx_array_t, ngx_pool_t 等等,对于内存池,nginx设计的十分精炼 ...
- nginx 内存池
参考 https://www.cnblogs.com/xiekeli/archive/2012/10/17/2727432.html?tdsourcetag=s_pctim_aiomsg 源码版本 n ...
- nginx内存池
一.设计原则 (1)降低内存碎片 (2)降低向操作系统申请内存的次数 (3)减少各个模块的开发效率 二.源代码结构 struct ngx_pool_s { ngx_pool_data_t ...
- nginx源码学习----内存池
最近在进行监控平台的设计,之前一直觉得C/C++中最棘手的部分是内存的管理上,远不止new/delete.malloc/free这么简单.随着代码量的递增,程序结构复杂度的提高.各种内存方面的问题悄然 ...
- nginx源码分析—内存池结构ngx_pool_t及内存管理
Content 0. 序 1. 内存池结构 1.1 ngx_pool_t结构 1.2 其他相关结构 1.3 ngx_pool_t的逻辑结构 2. 内存池操作 2.1 创建内存池 2.2 销毁内存池 2 ...
- nginx源代码分析之内存池实现原理
建议看本文档时结合nginx源代码. 1.1 什么是内存池?为什么要引入内存池? 内存池实质上是接替OS进行内存管理.应用程序申请内存时不再与OS打交道.而是从内存池中申请内存或者释放内存到内存池 ...
- Nginx 之 内存池
1.基本结构 先来学习一下nginx内存池的几个主要数据结构:[见:./src/core/ngx_palloc.h/.c] ngx_pool_data_t(内存池数据块结构) 1: typed ...
随机推荐
- RDIFramework.NET ━ 9.10 岗位(职位)管理 ━ Web部分
RDIFramework.NET ━ .NET快速信息化系统开发框架 9.10 岗位(职位)管理 -Web部分 岗位(职位)管理模块主要是针对组织机构的岗位(职位)进行管理,包括:增加.修改.删除. ...
- Fatal Error: TXK Install Service oracle.apps.fnd.txk.config.ProcessStateException: OUI process failed : Exit=255 See log for details
安装EBS的时候,database pre-install checks检查报警,显示"!" 一开始忽略了该报警,继续安装.在post-install checks的时候又报了错误 ...
- sql 表分区使用
如果你的数据库中某一个表中的数据满足以下几个条件,那么你就要考虑创建分区表了. 1.数据库中某个表中的数据很多.很多是什么概念?一万条?两万条?还是十万条.一百万条?这个,我觉得是仁者见仁.智者见智的 ...
- phpcms V9 MVC模式 与 URL访问解析
[1]URL访问解析 观察访问网页时的网址,可以得出模块访问方法,如下示例: http://www.abcd.com.cn/phpcms/index.php?m=content&c=index ...
- 使用匿名函数在回调函数中正确访问JS循环变量
有时候, 需要以不同的参数调用某个URL,并且在回调函数中仍然可以访问正在使用的参数, 这时候, 需要使用闭包保存当前参数, 否则, 当回调函数执行时, 之前的参数很可能早已被修改为最后一个参数了. ...
- Device Tree(三):代码分析【转】
转自:http://www.wowotech.net/linux_kenrel/dt-code-analysis.html Device Tree(三):代码分析 作者:linuxer 发布于:201 ...
- app安装位置声明
AndroidManifest.xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" ...
- 【Spring】利用Spring最简单地使用异步方法
有时候我们想异步地调用某个方法. 比如这个场景:在业务处理完毕后,需给用户发送通知邮件.由于邮件发送需调用邮箱服务商,有可能发生阻塞,我们就可以异步调用.当然有个前提,即如果邮件发送失败,不需要提示用 ...
- Spring并发访问的线程安全性问题
Spring并发访问的线程安全性问题 http://windows9834.blog.163.com/blog/static/27345004201391045539953/ 由于Spring MVC ...
- 10-JS数组
数组的定义和创建 数组是值得有序集合.JavaScript数组是无类型的. 数组对象的作用是:使用单独的变量名来存储一系列的值. 数组的创建 有两种向数组赋值的方法(你可以添加任意多的值,就像你可以定 ...