编程接口指南

内存锁定

锁定内存是实时应用程序存在的最重要的问题之一。在实时环境中,进程必须能够保证可连续驻留在内存中,以缩短延迟并防止换页和交换。

本节介绍可用于 SunOS 中实时应用程序的内存锁定机制。

在 SunOS 中,进程是否驻留在内存中由其当前状态、可用物理内存总量、活动进程数以及进程的内存需求确定。此驻留适用于分时环境,但实时进程通常不可接受此驻留。在实时环境中,进程必须保证可在内存中驻留,以缩短进程的内存访问和分发延迟。

SunOS 中的实时内存锁定是由一组库例程提供的。通过这些例程,使用超级用户权限运行的进程可以将其虚拟地址空间的指定部分锁定到物理内存中。采用此方式锁定的页面可免于进行换页,直到解除锁定这些页面或进程退出为止。

操作系统会限制在系统范围内可以随时锁定的页面数。此限制是一个可调参数,其缺省值在引导时计算得出。缺省值是基于页帧数减去另一个百分比(当前设置为 10%)得出的。

锁定页面

调用 mlock(3C) 会要求将一个内存段锁定到系统的物理内存中。构成指定段的页面为错误页面。每个页面的锁定计数将递增。锁定计数值大于零的任何页面均可免于进行换页活动。

特定页面可以由多个进程通过不同映射多次锁定。如果两个不同的进程锁定同一页面,则此页面会保持锁定状态,直到这两个进程都解除其锁定为止。但是,在给定的映射中,页面锁定不会进行嵌套。同一进程对地址相同的锁定接口进行的多次调用可以通过单个解除锁定请求删除。

如果删除了用于执行锁定的映射,则会隐式解除锁定内存段。通过关闭或截断文件来删除页面时,也会隐式解除锁定此页面。

调用 fork(2) 之后,子进程无法继承锁定。如果具有某些锁定内存的进程派生了子进程,则此子进程必须代表自己执行内存锁定操作才能锁定自己的页面。否则,此子进程会导致写复制页面错误,这些错误通常是与派生进程关联的不利结果。

解除锁定页面

要解除锁定内存页,进程可通过调用 munlock(3C) 请求释放锁定虚拟页面段。munlock 用于递减指定物理页面的锁定计数。将页面的锁定计数递减到 0 之后,通常会进行页面交换。

锁定所有页面

超级用户进程可以通过调用 mlockall(3C) 请求锁定其地址空间内的所有映射。如果设置了标志 MCL_CURRENT,则会锁定所有的现有内存映射。如果设置了标志 MCL_FUTURE,则会将每个添加到现有映射或替换现有映射的映射锁定到内存中。

恢复严格锁定

页面的锁定计数达到 65535 (0xFFFF) 时,此页面便会永久锁定到内存中。值 0xFFFF 通过实现定义。该值在将来的发行版中可能会更改。无法解除锁定通过此方式锁定的页面。请重新引导系统以进行恢复。