进程间通信ipc、线程间通信

进程间通信(IPC,Inter-Process Communication)指至少两个进程或线程间传送数据或信号的一些技术或方法。

进程是计算机系统分配资源的最小单位(严格说来是线程)。每个进程都有自己的一部分独立的系统资源,彼此是隔离的。为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信。(但是采用了某种形式的内核开销,降低了性能)。

常用的进程间通信

管道(包括无名管道和命名管道)

管道是一种通信机制,通常用于进程间的通信(也可通过socket进行网络通信),它表现出来的形式将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)
无名管道,是UNIX系统IPC最古老的形式。基于管道文件操作。
管道通信特点是:速度慢,容量有限,只有父子进程能通讯(FIFO:任何进程间都能通讯,但速度慢)。

消息队列

是消息的链接表,存放在内核中。特点是容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题

信号量

与已经介绍过的IPC结构不同,它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。
特点是不能传递复杂消息,只能用来同步。

共享内存

指两个或多个进程共享一个给定的存储区。是最快的一种IPC,因为进程是直接对内存进行存取。信号量和共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。
特点是能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存。

socket

socket一般指套接字。所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。
特点是I/O复用提供一种能力,这种能力使得当一个I/O条件满足时,进程能够及时得到这个信息。适合(远程过程调用、集群)。

几种线程间的通信机制

变量

同一进程下的线程共享全局变量、静态变量等数据。线程之间的通信更方便。

锁机制

  • 互斥锁:提供了以排它方式阻止数据结构被并发修改的方法。
  • 读写锁:允许多个线程同时读共享数据,而对写操作互斥。
  • 条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。线程间通信的主要目的是用于线程同步,所以线程没有象进程通信中用于数据交换的通信机制。

A los tontos no les dura el dinero.