进程间通信ipc、线程间通信
进程间通信(IPC,Inter-Process Communication)指至少两个进程或线程间传送数据或信号的一些技术或方法。
进程是计算机系统分配资源的最小单位(严格说来是线程)。每个进程都有自己的一部分独立的系统资源,彼此是隔离的。为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信。(但是采用了某种形式的内核开销,降低了性能)
进程间通信技术包括消息传递、同步、共享内存和远程过程调用(rpc)。
常用的进程间通信主要有以下5种:
管道(包括无名管道和命名管道)、消息队列、信号量、共享内存、Socket。
无名管道,是 UNIX 系统IPC最古老的形式。基于管道文件操作。
消息队列,是消息的链接表,存放在内核中。
信号量,与已经介绍过的 IPC 结构不同,它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。
共享内存,指两个或多个进程共享一个给定的存储区。是最快的一种 IPC,因为进程是直接对内存进行存取。信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。
socket,这个不用多说。
总结:
1.管道:速度慢,容量有限,只有父子进程能通讯(FIFO:任何进程间都能通讯,但速度慢)
2.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
3.信号量:不能传递复杂消息,只能用来同步
4.共享内存:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存
5.socket:I/O复用提供一种能力,这种能力使得当一个I/O条件满足时,进程能够及时得到这个信息。适合(远程过程调用、集群)
几种线程间的通信机制
1、锁机制
1.1 互斥锁:提供了以排它方式阻止数据结构被并发修改的方法。
1.2 读写锁:允许多个线程同时读共享数据,而对写操作互斥。
1.3 条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
2、信号量机制:包括无名线程信号量与有名线程信号量
3、信号机制:类似于进程间的信号处理。
线程间通信的主要目的是用于线程同步,所以线程没有象进程通信中用于数据交换的通信机制。
参考: