Linux进程-2.进程间通信概述

来源:互联网 发布:畅捷通软件 编辑:程序博客网 时间:2024/05/29 13:28

1.进程间通信概述

我们知道,每个进程各自有不同的地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据
必须通过内核。在内核中开辟一块缓冲区,进程1把数据从用户空间拷贝到缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这
中机制称为进程间通信(IPC)。本篇文章只介绍其定义,下面回有专门章节进行详细介绍。

2.进程间通信方式

(1)管道(pipe)和有名管道(FIFO)
(2)信号(signal)
(3)消息队列
(4)共享内存
(5)信号量
(6)套接字(socket)

3.管道

(1)管道概述
管道和有名管道是一种最基本的IPC机制,管道可用于具有亲缘关系的进程间通信,有名管道克服了管道没有名字的限制,
因此,除具有管道的功能外,它还允许无亲缘关系的进程间通信。
(2)pipe管道
管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一
起。写进程在管道的尾端写入数据,读进程在管道的头端读出数据。管道提供简单的流控制机制,当进程试图读空管道时,在有数据
写入管道前,进程将一直阻塞。同样,当管道写满时,进程再试图写管道,在其它进程从管道中读取之前,写进程将一直
阻塞。通常,一种是办双工,只能单向传输;二是只能在父子进程间使用。
(3)PIPE有名管道
有名管道,与管道不同,FIFO不是临时的对象,它们是文件系统中真正的实体,可以用mkfifo命令创建。只要有访问权限,
进程就可以使用FIFO。FIFO的打开方式和管道稍微不同。一个管道是一次性创建的,而有名管道已经存在,可以由它的用户打开和
关闭。Linux必须处理在写进程打开FIFO之前读进程对它的打开,也必须处理在写进程写数据之前读进程对管道的读。除此之外,FIFO
几乎和管道的处理完全一样,而且它们使用一样的数据结构和操作。

4.信号

信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发
送信号给进程本身;Linux除了支持Unix早期信号语义函数signal外,还支持语义复合Posix1标准信号函数sigaction。信号是在软件层次
上对中断机制的一种模拟,是一种异步通信方式。
信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了那些系统事件。它
可以在任何时候发给某一进程,而无需知道该进程的状态。
如果该进程当前未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它;如果一个信号被进程设置
为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。

5.消息队列

消息队列就是消息的链表。可以把消息看做一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以
想队列中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。目前主要有两种消息队列:POSIX
消息队列以及系统V消息队列。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

6.共享内存

共享内存是进程间通信中比较简单的方式之一。共享内存允许多个进程访问同一块内存。因为所有进程共享一块内存,共享
内存在各种进程间通信方式中具有最高的效率。访问共享内存区域和访问进程独有的内存区域一样快。并不需要通过系统调用或者
需要切入内核的过程来完成。同时它也避免了对数据的各种不必要的复制。



7.信号量
为了防止出现因为多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成令牌并使用
令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式的执行。
而信号量就可以提供这样一种访问机制,让一个临界区同一事件只有一个线程在访问它,也就是说信号量是用来协调进程对共享
资源的访问的。
信号量是一种特殊的变量,程序对其进程的操作都是原子操作,且只允许对它进程等待和发送信息操作。最简单的信号量
只能取0和1的变量,这也是最常见的一种形式,也叫做二进制信号量。而可以取多个正整数的信号量被称为通用信号量。
8.套接字
网络部分进行详解介绍
原创粉丝点击