Nginx源码分析---内存池结构ngx_pool_t及内存管理

nginx对内存的管理由其自己实现的内存池结构ngx_pool_t来完成,本文重点叙述nginx的内存管理. nginx内存管理相关文件: (1) ./src/os/unix/ngx_alloc.h/.c 内存相关的操作,封装了最基本的内存分配函数 如free/malloc/memalign/posix_memalign,分别被封装为ngx_free,ngx_alloc/ngx_calloc, ngx_memalign ngx_alloc:封装malloc分配内存 ngx_calloc:封装ma

语言 内存中结构体字节对齐

原文来自:http://blog.csdn.net/haiwil/article/details/7070593 一.字节对齐作用和原因: 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址开始存取.比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐,其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失.比如有些平台每次读都是从偶地址

c/c++(c语言内存管理-内存池)

http://blog.csdn.net/shawngucas/article/details/6574863 1. 内存池设计 1.1 目的 在给定的内存buffer上建立内存管理机制,根据用户需求从该buffer上分配内存或者将已经分配的内存释放回buffer中. 1.2 要求 尽量减少内存碎片,平均效率高于C语言的malloc和free. 1.3 设计思路 将buffer分为四部分,第1部分是mem_pool结构体:第2部分是内存映射表:第3部分是内存chunk结构体缓冲区:第4部分是实际

内存使用技巧及内存池实现(二)

转载地址:http://blog.csdn.net/gugemichael/article/details/7547143 上一章节,提到了内存池的使用.其实内存池的作用看名字也能猜到,"池"意味着资源是同一管理和创建释放的,就像数据库的连接池.系统的线程池.主要就是为了避免创建.销毁资源的代价.c标准的malloc/free会造成大量的内存碎片以至于影响效率,所以"内存池"的技术某种程度上避免了这种消耗和影响. 本人觉得实现的内存池可以分为3级: 1.初级的简单内

内存池链表与大顶堆实现

1. 内存池设计 1.1 目的 在给定的内存buffer上建立内存管理机制,根据用户需求从该buffer上分配内存或者将已经分配的内存释放回buffer中. 1.2 要求 尽量减少内存碎片,平均效率高于C语言的malloc和free. 1.3 设计思路 将buffer分为四部分,第1部分是mem_pool结构体:第2部分是内存映射表:第3部分是内存chunk结构体缓冲区:第4部分是实际可分配的内存区.整个buffer结构图如图1所示: 图1 内存buffer结构图 第1部分的作用是可以通过该me

类和结构体的内存分配

类中的函数(方法)放在另外的内存当中,类的大小是类里面所有变量(数据)的内存总和, 另外一提的是,C++中有内存对齐的规则,如同下面的测试程序显示的一样,即内存占用总是4个字节的倍数. 另外,由于类的内存和结构体的都一样,取决与变量的总内存. 所以,类到结构体的类型转换是相当的方便,为了使分析更为清晰, 下面的测试参考了Directx中,D3DXCOLOR类到结构体D3DCOLORVALUE转换的实现. ps:共有4个结构体,分别是 d3dcolorvalue, //有成员float a,r,g

嵌入式 Linux C语言(七)——结构体

嵌入式 Linux C语言(六)--结构体 一.结构体简介 1.结构体定义 结构体定义一般有两种方法较为常用: 第一种方法: struct person{ char *name; unisgned int age; }; 第二种方法: typedef struct person{ char *name; unsigned int age; }Person; person实例声明如下: Person person;//声明一个person对象 Person *ptrPerson = (Person

nginx学习篇:内存池

