Solaris技术

星期二 八月 08, 2006

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

作者:Iris Zhu, Sun Microsystems, Inc

引言

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不同。我们从以下几个方面简单介绍一下。



    API

    函数库

    System V IPC函数库为libc.so,POSIX IPC函数库为libPOSIX4.soLibposix4.so函数库的路径为/usr/lib/libposix4.so。在Solaris10Bash环境中用GNU的编译工具gcc编译使用了POSIX IPC的程序,可以使用以下语句:

    $/usr/sfw/bin/gcc <Source> -lrt -o <binary>

    请通过man page获得详细的函数各接口信息。

    实现机制不同

    POSIX IPC使用了文件名称转换机制,利用在文件系统中实际存在或者不存在的文件名经过转换实现。Solaris中各种POSIX IPC方式的实现基于函数mmap(2)不同于System V IPC, POSIX IPC 函数接口保证了多线程处理时的安全性。另外,POSIX IPC的函数不需要进入内核空间执行。

    熟悉Unix内核代码的人会发现,POSIX IPC主要通过以下函数实现:

      _pos4obj _open/_pos4obj _name

      _open _nc/_close _nc _pos4obj _lock

      _pos4obj _unlock

    系统限制和内核参数

    POSIX没有可以调节系统限制的内核参数。只有有限的几个因素会影响POSIX IPC,比如每个进程允许打开的文件句柄数,内存空间大小等等。

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映射一块内存,然后各进程利用shm_open访问这块内存函数实现进程间通信。



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





2.POSIX Semaphore

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

API

  • Named Semaphore

    sem_open()/sem_close()/sem_unlink

  • Unnamed semaphore

    sem_init()/sem_destroy



特点


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


系统限制

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

  • SEM_NSEMS_MAX

    单个进程可以使用的最多信号灯数量

  • SEM_VALUE_MAX

    一个信号灯用于控制资源的最大数值

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

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

特点

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








系统限制

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

  • MQ_OPEN_MAX

    进程可使用消息队列的最大数值

  • MQ_PRIO_MAX

    可设置的消息优先级最大数值

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

$ 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

Comments:

Post a Comment:
Comments are closed for this entry.

Calendar

Feeds

Search

Links

Navigation

Referrers