操作系统学习之进程间的通信

进程之间的通信

概念:进程通信(IPC)是指两个进程之间产生的数据交互
如在:A软件内调用B软件的信息,并且直接打开了A软件————里面携带有B软件的信息。
为什么需要操作系统去控制进程之间的通信?
因为进程拥有的内存地址空间是相互独立的只能读写自己空间里面的东西,所以进程之间无法自动的去调用其他进程地址空间所占用的资源。所以为了安全考虑。

进程通信的方法
1.共享存储

概念:A进程申请一个共享存储区(里面的资源可以被其他进程所调用)。相当于在内存中开辟一个新的空间。
原理:先通过shm_open 系统调用申请一片共享内存区,再通过mmap系统调用将共享存储区映射到自己的地址空间(多了一片虚拟内存)。
注意事项:进程访问这片共享存储区是要互斥访问(同时写会出写的内容被覆盖)

分两类:
基于存储区的共享:操作系统划出一块共享存储区,里面的数据形式、存放位置都是由通信进程控制与操作系统无关了————高级通信方式
基于数据结构的共享:共享空间只放一些数据结构(就必须按照该数据机构方式读/写),这种限制多、速度慢————低级通信方式

2.消息传递

概念:进程间的数据交换以格式化的消息为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交互
格式化的消息包括:1.消息头(发送进程ID、接受进程ID、消息长度等 )
2.消息体

分两类:
1.直接通信方式:消息发送进程要指明接受进程的ID(点名道姓)
进程P发送msg给进程Q:
1.在进程P的地址空间中生成msg(格式化的消息)
2.通过系统调用的原语send(Q,msg) 发送到操纵系统内核中
3.在创建Q的PCB时有个进程Q的消息队列会把P发送的msg传到这个队列里面
4.进程Q使用receive(P,&msg)这个接受原语
5.再把这个msg复制到Q的地址空间内

在这里插入图片描述

2.间接通信方式(信箱通信方式):通过“信箱”间接地通信——读写数据在信箱里面是自由存储
进程P发送msg给进程Q:
1.进程P在操作系统内核的地址空间中申请一个或多个邮箱(A、B)
2.进程P在自己的地址空间内完善msg
3.使用发送原语 send(A,msg) 表示将消息传送到信箱里面
4.进程Q使用接受原语 receive(A,&msg) 将信箱里面的信息传递给Q进程了
允许多个进程往同一个信箱传递消息,也允许多个进程从同一个信箱接受消息

3.管道通信
概念:数据的传递只能是单向的(从一端写入,另一端读数据)——读写数据在管道里面存储是先进先出的
管道类似一个循环队列,在linux中一切皆文件所以管道也可以定义在pipe文件(内存缓冲区)

在这里插入图片描述

因此单管道通信只能采用半双工通信,即某一时间段内是单向传输。如果要使用双向同时通信,需要设置两个管道(全双工通信)。
各个进程对管道访问是互斥访问(操作系统)
当管道写满(为空)那么会对进程进行的下一个操作进行阻塞,需要Q将管道里面的进程读出来一个(P写以一个进程进入管道)才可唤醒进程。
一个管道并不是一直是特定的读进程/写进程,所以当多个进程读同一个管道就会出现错乱(因为一旦被读出后管道里的数据就不会在管道中了)。解决方案:1.一个管道允许多个写进程,一个读进程。2.允许有多个写进程,多个都读进程,但系统会让各个读进程轮流从管道中读取。所以管道是多对多的进程。

图来源均为:王道考研 操作系统

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值