- 1、本文档共50页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
flags:指定映射对象的类型,映射选项和映射页是否可以共享。它的值可以是一个或者多个以下位的组合体: MAP_FIXED //使用指定的映射起始地址,如果由start和len参数指定的内存区重叠于现存的映射空间,重叠部分将会被丢弃。如果指定的起始地址不可用,操作将会失败。并且起始地址必须落在页的边界上。 MAP_SHARED //与其它所有映射这个对象的进程共享映射空间。对共享区的写入,相当于输出到文件。直到msync()或者munmap()被调用,文件实际上不会被更新。 Linux的内存管理 回收过程 当我们回收页面11(order 0)时,则执行以下步骤: 1、找到在order(0)伙伴位图中代表页面11的位,计算使用下面公式: index = page_idx (order + 1) = 11 (0 + 1) = 5 //1011 1 = 0101 Linux的内存管理 2、检查上面一步计算位图中相应bit的值。若该bit值为1,则和我们临近的,有一个空闲伙伴。Bit5的值为1(注意是从bit0开始的,Bit5即为第6bit),因为它的伙伴页面10是空闲的。 3、现在我们重新设置该bit的值为0,因为此时两个伙伴(页面10和页面11)完全空闲。 4、我们将页面10,从order(0)空闲链表中摘除。 5、此时,我们对2个空闲页面(页面10和11,order(1))进行进一步操作。 Linux的内存管理 6、新的空闲页面是从页面10开始的,于是我们在order(1)的伙伴位图中找到它的索引,看是否有空闲的伙伴,以进一步进行合并操作。使用第一步中的计算公式,我们得到bit 2(第3位)(10102)。 7、Bit 2(order(1)位图)同样也是1,因为它的伙伴页面块(页面8和9)是空闲的。 8、重新设置bit2(order(1)位图)的值,然后在order(1)链表中删除该空闲页面块。 Linux的内存管理 9、现在我们合并成了4页面大小(从页面8开始)的空闲块,从而进入另外的级别。在order(2)中找到伙伴位图对应的bit值,是bit1(10003),且值为1,需进一步合并(原因同上)。 10、从order(2)链表中摘除空闲页面块(从页面12开始),进而将该页面块和前面合并得到的页面块进一步合并。现在我们得到从页面8开始,大小为8个页面的空闲页面块。 Linux的内存管理 11、进入另外一个级别,order(3)。它的位索引为0,它的值同样为0。这意味着对应的伙伴不是全部空闲的,所以没有再进一步合并的可能。我们仅设置该bit为1,然后将合并得到的空闲页面块放入order(3)空闲链表中。 12、最终我们得到大小为8个页面的空闲块: Linux的内存管理 Linux的内存管理 用户空间: (1)从静态存储区域(清零区)分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 (2)在栈上创建(向低地址增长)。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 Linux的内存管理 (3)从堆上分配,亦称动态内存分配(向高地址增长)。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由应用决定,使用非常灵活。 (4)程序代码区。用户空间的开始部分,只读,存放进程代码。 Linux的内存管理 动态申请的函数,在堆上分配。 mallco/free:不初始化,返回一个对象。 calloc/free:初始化为0,返回对象的数组。 realloc:对malloc申请的内存进行大小的调整。 alloca:在栈上申请内存。 void * memalign (size_t boundary, size_t size)申请较大的内存块,空间颗粒大些,boundary为2的幂。 valloc:分配的内存与页边界对齐。 void * valloc (size_t size) { return memalign (getpagesize (), size); } 关于各类分配函数,详见“内存分配函数.doc” 关于物理内存分配,详见“物理空间.doc”、“slab算法”等文档 Linux的内存管理 sbrk/brk:是增加数据段的大小。malloc/calloc/free基本上都是C函数库实现的,跟OS无关。C函数库内部通过一定的结构来保存当前有多少可用内存。如果程序malloc的大小超出了库里
文档评论(0)