进程间通信(IPC)

12月24日 收藏 0 评论 3 测试开发

进程间通信(IPC)

转载声明:文章来源https://zhuanlan.zhihu.com/p/113379332

1.概述

进程之间要保证相对独立,一个进程不能随便访问另一个进程的地址空间,这是系统安全性的保证和需要。但实际上进程之间确实也要协作在一起去完成一项大的任务,这时就需要进程之间有一定的通知和数据传递。在保证进程之间相对独立的同时,也要保证进程之间合理有效的通信。

IPC facility 提供两个操作:send(message) receive(message)
进程A和B之间想通信,需要

1)在他们之间建立通信链路(如物理链路:共享内存,硬件总线;逻辑链路:逻辑属性);
2)通过send/receive交换消息。

进程间通信从通信路径上可分为直接通信和间接通信。
直接通信:进程A直接将信息发给B(不经过内核倒一次);
间接通信:进程A先把信息发给内核,内核再将信息发给B。

直接通信

为了能够实现有效正确的通信,首先需要知道进程将信息送到哪里去,或者进程从哪里接收数据,就需要 send(B,message) receive(A,message)
其次是链路的建立(发送接收数据之前,通常是双向的)。
链路的建立需要操作系统的支持,因为进程间通信实际上是打破了进程之间的隔离,没有操作系统的支持是无法完成的。

间接通信

对间接通信而言,发送进程需要将信息send到某个区域,这个区域是操作系统指定的在内核中的一个区域,接收方也是从这个区域recieve信息,都不关注这个信息是谁发的或者谁要接收,他们只需要知道把这个信息放到哪里或者在哪里取就可以了。

在这块内核区域内,维护着用于进程间通信的队列:每个消息队列都有一个唯一的ID,两个进程只有共享了一个消息队列才能通信。

操作:创建新的消息队列-》通过消息队列收发消息-》销毁消息队列
原语为send(Q,message) receive(Q,message) Q为用于通信的消息队列。

进程间通信从消息传递上可分为阻塞式和非阻塞式
阻塞式被认为是同步的:发送方直到信息被接收之前都处于阻塞状态,接收方直到信息被完全接收之前也是处于阻塞态的。即发送方只有确认信息被接收之后,才能返回进行下一步动作,如继续发送信息。
非阻塞式被认为是异步的:发送方发送之后就不管了,接收方同理。

进程间通信的链路之间可能存在缓冲区,缓冲区可以是以下三种方式之一:
1)0容量:发送方必须等待接收方接收完成;
2)有限容量:如果队列已满,发送方必须等待;
3)无限容量:发送方不需要等待可以一直发送。

2.进程间通信方式——信号(signal)

信号是软件层的中断(相对于硬件层的中断/interupt x80等),异步打断的机制,发出一些通知信息。(sigkill sigfpe sigusr1等)

比如通知某个正在运行的程序:我有一个更紧急的任务,你停一下。

应用程序接收到操作系统发送来的信号时,可能有以下三种处理方式:

1)执行默认动作(内核为用户进程设置的默认处理方式)
A:忽略
B:终止进程
C:暂停

  • Term:终止进程
  • Ign: 忽略信号 (默认即时对该种信号忽略操作)
  • Core:终止进程,生成Core文件。(查验进程死亡原因, 用于gdb调试)
  • Stop:停止(暂停)进程
  • Cont:继续运行进程

2)自己的处理方式:自己处理信号的方法告诉内核,这样你的进程收到了这个信号就会采用你自己的处理方式,即指定的信号处理函数被调用。

信号只是一个很小的bit,表明是哪一类信号,并不是大量的数据交换,只起到一个通知的作用。这种通信方式很灵活、效率很高。

操作系统中信号机制的实现:


3.进程间通信方式——管道

子进程从父进程继承文件描述符。来源于早起Unix命令行输入时的想法:能不能让上一个进程的输出重定向为下一个进程的输入。流水线方式,称为管道机制。

子进程共享父进程的一些资源。

管道特点:
1)管道只允许具有血缘关系的进程间通信,如父子进程间的通信。
2)管道只允许单向通信。
3)管道内部保证同步机制,从而保证访问数据的一致性。
4)面向字节流
5)管道随进程,进程在管道在,进程消失管道对应的端口也关闭,两个进程都消失管道也消失。

4.进程间通信方式——有名管道FIFO

相对于无名管道而言,有名管道当然是有名字的,这样就可以使任何进程通过文件名或路径名与该管道挂钩。所以,有名管道可用于任意两进程之间的通信。

就有名管道和无名管道的实现来说,主要是在打开方式上有所不同,管道文件一旦打开(建立),以后两者对管道文件的读、写和关闭操作相同。

5.进程间通信方式——消息队列??

解决了管道的两方面弊端 ①管道通信建立在有亲缘关系的进程之间 ②管道通信面向字节流,传递之后还要在接收端做解析。而消息队列的send和receive都可以是结构化的数据

和管道一样,其缓冲区也有大小限制,缓冲区慢的时候会有sleep的情况。

进程间通信(IPC):共享内存和消息队列原理详解c.biancheng.net/view/1208.html


6.进程间通信方式——共享内存

采用直接通信的方式,直接读写内存,速度更快,传输数据量也更大。只需要刚开始时操作系统的介入分配空间,之后就不再需要操作系统的介入。

缺点:需要同步互斥机制的保证。

7.进程间通信方式——socket

可跨系统,在分布式系统和开发上更有优势。

CSDN-专业IT技术社区-登录blog.csdn.net/wm12345645/article/details/82381407

C 3条回复 评论
紫侠仙子

非常详细, 非常清晰, 代码测试可用。 教科书级别

发表于 2023-06-10 22:00:00
0 0
老瑭

看过之后很多感触,唯有谢谢最简单也最真诚

发表于 2022-12-09 22:00:00
0 0
雾绕空山

这篇文章很励志,也有点适合我。

发表于 2022-06-04 23:00:00
0 0