欢迎来到天天文库
浏览记录
ID:40389255
大小:597.10 KB
页数:67页
时间:2019-08-01
《孙钟秀操作系统第三章同步、通信与死锁》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第三章同步、通信与死锁13.1进程的同步与互斥在多道程序的环境中,系统中的多个进程可以并发执行,同时它们又要共享系统中的资源,由此诸进程间会产生错综复杂的相互制约的关系。一、进程间制约关系1.竞争关系源于资源共享,多个不存在逻辑关系的进程因共享资源而产生制约关系。若一个进程要求使用某一资源,而该资源正被另一个进程使用,并且这一资源不允许两个进程同时访问,那么该进程只有等待,只有这一资源释放后才能使用。2.协作关系源于进程间的协作。一组进程为完成共同任务分工协作,各进程都独立以不可预知速度推进,在执行的先后次序就有约束,在一些关键点上协调工作。若一个进程运行到某关键点时,在
2、尚未收到另一协作进程发来的信息前应阻塞自己,等协作进程发来消息后方可继续执行。进程——资源——进程进程——进程2进程间这种相互依赖又相互制约,相互协作又相互竞争的关系,主要表现在进程互斥和进程同步两方面二、进程互斥引例:宿舍电话的使用打印机的使用1、临界资源一次仅允许一个进程使用的资源称为临界资源。引例中的电话和打印机都属于临界资源。还有光盘刻录机、绘图仪、共享变量、共享的数据结构等等也是临界资源。2、临界区:每个进程中访问临界资源的那段程序段称为临界区。(临界段)3例:统计两个进程P1和P2对共享变量count的访问计数。P1:….P2:….R1=count;R2=co
3、unt;R1=R1+1;R2=R2+1;count=R1;count=R2;….….两进程并发执行,可能的执行顺序为:P1:R1=count;R1=R1+1;P2:R2=count;R2=R2+1;count=R2;P1:count=R1;虽然两个进程各自都执行了对count加1的操作,但结果为何count只增加1?count是临界资源,P1、P2访问count的两个程序段就是临界区,两个进程必须互斥的进入临界区,否则就可能出与时间有关的错误.43、进程互斥进程应互斥访问同一临界资源,即进程应互斥的进入临界区。当一进程正在访问某临界区时,就不允许其它进程进入,试图进入临界
4、区的另一进程必须等待。进程之间的这种相互制约的关系称为进程互斥。4、进入临界区的准则:每次至多有一个进程进入临界区内执行;若已有进程在临界区中,试图进入此临界区的其他进程应等待;进入临界区的进程应在有限时间内退出,以便让等待队列中的一个进程进入。5三、进程同步引例:两位同学约好星期天去玩,早上8:00在校门口,不见不散。当一个同学先来到校门口,要等另一个同学,到齐后一起去玩。互斥的概念来自于诸进程对临界资源的竞争,同步来源于多个进程的协作。在人类社会中竞争与协作是永恒的。进程同步:几个进程相互协作,一个进程到达某点后,若另一进程尚未完成某些操作,就必须停下来等待,只有等另
5、一进程的这些操作完成了才能继续执行。协作进程间需要在某些关键点上排定执行先后次序而等待、传递信号或消息所产生的协作关系称为进程同步。6例:计算fun1(X)*fun2(y)两进程合作完成任务进程1:计算fun1(X)。进程2:计算fun2(X);与进程1结果相乘。进程1和进程2并发执行。73.2进程互斥的实现一、实现进程互斥的软件算法现在很少用软件方法解决互斥,但通过学习软件解法能使读者了解到,在早期进程互斥问题的解决并不是一件很简单的事。8尝试(1)boolinside1=false;//P1不在其临界区内boolinside2=false;//P2不在其临界区内cob
6、eginprocessP1()processP2(){{while(inside2);while(inside1);inside1=true;inside2=true;{临界区};{临界区};inside1=false;inside2=false;}}coendP1和P2可能同时进入临界区9尝试(2)boolinside1=false;//P1不在其临界区内boolinside2=false;//P2不在其临界区内cobeginprocessP1()processP2(){{inside1=true;inside2=true;while(inside2);while(in
7、side1);{临界区};{临界区};inside1=false;inside2=false;}}coendP1和P2可能永远等待。10processP0(){inside[0]=true;turn=1;while(inside[1]&&turn==1);{临界区};inside[0]=false;}processP1(){inside[1]=true;turn=0;while(inside[0]&&turn==0);{临界区};inside[1]=false;}cobegincoendboolinside[2];inside
此文档下载收益归作者所有