内存锁定
锁定内存是实时应用程序的最重要问题之一。在实时环境中,进程必须能够保证连续的内存驻留,以减少延迟并阻止分页和交换。
本节介绍可用于 SunOS 中实时应用程序的内存锁定机制。
在 SunOS 中,进程的内存驻留由其当前状态、可用的总物理内存、活动进程的数量和进程的内存需求决定。此驻留适用于分时环境。实时进程通常不接受此驻留。在实时环境中,进程必须保证内存驻留以减少进程的内存访问和分发延迟。
SunOS 中的实时内存锁定由一组库例程提供。这些例程允许使用超级用户特权运行的进程将其虚拟地址空间的指定部分锁入物理内存。通过此方式锁定的页面会从分页中排除,直到页面解除锁定或进程退出。
操作系统对于可以在任何时间锁定的页面数量具有系统范围的限制。此限制是一个可调参数,其缺省值在引导时计算。缺省值基于页面框架的数量减去另一个百分比(当前设置为 10%)。
锁定页面
mlock(3C) 调用会请求将一个内存段锁入系统的物理内存。组成指定段的页面会出错。每个页面的锁定计数会递增。任何锁定计数值大于零的页面都会从分页活动中排除。
特定页面可以由多个进程通过不同的映射锁定多次。如果两个不同的进程锁定同一页面,则该页面将保持锁定状态直到两个进程都删除其锁定。但是,在一个指定的映射中,页面锁定不嵌套。相同进程对于相同地址的锁定接口的多次调用通过单个解除锁定请求即可删除。
如果删除通过其执行锁定的映射,则将隐式解除内存段锁定。通过关闭或截断文件删除页面时,也会隐式解除页面锁定。
调用 fork(2) 之后,子进程无法继承锁定。如果具有某些锁定内存的进程派生了子进程,则此子进程必须代表自己执行内存锁定操作才能锁定自己的页面。否则,此子进程会导致写复制页面错误,这些错误通常是与派生进程关联的不利结果。
解除页面锁定
为了解除内存页面的锁定,进程通过调用 munlock(3C) 请求释放锁定虚拟页面的段。munlock 会递减指定物理页面的锁定计数。将页面的锁定计数递减到 0 之后,页面便可正常交换。
锁定所有页面
超级用户进程可以通过调用 mlockall(3C) 请求锁定其地址空间内的所有映射。如果设置了 MCL_CURRENT 标志,则锁定现有的所有内存映射。如果设置了 MCL_FUTURE 标志,则将添加到现有映射或替换现有映射的所有映射锁入内存。
恢复粘滞锁
页面在其锁定计数达到 65535 (0xFFFF) 时会永久锁入内存。值 0xFFFF 通过实施定义。在将来的发行版本中,该值可能会更改。以此方式锁定的页面无法解除锁定。重新引导要恢复的系统。