编程接口指南

内存管理接口

应用程序通过多组接口使用虚拟内存功能。本节概述了这些接口,另外还提供了接口用法的示例。

创建和使用映射

mmap(2) 可用于建立指定的文件系统对象到进程地址空间的映射。指定的文件系统对象也可部分映射到进程地址空间中。此基本内存管理接口非常简单。请使用 open(2) 打开文件,接着使用 mmap(2) 创建具有适当访问权限和共享选项的映射,随后再继续执行应用程序。

mmap(2) 所建立的映射可针对指定的地址范围替换先前所有的映射。

标志 MAP_SHAREDMAP_PRIVATE 可指定映射的类型。必须指定一种映射类型。如果设置了 MAP_SHARED 标志,则写入操作会修改映射对象。无需对对象进一步执行任何操作即可进行更改。如果设置了 MAP_PRIVATE 标志,则首次对映射区域进行写入操作将创建一个页面副本。所有进一步的写入操作都会引用该副本。只有修改了的页面会被复制。

映射类型可以跨 fork(2) 保留。

通过 mmap(2) 建立映射之后,将不再使用调用中所用的文件描述符。如果关闭文件,则映射在 munmap(2) 将其撤消之前会一直保留。创建新映射可以替换现有映射。

通过 truncate 调用可以截短映射文件。尝试访问不再存在的文件区域会导致产生 SIGBUS 信号。

映射 /dev/zero 可为调用程序提供零填充的虚拟内存块。块的大小在调用 mmap(2) 时指定。以下代码段说明了如何使用此技术在程序中创建零填充的存储块。块的地址由系统选择。

removed to fr.ch4/pl1.create.mapping.c

某些设备或文件仅当通过映射对其进行访问时才有用。用于支持位图显示的帧缓冲区设备便是此现象的一个示例。显示管理算法直接对显示地址执行操作时,实现这些算法会简单得多。

删除映射

munmap(2) 可用于删除调用进程的指定地址范围内的所有页面映射。munmap(2) 对已映射的对象没有任何影响。

高速缓存控制

SunOS 中的虚拟内存系统是一个高速缓存系统,处理器内存可在其中缓冲文件系统对象中的数据。系统提供了一些接口,用于控制或询问高速缓存的状态。

使用 mincore

mincore(2) 接口可确定内存页是否驻留在指定范围内的映射所涵盖的地址空间中。由于页面状态可能会在 mincore 检查页面之后和 mincore 返回数据之前发生更改,因此返回的信息可能会过时。只能保证将锁定的页面保留在内存中。

使用 mlockmunlock

mlock(3C) 会导致将指定地址范围内的页面锁定在物理内存中。在此进程或其他进程中引用锁定的页面不会导致需要 I/O 操作的页面错误。由于此 I/O 操作会干扰虚拟内存的正常操作,并且会降低其他进程的速度,因此仅有超级用户才能使用 mlock。内存中可锁定页数的限制取决于系统配置。如果超过此限制,则调用 mlock 将失败。

munlock 可用于释放对物理页的锁定。如果对单个映射的地址范围进行多次 mlock 调用,则一次 munlock 调用即可释放锁定。不过,如果 mlock 锁定了对相同页面的不同映射,则在释放对所有映射的锁定之前,不会解除对这些页面的锁定。

删除映射也会释放锁定,方法有两种:使用 mmap(2) 操作替换或者通过 munmap(2) 删除。

MAP_PRIVATE 映射关联的写复制事件会将对源页面的锁定传递到目标页面。这样,对包括 MAP_PRIVATE 映射的地址范围的锁定便会以透明方式与写复制重定向操作一起保留。有关此重定向操作的介绍,请参见创建和使用映射

使用 mlockallmunlockall

mlockall(3C)munlockall(3C)mlockmunlock 类似,但是 mlockallmunlockall 针对整个地址空间执行操作。mlockall 用于设置对地址空间中所有页面的锁定,munlockall 用于删除对该地址空间中所有页面的锁定,无论是通过 mlock 还是 mlockall 建立操作均如此。

使用 msync

msync(3C) 会导致指定地址范围内的所有已修改的页面都刷新到这些地址所映射的对象。此命令与 fsync(3C) 类似,后者对文件执行操作。