nginx管理内存池的数据结构是ngx_pool_t.在ngx_request_t, ngx_conf_t中都控制着ngx_pool_t. 一.在nginx的Ngx_palloc.h里的定义如下: struct ngx_pool_s { ngx_pool_data_t d; size_t max; ngx_pool_t *current; ngx_chain_t *chain; ngx_pool_large_t *large; ngx_pool_cleanup_t *cleanup; ngx_l

[nginx] 内存池与基本容器

nginx内存池:ngx_pool_t,二级内存分配器 nginx基本容器,包括: 数组,ngx_array_t 链表,ngx_list_t 队列,ngx_queue_t 哈希表,ngx_hash_t 通配符哈希表,ngx_hash_wildcard_t 一.nginx内存池 参考nginx源码分析-内存池结构ngx_pool_t及内存管理,特点: 与STL的空间配置器类似,有两级配置,仅提供了释放大内存块的接口,小内存只分配不释放,要么释放整个内存池(nginx进程中有茫茫多内存池) 内存池由

内存池的实现(二)

<内存池的实现(一)>中,介绍了使用内存池的原因,设计内存池应该考虑的问题,最后给出一个简单的内存池实现例子.使用上一篇文章中介绍的内存池实现方案,要在一定的限定条件下,下面我们来看更通用的内存池实现--Apache服务器的内存池实现. Apache服务器的开发人员将代码中可移植的部分整理出来,编辑成Apache可移植运行库(Apacheportable Run-timelibraries),简称APR,该库可从这里下载,其中包含这里要介绍的内存池的实现代码.下面将Apache服务器内存池简称

结构体,联合体union,枚举,sizeof

结构体中的位字段 有些信息在存储时并不需要占用一个完整的字节,有时只需要占用一个或者几个二进制位,为了节省存储空间并使得处理简便,C语言提供了一种数据结构,成为"位域"或者"位段". C与C++允许指定占用特定位数的结构成员,字段的类型应为整型或者枚举型 ,接下来是冒号:,然后后面跟一个数字,它指定了使用的位数,且可以使用没有名字的字段来提供间距.每个成员都被称为位字段(bit field).例: 1 struct reg 2 { 3 unsigned int SN

结构体和共同体(链表操作)

§10.1 概述 结构体(structure)是一种构造的数据类型,它把互相联系的数据组合成一个整体.例. 一个学生的学号.姓名.性别.年龄.成绩.地址,是互相联系的数据,在C语言中用"结构体(structure)"来定义. struct student { int num; /* 学号 */ char name[20]; /* 姓名 */ char sex; /* 性别 */ int age; /* 年龄 */ float score; /* 成绩 */ char addr[30];

黑马程序员——C语言结构体与枚举等类型

-----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 一.C语言结构体 结构体类型变量的定义与其它类型的变量的定义是一样的,但由于结构体类型需要针对问题事先自行定义,所以结构体类型变量的定义形式就增加了灵活性,共计有三种形式,分别介绍如下: 1.结构体定义的三种形式: 1> 先定义结构体类型,再定义结构体类型变量: struct stu / *定义学生结构体类型* / { char name[20]; / * 学生姓名* / ch

聚合类型结构体

聚合数据类型:包括数组和结构 区别: 1.访问成员方式: 结构成员的个成员长度不相同,所以的结构通过名字来访问. 数组中的数据类型都相同,可以通过下标或指针来访问. 2.左右值 结构是一个标量.和其他任何标量一样,当结构名在表达式中作为右值使用时,他表示存储在结构中的值. 当它作为左值使用时,它表示结构存储的内存位置.但是当数组名在表达式中做为右值使用时,它的值是一个 指向数组第一个元素的指针.由于它的值是一个常量指针,所以数组名不能作为左值使用. 声明格式: struct tag{ membe

可变对象内存池的C语言实现

作者:吴洪辉 日期:2012-06-04 前言: 上阵子由于项目需要,决定在项目中尝试采用内存池来减少内存碎片.加快运行速度.通过一周的时间,前两天分析内存池概念/了解他人的设计方法,三天编码调试.在我设计的过程中参考了不少开源内存池的设计, 在此感谢他们为开源世界所作出的贡献.如果觉得该内存池还有需要完善的地方,希望能不吝指出. 特点:可变对象大小.可移植.容易定制.优化余地很大. (一)内存池概念 在程序运行中,频繁申请小内存,有可能导致虚拟地址空间中的剩余空闲空间碎片化,如果在大型应用中,

C# 调用dll 封送结构体 结构体数组

一. 结构体的传递 cpp 代码 #define JNAAPI extern "C" __declspec(dllexport) // C方式导出函数 typedef struct { int osVersion; int majorVersion; int minorVersion; int buildNum; int platFormId; char szVersion[128]; }OSINFO; // 1. 获取版本信息(传递结构体指针) JNAAPI bool GetVers

结构体与位字段

定义 类似于java中的bean,只不过里面的属性都是public,不需要setter,getter,并且不能赋初值. 定义结构体使用struct关键字.如下: struct Person{ int age; char * name; }; 该声明描述了一个由char*与int组成的结构体,并没有创建一个实际的数据对象. 首先使用struct表示接下来的是一个结构体:后面跟的是一个可选的标记(Person),它是用来引用该结构体的快速标识,在声明该结构体变量时可以用struct Person p

ngnix之内存池:结构体简析 和 函数功能总览

感悟 感悟有两点, 第一点就是别人已经把这个内存池总结的非常好了,我只是在继续炒冷饭而已,但是我还觉得该写点什么,我打算写结构体的含义和相关函数的功能.源码文件:ngx_palloc.c和ngx_palloc.h 更多复杂.详细的内容建议您参考: Nginx源码剖析之内存池,与内存管理 深入剖析nginx P65 第二点就是如何看源码,昨日不知在哪里看源码的经验,需要三步: 看懂大致框架结构.各个模块的功能.各个模块的结构体.函数.接口的功能是什么,用图表示更好 挑重点模块来精读源码.一句一句仔

linux内核内存管理中的pagevec结构体

linux内核的内存管理中有一个2.6内核才加入的并不很张扬的结构体,那就是pagevec: struct pagevec { unsigned long nr; unsigned long cold; struct page *pages[14]; }; 以往要加入到lru链表的page都要加入到这个pagevec了,并不再直接往lru中加入了.可是不加入lru的page就不会被内存管理机制所管理,因此仅仅这样是不行的,除非给pagevec结构加上lru的功能,然而这又势必会使这个结构体复杂化

结构体内存

由于CPU一次读取若干字节的内存数据,所以为了方便存取,编译器可以指定结构体的对其方式,由于静态成员在静态区而不占用结构体内存. 在32位系统中,long 占8字节,int占4字节,char占1字节