进程同步与通信
进程同步与互斥
- 并发带来的问题
- 全局变量的更新变得危险
- 操作系统管理、分配资源困难
- 定位程序的错误很困难
- 进程的交互
- 互斥(同一资源不能同时被不同进程访问)
- 同步(多个进程必须按照某种顺序来执行才能完成某项任务)
- 通信(进程间消息传递)
- 临界资源与临界区
- 临界资源:某段时间只允许一个进程访问的资源
- 临界区:进程中访问临界资源的那段代码称为临界区
- 进程访问临界区的结构
graph TB
A(进入区)-->B(临界区)
B-->D(退出区)
D-->E(剩余区)
- 临界区进入准则
- 空闲让进
- 忙则等待
- 有限等待
- 让权等待
- 互斥实现的硬件方法
- 禁止中断
- 专用机器指令
- 互斥实现的软件方法
- 基本思路:进程在进入区检查和设置一些标志,如果进程已在临界区,则在进入去循环等待;在退出区修改标志。
- 信号量以及PV操作
- 最初定义的信号量包括一个整型值s以及等待队列s.queue。信号量通过两个原语P、V操作来访问它
- 信号量的物理意义:
- 信号量的初值表示某种资源的数目
- P操作代表请求资源
- V操作代表释放资源
- 当s.value<0时,|s.value|表示等待队列的进程数
- AND信号量
- 对于单PV操作可能引发的死锁问题。引发出了AND信号量的产生,继而发展到信号量集。
- 其思想是把进程运行过程中需要的所有临界资源一次性全部分配给进程
- 管程: 信号量实现进程间的互斥、同步。但是需要使用许多信号量,多次PV操作,且次序不能更改。为了解决这些问题,出现了另一高级同步工具-----管程。
- 同步互斥实例
- 自旋锁
- 任何进程获取CPU都需要取状态值,状态值符号要求才准许进入临界区
- 读写锁
- 读写锁用户保护经常访问但通常是只读访问的数据
- 十字转门锁
- 第一个阻塞某个互斥对象的线程的的十字转门成为对象的十字转门,以后所有阻塞于该锁上的线程将增加到该十字转门中。
- 进程通信
- 进程通信类型
- 共享存储系统
- 消息传递系统
- 管道通信