什么是分页?
无论你的NT服务器的内存有多大,它总是显得不够充足。当物理RAM从低端开始运行时,Windows NT使用了分页文件Pagefile.sys。
为了运行不同的进程和应用程序,Pagefile.sys给物理内存分配了一些空间。在这些空间内允许交换数据页。
分段?
程序分段的好处。
cpu中的段寄存器中保存了段址(base)和偏移值的上限(limit)。段址:有效地址 中,如果有效地址大于limit,便会引发异常。
这样就可以限制程序不能范围当前段外的数据,不能访问其他程序的数据。总之就是不能访问它不能访问的数据。
面向对象的好处。
对象就是一块连续的内存中的数据吧。这点跟上面一点类似。通过限制访问,就做到了private的效果吧。
分段与分页:
(1)内存分段和内存分页一样都是一种内存管理技术,分段是为了权限保护,分页是为了虚拟内存.
(2)分段后,程序员可以定义自己的段,各段有独立的地址空间,象进程的地址空间互相独立一样.
(3)同一个类的实例分配在一个段中,只有该类的方法可以访问,如果其他类的方法去访问,会因为段保护而出错.可以从硬件上实现类的数据保护和隐藏
什么是缺页?
为什么会出现缺页?你的问题中已经有了答案。物理内存和系统“提供”给用户的内存的不对称性。是不是很容易就出现缺页的情况?像windows nt这样的系统,
每个进程拥有4G的虚存,记住,是每个进程。其中3-4G影射为操作系统的核心,是只读的,1-2G映射为用户空间,其中一部分是系统提供的动态链接库。
对于每一个进程,操作系统只向物理内存映射少数的地址,这是因为 RAM 实在是太宝贵、太稀缺了。进程的剩下的内存实际上都保存在二级存储器
(通常是硬盘)上。这就是为什么要叫虚拟内存的原因。没有映射到物理 RAM 的地址都被做上了标记。只要进程一访问这样的地址,操作系统就将数据从
二级存储器上取回到内存。若操作系统把物理 RAM 用光了,它就把一些数据换出来腾出空间。之后我们还可以把这些数据取回,因为它们都保存在在二级存储器上。
那些数据被换出是由替换策略决定的。Windows NT 使用先进先出(First-In-First-Out,FIFO)的策略。根据这个策略,当空间不够时,最老的数据
(即最先取进内存的数据)被换出。缺页的频率取决于你系统的实际内存的大小和系统的进程数目等因素。例如同时跑着几千个进程的网络服务器,缺页肯定
是非常频繁的。
什么是分页
分页是操作系统中的内存管理机制。通过这种方式计算机可以为主存存取其他存储介质上的数据。在页存储管理机制中,OS从其他介质中得到相同大小的数据块,
这种块即为页。
为什么分页
分页的蛀牙作用是可以让连续的地址空间存储在不连续的介质中。若不分页,操作系统需要把整个程序放到物理主存中连续的位置上,这会带来很多存储和碎片问题。分页是现代通用操作系统虚拟存储实现中的重要部分。它可以让OS使用磁盘存储RAM放不下的数据。
Linux中的分页
Linux使用swap描述在RAM和硬盘之间移动页,以及磁盘上用来存储页的区域。通常,使用一个磁盘分区做swap。2.6的内核已经支持直接 使用文件来做swap。内核负责维护swap文件的位置,并直接访问硬盘。当有多个可供swap的磁盘空间时,Linux还支持优先级。当OS需要把某些 内存页面swap时,会选择高优先级的设备。
性能问题因为磁盘访问的延时比直接访问内存要高3到4个数量级。所以频繁的使用swap将大大降低性能。Linux提供了一个/proc/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
#include <unistd.h>
#include "stdio.h"
main()
{
printf("page size = %d\n",getpagesize());
}
http://www.cublog.cn/u3/102979/showart_2195943.html