操作系统——进程通信(IPC)
操作系统——进程通信(IPC)方式
参考:https://www.cnblogs.com/xiaobaizzz/p/12285577.html
参考:https://www.cnblogs.com/tsiangleo/p/4902695.html
进程通信:进程间的信息交换。
- 进程是分配系统资源的单位,因此各进程拥有的内存空间相互独立。
- 为了保证进程安全,一个进程不能直接访问另一个进程的地址空间。
- 为了保证进程间的安全通信,操作系统提供了一些方法。
按照发送路径来看,可分为直接通信和间接通信:

1、管道(匿名管道)(间接通信)
概念: 进程间基于内存文件的通信机制,指用于连接读写进程的一个共享文件,即 pipe 文件。其实就是在内存中开辟的一个大小固定的缓冲区。
如下图所示:

特点:
- ① 管道只能采用半双工通信,只能支持数据的单向传输。如果要实现双向同时通信,则需要建立两个管道。
- ② 各个进程之间要互斥访问管道。
- ③ 当管道写满时,写进程的 write() 系统调用将被阻塞,等待读进程将数据取走;管道变空时,读进程的 read() 系统调用将被阻塞。
- ④ 如果管道没写满,就不允许读;如果没读空,就不允许写。
- ⑤ 数据一旦读出,就从管道中被抛弃,这意味着读进程最多只能有一个,否则可能会发生读错数据的情况。(一个管道指父进程(或一个子进程)与某个特定子进程通信)
缺点: - 速度慢,容量有限,只有父子或兄弟进程能通信。
2、有名管道(FIFO)(间接通信)
概念: 同管道一样,不过它允许没有亲缘关系的进程间进行通信。
实现: 有名管道提供了一个路径名与之关联,以 FIFO 的形式存在于文件系统中。即使不相干的进程也可以通过FIFO相互通信,只要它们能访问已经提供的路径。
特点:
- ① 一种文件类型。
- ② FIFO 可以在无关进程之间交换数据。
- ③ FIFO 以一种特殊设备文件形式存在于文件系统中。
- ④ FIFO 的通信方式类似于在进程中使用文件来传输数据,只不过 FIFO 类型文件同时具有管道的特性。在读数据时,FIFO 管道中同时也清除数据,且先进先出。
3、信号量(Semophore)
概念: 一种计数器,用来控制进程间多个线程或者多个进程对资源的同步访问。
实现: 常实现为一种锁机制。(信号量是一个被保护的变量,且只能通过初始化和两个标准的原子操作(P/ V,又称wait(s), signal(s))来访问。)
4、信号(Signal)
概念: 进程间的软件中断通知和处理机制。操作系统通过信号来通知某一进程发生了某一种预定好的事件;接收到信号的进程可以选择不同的方式处理该信号:①采用默认处理机制——进程中断或退出,②忽略该信号,③自定义该信号的处理函数,执行相应的动作。
实现: 内核为进程生产信号,来响应不同的事件,这些事件就是信号源。信号源可以是:异常、其它进程、终端的终端(Ctrl+C,Ctrl+等)、作业的控制(前台,后台进程的管理等),分配额问题(CPU 超时或文件过大等)、内核通知(IO就绪等)、报警(计时器)。

5、消息队列(间接通信)
概念: 是消息的一个链表,存放在内核中,由操作系统维护的以字节序列为基本单位的通信机制。允许一个或多个进程向它写消息,一个或多个进程向它读消息。Linux 维护了一个消息队列向量表:msgque,来表示系统中所有的消息队列。
- 进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的==“发送/接收消息”==两个原语进行数据交换。
每个消息队列都有一个唯一的标识;只有共享了相同消息队列的进程,才能够通信,才建立连接,连接可以是单向或双向。消息队列可以与多个进程相关联;每对进程可以共享多个消息队列。

特点:
- ① 消息队列是面向记录的,其中的信息具有特定的格式以及特定的优先级。
- ② 消息队列独立于发送和接收进程,进程终止时,消息队列及其内容并不会被删除。
- ③ 消息队列可以实现消息的随机查询,消息不一定要以 FIFO 的次序读取,也可以按消息的类型读取。
6、共享内存(直接通信)
概念: 共享内存映射为一段可以被其它很多进程访问的内存。即把一段物理内存映射到多个进程的内存地址空间的通信机制。每个进程的内存地址空间需要明确设置共享内存段,同一个进程的线程共享地址空间。(速度快,但是没有同步)

特点:
- ① 共享内存是最快的一种 IPC,因为进程是直接对内存进行读取。
- ② 因为多个进程可以同时操作,所以需要进行同步操作。(共享空间的访问必须互斥,操作系统负责提供共享空间和同步互斥工具(如P、V操作))
- ③ 信号量+共享内存通常结合使用,信号量用来同步对共享内存的访问。
7、套接字(Socket)
概念: 用于实现不同主机间的进程通信。一个套接口可以看做是进程通信的端点,每个套接口的名字是唯一的;其它进程可以访问,连接和进行数据通信。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
