IPC
IPC(运行在某个操作系统上的不同进程间的各种消息传递)进程间通信是UNIX域一个杂乱不堪的领域,虽然有各种各样的解决办法,但没有一个是完美的。我们主要讨论四个领域
(1)消息传递(管道、FIFO、消息队列)
(2)同步(互斥锁、条件变量、读写锁、信号量)
(3)共享内存区(匿名共享内存区、有名共享内存区)
(4)过程调用(Solaris门、SunRPC)
UNIX编程模型,我们在一个系统上运行多个进程,每个进程都有各自的地址空间。UNIX进程间的信息共享可以有多种方式。我们讲述的技术适用于任意数目的进程。
(1)共享存留于文件系统中某个文件上的某些信息。为访问这些信息每个进程都得穿越内核。当一个文件有待更新时某种形式的同步是必要的,这样既可以保护多个写入者防止相互串扰也可以保护一个或多个读出者方式写入者的干扰。
(2)共享存储于内核中的某些信息。管道就是这样一个例子。现在访问共享信息的每次操作涉及对内核的一次系统调用,
(3)两个进程有一个双方都能访问的共享内存区。每个进程一旦设置好该共享内存区就可以不涉及内核而访问其中的数据,共享该内存区的进程需要某种形式的同步
一个进程内的所有线程共享同样的全局变量。同步尽管不是一种明确的IPC但是他伴随很多形式的IPC使用以控制对某些共享数据的访问。
进程间的IPC和线程间的IPC
我们假设一个线程环境,并做如下陈述:“如果管道为空,那么调用线程将阻塞在他的read调用上,知道某个线程将往该管道写入数据”。如果你的系统不支持线程你可以将线程转换为进程。从而提供阻塞在对空管道的read调用上的经典UNIX定义。然而在支持线程的系统上只有对空管道调用read的那个线程阻塞,同一进程内的其余线程可以继续执行。向该空管道写数据的工作可以由同一进程中的另一个线程去做也可以由另一个进程中的另某个线程去做。
IPC对象的持续性
IPC对象的持续性是指该类型的一个对象一直存在多长时间
(1)随进程的持续性:IPC一直存在到打开着该对象的最后一个进程关闭该对象为止。 例如管道和FIFO
(2)随内核持续性。IPC一直存在到内核重新关机或者显式删除该对象为止,例如SystemV消息队列、信号量和共享内存区都属于此类对象Posix消息队列、信号量和共享内存区必须至少是随内核持续的,但也可以是随文件系统持续的,具体取决于实现。
(3)随文件系统持续性:IPC对象一直存在到显式删除该对象为止,即使内核重新自举了该对象还是保持其值。Posix消息队列、信号量和共享内存区如果使用映射文件实现的那么他们就是随文件系统持续的。不过随文件系统持续性的IPC几乎不存在。
名字空间
当两个或者多个无亲缘关系的进程使用某种形式的IPC对象来彼此交换信息时,该IPC对象必须有一个某种形式的名字或者标识符。这样其中一个进程(往往是服务器)可以创建该IPC对象,其余进程则可以指定同一个IPC对象。
对于一种给定的IPC类型,其可能的名字的集合称为他的名字空间。名字空间是使用IPC对象的进程和线程标识各个IPC对象的方式。典型做法是:服务器以某个名字创建一个IPC对象,客户则使用该名字来访问同一个IPC对象。