Linux内存管理中的分页

什么是分页

分页是操作系统中的内存管理机制。通过这种方式计算机可以为主存存取其他存储介质上的数据。在页存储管理机制中,OS从其他介质中得到相同大小的数据块,这种块即为页。

为什么分页

分页的蛀牙作用是可以让连续的地址空间存储在不连续的介质中。若不分页,操作系统需要把整个程序放到物理主存中连续的位置上,这会带来很多存储和碎片问题。分页是现代通用操作系统虚拟存储实现中的重要部分。它可以让OS使用磁盘存储RAM放不下的数据。

Linux中的分页

Linux使用swap描述在RAM和硬盘之间移动页,以及磁盘上用来存储页的区域。通常,使用一个磁盘分区做swap。2.6的内核已经支持直接使用文件来做swap。内核负责维护swap文件的位置,并直接访问硬盘。当有多个可供swap的磁盘空间时,Linux还支持优先级。当OS需要把某些内存页面swap时,会选择高优先级的设备。

性能问题

因为磁盘访问的延时比直接访问内存要高3到4个数量级。所以频繁的使用swap将大大降低性能。Linux提供了一个/prox/sys/vm/swappiness参数,可以通过它调整swap策略。

只需要简单的echo 0-100中的一个数值到这个文件中即可。值越大,系统swap到硬盘的越多。本博的笔记本默认是60。网上看到一个2.6内核维护者,将它设置成100。给出的理由:“我的观点是降低kernel swap出内存数据不对。你实际上不想让几百兆的内存在自己的机器内存中呆着,但从未被访问。所以把这些数据请到磁盘上,留出更多的主存给要用的程序”.

Page Fault

32位系统中,每个进程拥有的最大内存空间是4G,也整个操作系统能够识别的最大内存空间也是4G(除非使用high memory support)。因此Linux系统中程序访问某些页时,很可能这些页不在RAM中,如何找到这个页,并读取之,是分页系统的首要问题,即页缺失问题,Page fault。 操作系统接收到页缺失信号后,首先确定缺失的数据在硬盘中的位置,在RAM中获得一个空白页,以便存储数据,把需要的数据从硬盘装载到RAM内的页面中。更新页表,把控制权返回给程序,让程序可以重试导致页缺失的指令。内核所作的这一系列工作对程序都是透明的。

页大小

每个页能存储的数据多少,不同的系统会有不同。可以写个小程序判断页大小(如何得到当前linux系统的页大小)。页容量大,页缺失就少,减少不必要的内核动作。但这也有坏处,因为系统只能在一个页内通过分段来访问主存。若页太大,内存可用的页少,则势必浪费存储空间。通常的页大小为4KB-8KB.你可以通过修改内核头文件asm/param.h的EXEC_PAGESIZE,设置页大小。

参考:

相关文章:

This entry was posted in 内存管理, 操作系统 and tagged , , , . Bookmark the permalink.

2 Responses to Linux内存管理中的分页

  1. Fleurer says:

    好像x86体系结构支持4kb或者4kb大小的页大小。不过好像几乎所有的系统都无视了4mb这个选项…

    触发Page Fault除了缺页也有可能是因为只读, 因此linux得以利用Page Fault机制实现的写时复制和请求调页。记得understanding linux kernel书里有个流程图,相当的绕 :(

    • erlv says:

      谢谢纠正,写这篇文章的时候手边没有ULK,发了之后,翻看了一下。正如你所说。呵呵。
      刚刚看你的博客,发现你是90后。佩服,加油!

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>