linux内核——进程通信

来源:互联网 发布:ecshop源码研读分析 编辑:程序博客网 时间:2024/06/06 07:43

unix系统提供的进程通信的基本机制:

管道和FIFO:最适合在进程之间实现生产者和消费者的交互。有些进程想管道中写数据,而另外一些进程从管道中读数据。

信号量:资源控制的一种方式

消息:允许进程在预定义消息队列中读和写来交换消息。Linux内核提供两种不同的消息版本System V IPC 消息和POSIX消息一节。

共享内存区:允许进程通过共享内存来交换信息,在必须共享大量数据的时候,这可能是最有效的进程通信方式。

套接字:允许不同计算机上的进程通过网络交换数据

管道是所有unix都愿意提供的一种进程通信机制。管道是进程之间的一个单向数据流:一个进程写入管道的所有数据都由内核定向到另一个进程,另一个进程由此就可以从管道中读取数据。

管道被看做是打开的文件,但在已安装的文件系统中没有相应的映像。可以使用pipe()系统调用创建一个新管道,这个系统调用返回一堆文件描述符,然后进程通过调用fork()把这两个描述符传递给他的子进程,因此与子进程共享管道。进程可以在read()调用中使用第一个文件描述符从管道中读取数据,同样也可以在write()系统调用中使用第二个文件描述符写入数据。

虽然管道是一种十分简单、灵活、有效的通信机制但是他们有一个共同的缺点,也就是无法打开已经存在的管道,这就使得任意两个进程不可能共享同一个管道,除非管道由一个共同的祖先进程创建。为了打破这种限制,unix系统引入了一种称为命名管道或者FIFO:最先写入文件的字节总是被最先读出,它在文件系统中不拥有磁盘快,打开的FIFO总是与一个内核缓冲区相关联的,这一缓冲区临时存放两个或多个进程之间交换的数据。FIFO是一种双向的管道。

System V IPC:IPC是进程通信的缩写,通常指用户态进程执行下列操作的一组机制:

  • 通过信号与其他进程同步
  • 向其他进程发送消息或者从其他进程接收消息
  • 和其他进程共享内存区

IPC数据结构是在进程请求IPC资源时动态创建的。每个IPC资源都是持久的:除非被进程显示的释放,否则永远驻留在内存中。IPC资源可以由任一进程使用,包括那些不共享祖先进程所创建的资源的进程。

IPC信号量与内核信号量相比更复杂:

每个IPC信号量都是一个或者多个信号量值得集合,而不像内核信号量一样只有一个值,这意味着同一个ipc资源可以保护多个独立共享的数据结构。

System V IPC信号量提供了一种失效安全机制,这是用于进程不能取消以前对信号量执行的操作就死亡的情况。

IPC消息:进程彼此之间可以通过IPC消息进行通信,进程产生的每条消息都放到IPC消息队列中,知道另一个进程读走为止。

IPC共享内存:这种机制允许两个或多个进程通过把公共结构放入一个共享内存区来访问它们。

posix消息队列:posix标准基于消息队列定义了一个ipc机制,就是大家都知道的posix消息队列。很想IPC消息队列,但是POSIX消息队列比老的队列具有许多优点:

  1. 更简单的基于文件的应用接口
  2. 完全支持消息优先级
  3. 完全支持到达的异步通知,这通过信号或线程实现
  4. 用于阻塞发送与接收操作的演示机制
原创粉丝点击