文章目录
- 什么是进程通信
- 为什么进程通信需要操作系统支持
- 共享存储
- 消息传递
- 直接通信方式
- 间接通信方式
- 管道通信
- 小结
- 注意
什么是进程通信
分享吃瓜文涉及到了进程通信
进程通信需要操作系统支持
为什么进程通信需要操作系统支持
进程不能访问非本进程的空间
当进程P和Q需要进行数据交互时候,P不能之间把数据写到Q的地址空间里,所以需要有操作系统的支持才能完成
共享存储
申请一片内存区域作为共享内存区,将该共享内存区都映射到各个进程的地址空间中
对共享内存区的访问应该是互斥的
操作系统只负责提供一片共享内存区域和映射,关于各个进程往这片区域存放的数据形式,存放位置由进程控制。
基于数据结构的共享:类似定义了一个数据结构变量,这个变量作为共享区域其他进程都可以共享。此时进程通信的自由度较低,需要按照该变量的相关要求来访问(如定义了整型数组变量,那么每次写和读都是整型类型的且需按照数组的要求即个数限制)
如左图是基于数据结构的共享
消息传递
格式化消息由消息头和消息体组成
直接通信方式
内核区域有各个进程的PCB,各个进程的PCB包含了该进程的消息队列,也就是其他进程发送给该进程,应该被该进程接收的消息。
P给Q发消息:在P进程空间完善要发送的消息,然后使用发送原语,该原语指明了消息的接收者
这个发送原语会导致操作系统内核接收到这个要发送的消息,并把它挂到进程Q的消息队列里面(或者说复制到)
进程Q使用接收原语,该原语指明了接收谁发过来的消息,然后操作系统内核将Q的消息队列中属于P发过来的消息复制到进程Q的地址区域
间接通信方式
进程P通过系统调用申请一个信箱A(或者多个信箱)在内核空间中
进程P在自己进程空间内完善消息(类似代码执行时对数据加工)
然后使用发送原语,该发送原语指明了发送到的信箱A,操作系统将该消息复制到信箱A
进程Q使用接收原语,该原语指明了从哪个信箱接收消息,然后操作系统会将给信箱A的消息复制到进程Q的地址空间
注意
管道通信
管道某个时刻只能单向(半双工)
进程往管道写,进程往管道读出内容(循环队列)
系统调用方式申请一个管道文件,本质是内存中的内存缓存区
管道中前面有空位需要先写前面的,前面填满了才能往后面写,读也同样(先进先出 本质是循环队列 先写的就是先进入的,出来的就是先进入的,如果前面的有空位此时还要写,会先写前面的)
半双工:某个时间段内一个管道数据是单向流动的,只能由一方传到另一方。但不同时刻流动方向可以不同,但一个管道只能同时只有一个流动方向
多个进程读同一个管道会错乱即无法保证哪个数据被谁读走了
各进程互斥访问管道同一时刻只有一个进程对管道进行写或者读操作
5.第二个解决方案中操作系统控制从管道中读
小结
注意共享存储进程自己实现互斥