【操作系统】7.进程之间是怎么协作的?

本文详细探讨了进程之间的协作,包括进程通信的三种方式(共享存储、消息传递和管道通信),以及进程同步如何通过互斥访问临界资源、管程和解决经典同步问题来确保正确执行。
摘要由CSDN通过智能技术生成

3.进程之间是怎么协作的?

进程间的协作:进程通信,进程同步

3.1 进程通信

概念:进程通信即进程间的信息交换
进程是资源分配的基本单位,各进程内存空间彼此独立
一个进程不能随意访问其它进程的地址空间

特点:
共享存储(Shared-Memory)
消息传递(Message-Passing)
管道通信(Pipe)

3.1.1 进程通信:共享存储(Shared-Memory)

基于共享数据结构的通信方式
多个进程共用某个数据结构(OS提供并控制)
由用户(程序员)负责同步处理
低级通信:可以传递少量数据,效率低

基于共享存储区的通信方式
多个进程共用内存中的一块存储区域
由进程控制数据的形式和方式方式
高级通信:可以传递大量数据,效率高

在这里插入图片描述

3.1.2 进程通信:消息传递(Message-Passing)

直接通信:点到点发送
发送和接收时指明双方进程的ID
每个进程维护一个消息缓冲队列

间接通信:广播信箱
以信箱为媒介,作为中间实体
发进程将消息发送到信箱,收进程从信箱读取
可以广播,容易建立双向通信链

在这里插入图片描述

3.1.3 进程通信:管道通信(Pipe)

管道
用于连接读/写进程的共享文件,pipe文件
本质是内存中固定大小的缓冲区

半双工通信
同一时段只能单向通信,双工通信需要两个管道
以先进先出(FIFO)方式组织数据传输
通过系统调用read()/write()函数进行读写操作

在这里插入图片描述

3.2 进程同步

协调进程间的相互制约关系,使它们按照预期的方式执行的过程

前提
进程是并发执行的,进程间存在着相互制约关系
并发的进程对系统共享资源进行竞争
进程通信,过程中相互发送的信号称为消息或事件

两种相互制约形式
间接相互制约关系(互斥):进程排他性地访问共享资源
直接相互制约关系(同步):进程间的合作,比如管道通信

3.2.1 进程同步:互斥的访问临界资源

访问过程
进入区:尝试进入临界区,成功则加锁(lock)
临界区:访问共享资源
退出区:解锁(unlock),唤醒其它阻塞进程
剩余区:其它代码

在这里插入图片描述

访问原则
空闲让进:临界区空闲,允许一个进程进入
忙则等待:临界区已有进程,其它进程等待(阻塞状态)
有限等待:处于等待的进程,等待时间有限
让权等待:等待时应让出CPU执行权,防止“忙等待”

软件实现方法
单标志法:违背“空闲让进”
双标志法先检查:违背“忙则等待”
双标志法后检查:
违背“空闲让进”、“有限等待”
皮特森算法(Peterson’s Algorithm)
违背“让权等待”,会发生“忙等”

硬件实现方法
中断屏蔽方法:关中断/开中断
禁止一切中断,CPU执行完临界区之前不会切换
关中断可能会被滥用
关中断时间长影响效率
不适用于多处理机,无法防止其它处理机调度其它进程访问临界区
只适用于内核进程(该指令运行在内核态)

在这里插入图片描述

硬件实现方法
中断屏蔽方法:关中断/开中断
Test-And-Set(TS指令/TSL指令)
读出标志并设置为true,返回旧值,原子操作
也被称作TSL指令( Test-And-Set-Lock )
违背“让权等待”,会发生忙等

Swap指令( EXCHANGE,XCHG指令)
交换两个变量的值,原子操作
违背“让权等待”

信号量(Semaphore)机制
PV操作:
P操作:wait原语,进程等待
V操作:signal原语,唤醒等待进程
整型信号量:违背“让权等待”,会发生忙等

记录型信号量:进程进入阻塞状态,不会忙等

3.2.2 进程同步:管程(Monitor,监视器)

“管理进程”,即用于实现进程同步的工具。是由代表共享资源的数据结构和一组过程(进行PV操作的函数)组成的管理程序(封装)。
管程的组成
管程名称
局部于管程内部的共享数据结构
对该数据结构操作的一组过程(函数)
管程内共享数据的初始化语句

在这里插入图片描述

管程的基本特性
是一个模块化的基本程序单位,可以单独编译
是一种抽象数据类型,包含数据和操作
信息掩蔽,共享数据只能被管程内的过程访问

条件变量/条件对象
进入管程的进程可能由于条件不满足而阻塞
此时进程应释放管程以便其它进程调用管程
进程被阻塞的条件(原因)有多个,移入不同的条件队列
进程被移入条件队列后,应释放管程

在这里插入图片描述

3.2.3 进程同步:经典同步问题

生产者-消费者问题
读者写者问题
哲学家进餐问题
吸烟者问题

生产者-消费者问题
一组生产者进程和一组消费者进程
它们共享大小为n的缓冲区
未满可放,非空可读,否则阻塞
每次只允许一个生产者/消费者放/读,

// 整型信号量,表示可用资源数
int S = 1; 
// wait原语,相当于进入区
void wait(int S) {
   // 资源不够,循环等待
   while (S <= 0); 
   S = S - 1;
}

// signal原语,相当于退出区
void signal(int S) {
   S = S + 1;
}

读者-写者问题
读者进程和写者两组并发进程
它们共享同一个文件
要求:
允许多个读者同时读
只允许一个写者写
任一写者完成前,不可读写
写者操作前,已有读者写者退出

哲学家进餐问题
5名哲学家,每2人间有一根筷子
每2根筷子间有一碗米饭
哲学家要么思考,要么进餐
要求:
拿起左右两根筷子才能进餐
一根一根地拿起,若其中任一筷子在他人手上,等待
进餐完成后,放下筷子,继续思考

吸烟者问题
三个抽烟者进程,一个供应者进程
抽烟者需要三种材料卷烟:烟草、纸和胶水
三个抽烟者分别拥有烟草、纸、胶水
要求:
供应者无限提供三种材料,但每次只提供两种
拥有第三种材料的抽烟者卷烟成功并抽掉
抽烟成功者给供应者发信号:已完成
供应者收到完成信号后再提供两种材料放到桌子上

小结:进程之间是怎么协作的?

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A 北枝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值