当前位置: 首页 > news >正文

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

文章目录

  • 什么是进程通信
  • 为什么进程通信需要操作系统支持
  • 共享存储
  • 消息传递
    • 直接通信方式
    • 间接通信方式
  • 管道通信
  • 小结
  • 注意

什么是进程通信

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

进程通信需要操作系统支持
在这里插入图片描述

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

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

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

在这里插入图片描述

共享存储

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

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

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

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

如左图是基于数据结构的共享
在这里插入图片描述

消息传递

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

在这里插入图片描述

直接通信方式

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

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

这个发送原语会导致操作系统内核接收到这个要发送的消息,并把它挂到进程Q的消息队列里面(或者说复制到)
在这里插入图片描述
进程Q使用接收原语,该原语指明了接收谁发过来的消息,然后操作系统内核将Q的消息队列中属于P发过来的消息复制到进程Q的地址区域

在这里插入图片描述

间接通信方式

进程P通过系统调用申请一个信箱A(或者多个信箱)在内核空间中
进程P在自己进程空间内完善消息(类似代码执行时对数据加工)
在这里插入图片描述

然后使用发送原语,该发送原语指明了发送到的信箱A,操作系统将该消息复制到信箱A
在这里插入图片描述
进程Q使用接收原语,该原语指明了从哪个信箱接收消息,然后操作系统会将给信箱A的消息复制到进程Q的地址空间
在这里插入图片描述
注意
在这里插入图片描述

管道通信

管道某个时刻只能单向(半双工)
进程往管道写,进程往管道读出内容(循环队列)

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

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

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

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

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

5.第二个解决方案中操作系统控制从管道中读
在这里插入图片描述

小结

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

在这里插入图片描述

注意

在这里插入图片描述

http://www.lryc.cn/news/288352.html

相关文章:

  • NODE笔记 2 使用node操作飞书多维表格
  • Scikit-Learn 高级教程——自定义评估器
  • 6 时间序列(不同位置的装置如何建模): GRU+Embedding
  • Git 基本概念
  • android:excludeFromRecents
  • 微信小程序登录获取手机号教程(超详细)
  • uniapp app更新
  • C语言第八弹---一维数组
  • 科普栏目 | 水离子水壁炉是如何打造清新环境,提升居家生活?
  • python 进程
  • 网络编程套接字(1)
  • harmonyOS app 开发环境配置流程
  • 【嵌入式学习】C++QT-Day2-C++基础
  • 新手基础易懂的创建javaweb项目的方法(适用于IDEA 2023版)
  • 决策树的基本构建流程
  • [极客大挑战 2019]Upload1
  • Android 渲染机制
  • go语言Map与结构体
  • C#,打印漂亮杨辉三角形(帕斯卡三角形)的源代码
  • [SUCTF 2019]CheckIn1
  • C语言练习题110例(十)
  • 前端学习-0125
  • gin中使用validator做参数校验
  • 理想架构的Doherty功率放大器理论与仿真
  • 22. 离线MC强化学习算法(1)
  • 如何阅读xml电子发票
  • php实现多进程的几种方式
  • CmakeList教程
  • JavaWeb之JavaScript-Vue --黑马笔记
  • pikachu_ssrf攻略