一、基本概念
1.同步与互斥
同步:两个或两个以上进程要协作完成一个任务。
互斥:两个或两个以上进程竞争一个资源。
2.临界段
临界资源:一段时间内只允许一个进程访问的资源。
临界段:进程访问临界资源的程序段
二、信号量
1.操作
(1)初始化操作,信号量能初始化为非负的值。
(2)semWait操作,能减小信号量的值,如结果值为负,执行semWait操作的进程就被封锁。
(3)semSignal操作,能增加信号量的值,如果结果值非正,那么原先因执行semWait操作而阻塞的进程被解除阻塞。
2.信号量实现互斥
semWait(s)
临界段
semSignal(s)
3.信号量实现同步
由进程A semWait,进程BsemSignal
4.生产消费者问题
buffers:缓冲区的大小
mutex:互斥信号量
product:有无产品
生产者:
while(){
produce new product;
semWait(buffers);
semWait(mutex);
put product into buffers;
semSignal(mutex);
semSignal(products);
}
消费者:
while(){
semWait(products);
semWait(mutex);
getproduct from buffers;
semSignal(mutex);
semSignal(buffers);
consumeproduct;
}
5.读者/写者问题
读者进程之间不需要互斥,但写进程必须与其他所有写进程和读进程互斥。
信号量:mutex(互斥信号量),wrt,count(计数器)
写进程:
while(){
semWait(wrt);
write information;
semSignal(wrt);
}
读进程:
while(){
semWait(mutex);
if (++count == 1)
semWait(wrt);
semWait(mutex)
read information;
semSignal(mutex);
if ( --count == 0)
semSignal(wrt);
semSignal(mutex);
}
三、进程间数据通信
1.消息通信
一个进程要向另一个进程发送消息,先要向系统申请一个缓冲区,填写了消息正文和其他有关消息的特征、控制信息后,通过消息通信机构将该消息送到接收其他消息队列中。
接收进程在一个适当时机从消息队列中移出一个消息,读取所有的信息后,再释放消息缓冲区。
2.共享存储区
3.管道
四、死锁
1.死锁产生原因
几个进程各自占了对方要的资源
2.产生死锁的条件
(1)互斥执行
每次只能允许一个进程占有和使用一个资源,其他申请该资源的进程被阻塞。
(2)保持并等待
当进程等待分配给它新的资源时,保持占有已分配的资源。
(3)不可剥夺
不能强迫移去进程占有的未使用完的资源。
(4)循环等待
存在一个闭合的进程──资源链,以致每一个进程至少占有链中下一个进程所需要的一个资源。
3.死锁的预防
(1)互斥执行
无法预防。
(2)保持并等待
进程一次申请它所有需要的资源。
(3)不可剥夺
如果进程不能获得进一步的资源,要求其释放原先占有的资源。
(4)循环等待
资源排序,如果一个进程已经占有了资源A,那么它接下来只能申请排在A后面的资源。
此外还有银行家算法用于死锁避免,Coffman算法用于死锁检测。
4.死锁解除
(1)强迫撤销所有死锁进程
(2)逐个撤销死锁进程
(3)相继剥夺进程所占资源