概念@
顺序程序设计:
程序执行的顺序性
计算环境的封闭性
计算结果的确定性
计算过程的可再见性
进程的并发执行:
并发进程的制约关系@
进程互斥:并发进程因相互争夺独占性资源而产生的竞争制约关系;
进程同步:并发进程为完成共同任务基于某个条件来协调执行先后关系而产生的协作制约关系;
临界区@
临界资源:互斥共享变量所代表的的资源(即一次只能被一个进程使用的资源)
临界区指并发进程中与互斥共享变量相关的程序段;
两个进程的临界区有相同的临界资源,就是相关的临界区,必须互斥进入。
嵌套使用:
临界区管理的尝试:
同时进入:先判断,在挂锁
死锁:先挂锁,再判断
一条指令可以解决,测试并建立指令
临界区管理实现的硬件方式:
测试并建立指令:
TS(x){
if(x==false){x=true;return true;
}else return false;
}
Boolean lock;
lock=false; //临界区可用
process Pi{ //i=1,2,...,n
process Pi{
Boolean pi;
repeat pi=TS(lock) until pi;//循环请求锁
process Pi{
临界区;
lock=false; //解锁
}
对换指令:
进程与临界区换
swap(a,b){temp=a;a=b;b=temp;}
Boolean lock;
lock=false; //临界区可用
process Pi{ //i=1,2,...,n
process Pi{
Boolean pi;
repeat swap(lock,pi) until !pi;//循环请求锁
process Pi{
临界区;
lock=false; //解锁
}
TS和swap指令均是忙式等待,效率低;
解决办法:进出临界区开关中断;这样临界区执行就不会中断了,执行就有原子性。
程序的原子性指:整个程序中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节
关中断;临界区;开中断
临界区指令,应短小精悍。
PV操作与进程互斥,同步@
参考:操作系统访问硬件资源时采用“请求-等待-中断恢复”方式
信号量:可动态定义的软件资源;
核心数据结构:等待进程队列;
记录型信号量的定义:每个信号量相关一个整数值
--正值表示资源可复用次数;
--0值表示无资源且无进程等待;
--负值表示等待队列中进程个数;
PV操作解决进程互斥问题框架:
procedure P(semaphore:s){
s=s-1; //信号量减去1
if(s<0) W(s); //若信号量小于0,则调用进程被置成等待信号量s的状态
}
procedure V(semaphore:s){
s:=s+1; //信号量加1
if(s<=0) R(s); //若信号量小于等于0,则释放一个等待信号量s的进程
}
生产者消费者问题探究:
苹果橘子问题:生产和消费方式不同,三个同步关系,有苹果,有橘子,有空位
管程@
管程试图抽象相关并发进程对共享变量访问,以提供一个友善的并发程序设计开发环境;
进程只能互斥地调用管程中的过程;
管程的基本形式:
管程的条件变量:当调用管程过程的过程无法进行时,用于阻塞进程的信号量;
霍尔管程:
实现方法:见上;
互斥调用霍尔管程的信号量:
哲学家问题:
写作者读者问题:
进程通信:
交往进程通过信号量操作实现进程互斥和同步,这是一种低级通信方式。
进程通信机制,实现进程间用信件来交换信息。
高级进程通信机制:
基于流的进程通信:
多个进程使用一个共享的消息缓冲区(可称为管道、多路转接器、套接字)
远程过程调用RPC:
死锁@
允许多个进程并发执行共享系统资源时,系统必须提供同步机制和进程通信机制。然而这种机制使用不当的时候,就会出现进程永远被阻塞的现象。
定义:每一个进程都在等待被另一个进程所占有的、不能抢占的资源。
解决方法:
死锁防止;
死锁避免;
死锁检测与恢复;
死锁防止
产生的四个必要条件:
• 互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
• 不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。
• 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
• 循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被 链中下一个进程所请求。
破坏四个必要条件之一,死锁就可以防止
静态分配(预分配)
破坏请求和保持条件
死锁避免
只需为申请者分配资源前先测试系统状态,若把资源分配给申请者会产生死锁的话,则拒绝分配,否则接收申请,为它分配资源。
银行家算法:
死锁检测与恢复
死锁检测方法对资源的分配不加限制,但系统定时运行一个“死锁检测”程序,判断系统内是否已出现死锁,若检测到死锁则设法加以解除。
一种方法:两张表
等待资源表记录每个被阻塞进程等待的资源。
占用资源表记录每个进程占用的资源。
死锁检测程序可用Warshall的传递闭包算法检测是否有死锁发生。
死锁检测后的解决办法:
1.重新启动进程执行的办法。在进程执行过程中定时设置校验点,从校验点开始重执行。
2.终止一个卷入死锁的进程,以后重执行。