Linux 实现了请求页面调度,页面调度是说页面从硬盘按需交换进来,当不再需要的时候交换出去。这样做允许系统中每个进程的虚拟地址空间和实际物理内存的总量再没有直接的联系,因为在硬盘上的交换空间能给进程一个物理内存几乎无限大的错觉。
交换对进程来说是透明的,应用程序一般都不需要关心(甚至不需要知道)内核页面调度的行为。然而,在下面两种情况下,应用程序可能像影响系统的页面调度:
确定性(Determinism)
时间约束严格的应用程序需要确定的行为。如果一些内存操作引起了页错误,导致昂贵的磁盘操作,应用程序的速度便不能达到要求,不能按时做计划中的操作。如果能确保需要的页面总在内存中且从不被交换进磁盘,应用程序就能保证内存操作不会导致页错误,提供一致的,可确定的程序行为,从而提供了效能。
安全性(Security)
如果内存中含有私人秘密,这秘密可能最终被页面调度以不加密的方式储存到硬盘上。
如果用户不希望某块内存在暂时不用时置换到磁盘上,可以对该内存进行内存锁定。
相关函数如下:
函数:mlock锁定一片内存区域,addr为内存地址,length要锁定的长度。
munlock接触已锁定的内存
mlockall一次锁定多个内存页。flag取值有两个MCL_CURRENT锁定所用内存页,MCL_FUTURE锁定为进程分配的地址空间内存页。munlockall用于解除锁定的内存。
注:只有超级用户才能进行锁定和解除内存操作。