操作系统-进程与线程2

2.3 同步与互斥

基本概念

临界资源,同步,互斥

实现互斥

略,软件方式和硬件方式

互斥锁&信号量

互斥锁:原子操作acquire(), release();需要忙等待

信号量类型:整型信号量,记录型信号量

整型信号量:wait(), signal();wait当信号量大于0后信号量减一,signal信号量加一

记录型信号量:wait信号量减一并将自己的进程加进等待队列,状态设置为block,signal信号量加一,当信号量大于0后从等待队列释放一个进程并唤醒该进程。

信号量实现同步与互斥

管程

经典同步问题

1. 生产者-消费者问题

要求:生产者和消费者共享一个缓存区,生产者在没满时生成,消费者在没空时消费

三个信号量:mutex,full,empty

先P(empty)或P(full),再P(mutex)——可能死锁

2. 读者-写者问题

要求:读可以同时;只能一个写;写操作未完成前不能读或写;执行写操作前无正在执行的读或写

(感觉就一句,除读读外,其他操作互斥)

3. 哲学家就餐问题

解决办法:同时拿两根筷子;动作规定

4. 吸烟者问题

问题描述:三个吸烟者和一个供应者。造烟需要三种材料,三个吸烟者各有一种。供应者每次拿出两种使得一个吸烟者能够吸烟。当其吸完了,供应者再拿出两种材料。

分析:供应者和吸烟者同步,吸烟者之间互斥

2.4 死锁

基本概念

死锁原因:资源竞争+顺序不当

产生条件:互斥+不可剥夺+请求且持有资源+循环等待

处理策略:预防or避免or检测并解除

死锁预防

破坏条件即可

1. 不互斥

对共享资源可行,对临界资源不可行

2. 可剥夺

有的资源可行,有的不可行(打印机)

3. 获得所有资源才执行

可能导致饿死

4. 向后申请资源

给资源编号,只能申请编号更大的资源。

麻烦

死锁避免

1. 判断安全状态

系统判断分配该资源后是否会导致死锁

2. 银行家算法

进程事先向系统声明所需最大资源数

最大需求矩阵,分配矩阵,需求矩阵

具体执行步骤略

死锁检测和解除

资源分配图:进程,资源,请求边,分配边

简化资源分配图后可检测系统是否死锁:略

解除:剥夺资源,撤销进程和进程回退(这俩有啥区别?)