1.进程间通信工具的分类
一些复杂的应用程序可能会需要多个进程分工协作来满足所需的功能需求,这就必然涉及到数据在进程之间的共享或交换,称为IPC(Inter-process communication,进程间通信)。
UNIX提供了许多工具(facilities)用于实现进程间通信,这些工具可以分为三类:
通信(Communication):用于进程间交换数据。
同步(Synchronization):同步进程(或线程)之间的动作(actions)。信号(Signals):既可以用于同步,也可以用于通信(很少使用)。
共享内存(Shared memory)
多个进程可以通过把数据放置在各进程可以共享的区域以实现信息的交换。
大多数现代UNIX系统都提供三种共享内存的方式:System V shared memory、POSIX shared memory以及memory mappings
2.数据传输工具的分类
数据传输工具(data-transfer facilities)可以进一步分为:
字节流(Byte stream)
可以通过pipes、FIFOs以及stream sockets进行数据交换。每个读操作可以读取任意数量的字节。
消息(Message)
可以通过System V message queues、POSIX message
queues以及datagram sockets进行数据交换。每个读操作读取一条消息。
(1)对于数据传输工具来说,一个进程一次读操作将消耗数据,即读完之后,数据对于其它进程的读操作不可用。而放置在共享内存中的数据对于所有的进程均可见。
(2)对于数据传输工具来说,读进程和写进程之间的同步自动完成。而共享内存需要程序员实现同步操作。
3.UNIX同步工具
信号量(Semaphores)、
信号量是一个内核维护的整数,其值不允许小于0。一个进程可以减小或增加信号量的值。
一个进程减小信号量的值(例如1→0)以实现对共享资源的互斥访问;当完成对资源的操作后,增加信号量的值使得共享资源可以被其它进程使用。
Linux支持System V semaphores和POSIX semaphores。
文件锁(File locks)
主要用于同步多个进程对同一个文件的操作,也可以用于同步多个进程对共享资源的访问。
文件锁又分为read (shared) locks和write (exclusive) locks。任意数目的进程可以拥有对相同文件的读锁,而当一个进程对文件拥有写锁后,其它进程不允许再拥有读锁或写锁。