2.4、进程通信

整体框架

image-20230118222146010

1、什么是进程通信?

顾名思义,进程通信就是指进程之间的信息交换。

进程是分配系统资源的单位(包括内存地址空间),

  • 因此 各进程 \color{red}各进程 各进程拥有的 内存地址空间相互独立 \color{red}内存地址空间相互独立 内存地址空间相互独立

image-20230118214914239

为了保证安全, 一个进程不能直接访问另一个进程的地址空间 \color{red}一个进程不能直接访问另一个进程的地址空间 一个进程不能直接访问另一个进程的地址空间

但是进程之间的信息交换又是必须实现的。

为了保证进程间的安全通信,操作系统提供了一些方法。

image-20230118215015724

2、共享存储

image-20230118215242272

两个进程对共享空间的访问必须是互斥的(互斥访问通过操作系统提供的工具实现)。

操作系统只负责提供共享空间和同步互斥工具(如 PV 操作)

image-20230118215558218

基于数据结构 \color{red}基于数据结构 基于数据结构的共享:

  • 比如共享空间里只能放一个长度为 10 的数组。

  • 这种共享方式速度慢、限制多,

  • 是一种 低级通信 \color{red}低级通信 低级通信方式

基于存储区 \color{red}基于存储区 基于存储区的共享:

  • 在内存中画出一块共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统。

  • 相比之下,这种共享方式速度更快,

  • 是一种 高级通信 \color{red}高级通信 高级通信方式。

3、管道通信

“管道” 是指用于连接读写进程的一个共享文件,

  • 又名 pipe 文件。
  • 其实就是在内存中开辟一个大小固定的缓冲区

image-20230118215739247

管道只能采用 半双工通信 \color{red}半双工通信 半双工通信,某一时间段内只能实现单向的传输。

  • 如果要实现双向同时通信,则需要设置两个管道

image-20230118215947722

首先进程 1 1 1 会往管道中写数据, 当管道中的数据写满了之后进程 2 2 2 才可以开始往外读数据

只有这个数据全部被读出后,进程 1 1 1 才可以继续往里面写数据


数据以字符流的形式写入管道,当管道写满时,写进程 write() 系统调用将被阻塞,等待读进程将数据取走。

当读进程将数据全部取走后**,管道变空**,此时读进程read() 系统调用将被阻塞


如果 没写满 , 就不允许读 \color{red}没写满,就不允许读 没写满,就不允许读

如果 没读空 , 就不允许写 \color{red}没读空,就不允许写 没读空,就不允许写

数据一旦被读出,就从管道中被抛弃,

  • 这就意味着 读进程最多只能有一个 \color{red}读进程最多只能有一个 读进程最多只能有一个

    否则可能会有读错数据的情况。

4、消息传递

进程间的数据交换以 格式化的消息 \color{red}格式化的消息 格式化的消息Message)为单位。

进程通过操作系统提供的 “发送消息/接收消息” 两个 原语 \color{red}原语 原语进行数据交换。

例如:TCP 报文段的首部就是消息头,数据载荷就是消息体

image-20230118220813617

image-20230118221019141

4.1、直接通信方式

消息直接挂到接收进程的消息缓存队列上

image-20230118221051455

4.2、间接通信方式

消息要先发送到中间实体(信箱)中,因此也称 “信箱通信方式” 。

  • Eg:计网中的电子邮件系统

image-20230118221353103

5、整体框架

image-20230118222138424

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值