Solaris平台IPC及系统限制简介(二)



引言

POSIX IPC总览

POSIX IPC

mmapPOSIX Shared Memory

POSIX Semaphore

POSIX Message Queue

References

引言

前面介绍了管道和System V IPC,这一部分介绍一下POSIX IPCSolaris平台同时支持这两种IPC。由于POSIX IPC没有可调整的内核参数,这里主要介绍POSIX IPCSystem V IPC的异同点。



POSIX IPC总览



由于Unix版本的多样性,电子电气工程协会(IEEE)开 发了一个独立的Unix标准,这个新的ANSI Unix标准被称为计算机环境的可移植性操作系统界面(PSOIX)。现有大部分Unix和流行版本都是遵循POSIX标准POSIX IPC包括:POSIX Messge Queue(POSIX消息队列)POSIX Semaphore(POSIX信号灯)POSIX Shared Memory(POSIX共享内存区)



总的来说POSIX IPC可以实现与System V IPC相同的功能。比如POSIX的三种类型,以及同样可以完成共享数据,传递消息和同步操作等等。但具体实现与System V不同。我们从以下几个方面简单介绍一下。


POSIX IPC

1.mmapPOSIX Shared Memory(POSIX 共享内存)

通过函数mmap,把文件或者名字对象(并不真正存在于文件系统中的“文件”)映射到一个进程的地址空间,各进程利用这个地址空间可以实现共享数据。

API

API #include <sys/mman.h>

void *mmap(void *addr,size_t len,int prot,int flags,int fd,off_t offset);

特点



下面这张图清晰的显示了进程使用mmap把磁盘上的文件映射到地址空间的过程。





2.POSIX Semaphore

POSIX Semaphore分为Named Semaphore(有名信号量)Unnamed Semaphore(无名信号量)两种。有名信号量基于文件系统实现,无名信号量基于内存实现。利用POSIX Semaphore,同样可以实现对共享资源访问的同步控制。

API



特点


上图是POSIX Semaphore建立后在内核空间中的数据结构图。整个链表为信号量集,其中各节点为信号集中的信号量。


系统限制

虽然POSIX IPC不能更改系统允许IPC使用的资源额度,但是我们可以通过命令行得到当前系统的资源限制。以下两个系统范围的宏定义限制了进程的信号量使用上限:

通过命令行可以得到它们值。比如: $getconf -a|grep SEM

3.POSIX Message Queue(POSIX 消息队列)

特点

下面这张图表示了POSIX Message Queue在内核中的结构。与System V IPC不同的是,在POSIX Message Queue上的每个消息节点的数据结构中有一个成员记录了消息的优先级。也就是说,进程可以按照优先级有选择的读取队列中的数据。另外,各消息节点中还存在一个信号变量,当这个消息被放置到队列中的时候会发送信号通知相关进程接收消息。








系统限制

以下系统范围内的宏定义决定了在Solaris10POSIX Message Queue使用的资源上限。

可以同样通过命令对数值进行观察

$ getconf -a |grep MQ



References

Solaris Internalcore kernel component

Unix Network Programming, Volume II

Solaris Tunable Parameters Reference Manual

Solaris Dynamic Tracing Guide

Solaris Modular Debugger Guide