前言
本博客仅做学习笔记,如有侵权,联系后即刻更改
科普:
进程同步
进程同步
- 对多个相关进程在执行次序上进行协调、使并发执行的诸进程之间能按照一定的规则共享系统资源,并能很好地相互合作,从而使程序的执行具有可再现性
进程同步的基本概念
- 制约关系
- 间接相互制约关系
临界资源:如打印机、磁带机,必须保证互斥访问- 直接相互制约关系
源于进程之间的合作
- 临界资源
诸进程间应采取互斥方式,实现对这种资源的共享
- 硬件资源如打印机、 磁带机等
- 临界区
在每个进程中访问临界资源的那段代码称为临界区
- 临界区:进程访问临界资源的代码
- 进入区:临界区之前检查状态的代码
- 退出区:将临界区正在被访问的标志恢复为未被访问的标志
- 可把一个访问临界资源的循环进程描述为
- 同步机制遵循的规则
- 空闲让进
- 忙则等待
- 有限等待
- 让权等待
- 常见的同步机制
- 软件方法
- 硬件方法
- 信息量机制
- 管程机制
硬件同步机制
- 关中断
- 利用Test-and-Set指令实现互斥
- 利用Swap指令实现进程互斥
优缺点
- 优点
适用于任意数目的进程
简单、容易验证其正确性
- 缺点
处于“忙等”,未实现“让权等待”,浪费处理机时间
可能产生“饥饿”现象
可能死锁
信号量机制
整形信号量:表示资源数目的整形量S
- 为正:空闲资源数
- 为负:等待使用资源的进程量
经典进程问题
解决方案
- 分析类型:同步、互斥
同步:直接制约
互斥:临界资源- 先同步、后互斥
生产者-消费者
要求
- 公用缓冲池有m个缓冲区,缓冲区互斥使用
没满就可以生产存入,非空就可以取出进程参数
- full(满缓冲区数目):0
- empty(空缓冲区数目):m
- mutex(缓冲区互斥信号量):1
- 生产者
P(empty);
P(mutex);
"数据存入缓冲区";
V(mutex);
V(full);
- 消费者
P(full);
P(mutex);
"读出缓冲区数据";
V(mutex);
V(empty);
读者-写者
要求
- 只有读-读进程允许同步
进程参数
- Wmutex(写进程)
- Rmutex(读进程)
- Rcount(同时进行的读进程数目)
注意点
- 对Rcount进行修改时,要取得读进程的控制权,避免公共变量的值混乱
- 读者
P(Rmutex);
//如果为第一个写进程,则占用写进程的控制权,避免同时读写冲突
if(Rcount == 0){
P(Wmutex);
}
Rcount++;
V(Rmutex);
"进行读操作";
P(Rmutex);
Rcount--;
//如果为最后一个读进程,则释放写进程的控制权
if(Rcount == 0){
V(Wmutex);
}
V(Rmutex);
- 写者
P(Wmutex);
"进行写操作";
V(Wmutex);
哲学家进餐
要求
- 5位哲学家进餐时需要取得左右两只筷子的控制权
进程参数
- chopstick[5] = [1,1,1,1,1]
- 第i位哲学家的活动
P(chopstick[i]);
P(chopstick[i+1]);
"进餐";
V(chopstick[i]);
V[chopstick[i+1]];
以上进程存在死锁问题
- 解决方案
- 只允许同时四位哲学家进餐
- 仅当左右筷子均可用,才进餐
- 规定奇数位先左后右拿筷子,偶数位相反
总结
小小励志
有些事你现在不做,一辈子都不会做了。
如果你想做一件事,全世界都会为你让路。
《搭车去柏林》