System V共享内存详解
1. 资源映射(Resource Maps)
在进程间通信(IPC)的三种机制中,消息队列和信号量使用了一种名为资源映射的底层内核内存分配方案。资源映射是一种从预先分配的内核页面大池中分配和释放小内核内存单元的方法。
1.1 资源映射的使用原因
消息队列和信号量本质上是相对动态的。应用程序经常在队列上移入和移出消息,并且消息的大小可以从几字节到几千字节(或更多)不等。System V IPC支持信号量集的概念,并且每个集合中的信号量数量在执行期间可能会发生变化。因此,内核代码需要为新消息或信号量分配空间,并在消息被移除或信号量被删除时释放空间。由于这些对象存储在内核内存中,这种方法可能会导致频繁调用内核内存分配器。为了解决这个问题,预先分配一大块内存并使用轻量级接口来管理预先分配的空间是更合理的选择。资源映射就实现了这个功能,在Solaris中用于管理存储信号量和消息数据部分的内核空间。
1.2 资源映射的分配参数
IPC设施的资源映射分配空间由内核可调参数决定,消息队列和信号量各有一个参数。semmap参数(默认值为10)和msgmap参数(默认值为100)可以根据应用程序的需求在/etc/system文件中进行调整。将这些值设置得更大将导致预先分配更多的内核内存。每个设施使用自己的资源映射,这意味着为信号量分配的资源映射空间不能被消息队列使用,反之亦然。而共享内存不使用资源映射,共享内存段是进程地址空间的一部分,只有shdmid_ds结构在内核中,这些结构的空间根据