第4章内存管理.ppt

  1. 1、本文档共51页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
一般来说,页故障的原因可能是因为进程访问了非法的虚拟地址,也可能是因为进程要访问的物理地址当前不在物理内存中,这时,操作系统负责将所需的内存页装入物理内存。 上面就是虚拟内存的抽象模型,但 Linux 中的虚拟内存机制要更复杂一些。从性能的角度考虑,如果内核本身也需要进行分页,并要为内核代码和数据页维护一个页表的话,则系统的性能会下降很多。为此,Linux 的内核运行在所谓的“物理地址模式”,CPU 不必在这种模式下进行地址转换,物理地址模式的实现和实际的 CPU 类型有关。 4.3 Linux 的内存页表 在 i386 系统中,虚拟地址空间的大小是 4G,因此,全部的虚拟内存空间划分为 1M 页。如果用一个页表描述这种映射关系,那么这一映射表就要有 1M 个表项,当每个表项占用 4 个字节时,全部表项占用的字节数就为 4M,为了避免占用如此巨大的内存资源来存储页表,i386 系列 CPU 采用两级页表,Alpha AXP 系统使用三级页表。Linux 为了避免硬件的不同细节影响内核的实施,假定有三级页表。如图 4.3 所示,一个虚拟地址可分为多个域,不同域的数据指出了对应级别页表中的偏移量。为了将一个虚拟地址转换为物理地址,处理器根据这三个级别域,每次将一个级别域中 的值转换为对应页表的物理页偏移量,然后从中获得下一级页表的页帧编号。如此进行3次,就可以找出虚拟内存对应的实际物理内存。不同 CPU 的页级数目不同,Linux 内核源代码则利用 C 语言的宏将具体的硬件差别隐藏了起来。例如,对 i386 的 Linux 内核代码来说,三级的页表转换宏实际只有两个在起作用。 4.3.1内存页的分配和释放 系统运行过程中,经常需要进行物理内存页的分配或释放。例如,执行程序时,操作系统需要为相应的进程分配页,而进程终止时,则要释放这些物理页。再如,页表本身也需要动态分配和释放。物理页的分配和释放机制及其相关数据结构是虚拟内存子系统的关键部分。 图 4.4多级页表示意图 一般而言,有两种方法可用来管理内存的分配和释放。一种是采用位图,另外一种是采用链表。 利用位图可记录内存单元的使用情况。例如,如果某个系统有 1024 字节内存,而内存的分配单元是 4 字节,则可以利用 1024/(4*8) = 32 个字节来记录使用情 况。这 32 个字节的每个位分别代表相应分配单元的使用情况。如果位图中某个位为 1,则对应的分配单元是空闲的。利用这一办法,内存的分配就可以通过对位值的检测来简化。如果一次要分配 5 个单元的空间,内存管理程序就需要找出 5 个连续位值均为 1 的位图位置,但这种操作比较慢,因为连续的位有时要跨越字节边界。 利用链表则可以分别记录已分配的内存单元和空闲的内存单元。通常这些内存单元设计为双向链表结构,从而可加速空闲内存的搜索或链表的处理。这种方法相对位图方法要好一些,也更加有效。 Linux 的物理页分配采用链表和位图结合的方法,如图 4.4所示。Linux 内核定义了一个称为 free_area 的数组,该数组的每一项描述某一种页块的信息。第一个元素描述单个页的信息,第二个元素则描述以 2 个页为一个块的页块信息,第三个元素描述以 4 个页为一个块的页块信息,依此类推,所描述的页块大 小描述以 4 个页为一个块的页块信息,依此类推,所描述的页块大小以 2 的倍数增加。free_area 数组的每项包含两个元素:list 和 map。list 是一个双向链表的头指针,该双向链表的每个节点包含空闲页块的起始物理页帧编号;而 map 则是记录这种页块组分配情况的位图,例如,位图的第 N 位为 1,则表明第 N 个页块是空闲的。从图中也可以看到,用来记录页块组分配情况的位图大小各不相同,显然页块越小,位图越大。 图 4.5 中,free_area 数组的元素 0包含了一个空闲页(页帧编号为 0);而元素 2 则包含了两个以 4 页为大小的空闲页块,第一个页块的起始页帧编号为 4,而另一个页块的起始页帧编号为 56。 图 4.5 Linux 物理页块的分配示意 Linux 采用 Buddy 算法有效分配和释放物理页块。按照上述数据结构,Linux 可以分配的内存大小只能是 1 个页块,2 个页块或 4 个页块等等。在分配物理页块时,Linux 首先在 free_area 数组中搜索大于或等于要求尺寸的最小页块信息,然后在对应的 list 双向链表中寻找空闲页块,如果没有空闲页块,Linux 则继续搜索更大的页块信息,直到发现一个空闲的页块为止。如果搜索到的页块大于满足要求的最小页块,则只需将该页块剩余的部分划分为

文档评论(0)

xiaohuer + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档