操作系统---IPC(进程间通信):管道、消息队列、共享内存

一、概述

1、通信模型

  • 进程通信的机制与同步
  • 不使用共享变量的进程通信
  • IPC facility提供两个操作:
send(message)
receive(message)
  • 如果P和Q想通信,需要:
在它们之间建立通信链路
通过send和receive交换消息
  • 通信链路实现
物理(例如共享内存、硬件总线)
逻辑(例如逻辑属性)

2、直接与间接通信

(1)两者区别图解

在这里插入图片描述实现进程间通信有三种方式:管道、消息队列、共享内存。前两种都属于间接通信对应图中的(a)图,第三种属于直接通信对应图中的(b)图。

(2)直接通信

进程必须正确命名对方

(2)间接通信(消息队列为例)

在这里插入图片描述
在这里插入图片描述

3、阻塞与非阻塞

消息传递可以是阻塞的或者非阻塞的
阻塞被认为是同步的
非阻塞被认为是异步的

4、通信链路缓存

队列的消息被附加到链路,可能是以下三种方式之一:
消息队列和管道其实质就是内存中的一个buffer缓存
既然是buffer那么就有大小:
(1)0容量 - 0 messages

发送方必须等待接收方

(2)有限容量 - n messages的有限长度

如果队列满,发送方必须等待

(3)无限容量 - 无限长度

发送方不需要等待

二、信号

我们都知道硬件中断,interupt,比如外设发出的中断。
我们的信号(signal)就是软件层面的中断。
在这里插入图片描述

三、管道

在这里插入图片描述竖杠我们都知道是管道符。
管道其实就是一块buffer缓存。
管道的缺陷:

  • 管道就是父进程帮子进程建立好的一个通道,如果说你们两个进程之间没有父子关系,那么你们两个进程之间的pipe管道就不能被创建。
  • 管道中的数据是按字节流传递的,没有一个数据结构的组织

四、消息队列

上面我们说了管道的缺点,我们的消息队列就可以很好的解决这两个缺点。
Message:作为一个字节序列存储
Message Queue:消息数组
在这里插入图片描述send有多个,receive只有一个,它们之间没有父子关系也可以传,而且是有数据结构的。

五、共享内存

在这里插入图片描述
在这里插入图片描述
我们都知道一个物理地址可以对应多个逻辑地址,这个映射关系可以在页表或段表中建立。这就是共享内存段的来源。虽然逻辑地址不同也有可能相同,但对应的物理地址都是一样的,这就是共享的感觉。

猜你喜欢

转载自blog.csdn.net/weixin_44571270/article/details/105809257
今日推荐