什么是分页
分页是操作系统中的内存管理机制。通过这种方式计算机可以为主存存取其他存储介质上的数据。在页存储管理机制中,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,设置页大小。
参考:
- http://en.wikipedia.org/wiki/Paging
- http://kerneltrap.org/node/3000
- http://zhidao.baidu.com/question/38394944
- http://oreilly.com/catalog/spt2/chapter/ch04.html

好像x86体系结构支持4kb或者4kb大小的页大小。不过好像几乎所有的系统都无视了4mb这个选项…
触发Page Fault除了缺页也有可能是因为只读, 因此linux得以利用Page Fault机制实现的写时复制和请求调页。记得understanding linux kernel书里有个流程图,相当的绕 :(
谢谢纠正,写这篇文章的时候手边没有ULK,发了之后,翻看了一下。正如你所说。呵呵。
刚刚看你的博客,发现你是90后。佩服,加油!