操作系统-进程通信(共享存储 消息传递 管道通信 读写管道的条件)

文章目录

什么是进程通信

分享吃瓜文涉及到了进程通信

进程通信需要操作系统支持

为什么进程通信需要操作系统支持

进程不能访问非本进程的空间

当进程P和Q需要进行数据交互时候,P不能之间把数据写到Q的地址空间里,所以需要有操作系统的支持才能完成

共享存储

申请一片内存区域作为共享内存区,将该共享内存区都映射到各个进程的地址空间中

对共享内存区的访问应该是互斥的

操作系统只负责提供一片共享内存区域和映射,关于各个进程往这片区域存放的数据形式,存放位置由进程控制。

基于数据结构的共享:类似定义了一个数据结构变量,这个变量作为共享区域其他进程都可以共享。此时进程通信的自由度较低,需要按照该变量的相关要求来访问(如定义了整型数组变量,那么每次写和读都是整型类型的且需按照数组的要求即个数限制)

如左图是基于数据结构的共享

消息传递

格式化消息由消息头和消息体组成

直接通信方式

内核区域有各个进程的PCB,各个进程的PCB包含了该进程的消息队列,也就是其他进程发送给该进程,应该被该进程接收的消息。

P给Q发消息:在P进程空间完善要发送的消息,然后使用发送原语,该原语指明了消息的接收者

这个发送原语会导致操作系统内核接收到这个要发送的消息,并把它挂到进程Q的消息队列里面(或者说复制到)

进程Q使用接收原语,该原语指明了接收谁发过来的消息,然后操作系统内核将Q的消息队列中属于P发过来的消息复制到进程Q的地址区域

间接通信方式

进程P通过系统调用申请一个信箱A(或者多个信箱)在内核空间中

进程P在自己进程空间内完善消息(类似代码执行时对数据加工)

然后使用发送原语,该发送原语指明了发送到的信箱A,操作系统将该消息复制到信箱A

进程Q使用接收原语,该原语指明了从哪个信箱接收消息,然后操作系统会将给信箱A的消息复制到进程Q的地址空间

注意

管道通信

管道某个时刻只能单向(半双工)

进程往管道写,进程往管道读出内容(循环队列)

系统调用方式申请一个管道文件,本质是内存中的内存缓存区

管道中前面有空位需要先写前面的,前面填满了才能往后面写,读也同样(先进先出 本质是循环队列 先写的就是先进入的,出来的就是先进入的,如果前面的有空位此时还要写,会先写前面的)

半双工:某个时间段内一个管道数据是单向流动的,只能由一方传到另一方。但不同时刻流动方向可以不同,但一个管道只能同时只有一个流动方向

多个进程读同一个管道会错乱即无法保证哪个数据被谁读走了

各进程互斥访问管道同一时刻只有一个进程对管道进行写或者读操作

5.第二个解决方案中操作系统控制从管道中读

小结

注意共享存储进程自己实现互斥

注意

相关推荐
嵌入式×边缘AI:打怪升级日志4 分钟前
从硬编码按键驱动到 Linux Platform 设备树驱动:逐行解剖与融会贯通
linux·运维·服务器
小周技术驿站43 分钟前
Linux 权限管理细节详解
linux·运维·服务器·ubuntu·centos
思麟呀44 分钟前
Select多路转接
linux·网络·c++·网络协议·http
cen__y1 小时前
Linux04(重定向)
linux·服务器·c语言
senijusene1 小时前
I2C 总线框架下LM75A 温度传感器 Linux驱动开发:
linux·运维·驱动开发
专注VB编程开发20年1 小时前
工控成套控制柜厂家 / 自动化小工厂 对外市场价
运维·自动化·工控·上位机开发
片酷2 小时前
【Isaacsim&Isaaclab】安装教程
linux·开发语言·python
Magic@2 小时前
Redis学习[1] ——基本概念和数据类型
linux·开发语言·数据库·c++·redis·学习
microxiaoxiao2 小时前
Aeroshell:2026 年,支持AI的SSH 终端
运维·人工智能·ssh
大腕先生2 小时前
通用分页超详细介绍(附带源代码解析&页面展示效果)
xml·java·linux·服务器·开发语言·前端·idea