第三章 进程互斥与同步教案.ppt

  1. 1、本文档共32页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三章 进程互斥与同步 互斥-信号量机制 1965年由荷兰的Dijkstra提出 信号量( semaphore ) 是一种软件不忙等待法 信号量机制的类型 经典信号量(忙等待) 记录型信号量(使用不当可能会造成死锁) 信号量集(资源利用率低) 记录型信号量的定义 数据结构 typedef struct semaphore { int value; PCB * P; } S; //定义信号量的结构体及变量S P-V操作原语 P(S)操作原语 void P( struct semaphore S ) { S.value --; if ( S.value 0 ) block( S.P); //阻塞调用进程,在S.P中排队 } P操作的主要动作: ①s值减1; ②若相减结果=0,则进程继续执行; ③若相减结果0,则进程被封锁,并将它插入到该信号灯的等待队列之中,然后转进程调度程序。 P-V操作原语 V(S)操作原语 void V( struct semaphore S ) { S.value ++; if ( S.value = 0 ) wakeup( S.P); //唤醒S.P排队中某个进程 } V操作的主要动作: ①s值加1; ②若相加结果0,则进程继续执行; ③若相加结果=0,则从该信号灯的等待队列中移出一个进程,解除它的等待状态,然后返回本进程继续执行。 S.value的物理意义 S.value 用于表示资源数目或请求使用某一资源的进程个数的整形量. S是与临界区内所使用的公用资源有关的信号量。S.value0 表示可供并发进程使用的资源数。 P(S)操作时表示,表示进程请求分配一个该类资源,将对S.value减1,若S.value0 表示资源已经分配完,此时|S.value|表示正在S.P队列中等待使用临界区的进程数 V(S)操作表示进程释放一个该类资源,S.value加1,若S.value=0表示S.P队列中有进程等待分配该类资源,应唤醒其中的一个进程 用信号量机制实现N进程间的互斥 为N个进程设置一个互斥的信号量mutex, mutex.value为1(实现互斥) 进程进入临界区前用P(mutex)操作申请资源 进程退出临界区后用V(mutext)操作释放资源 struct semaphore mutex; mutex.value=1; //初始化资源数量为1 cobegin void process1(void) { while( 1 ) { P(mutex); .....; //进程1访问临界资源 V(mutex); ......;//非临界区代码 } } ...... void processN(void) { while( 1 ) { P(mutex); .....; //进程N访问临界资源 V(mutex); ......;//非临界区代码 } } coend 解决老问题 struct semaphore S = 1; // S.value = 1; P1: P( S ); R1=count; R1=R1+1; count=R1; V( S ); P2: P( S ); R2=count; R2=R2+1; count=R2; V( S ); 进程同步 进程同步: 多个合作进程为了完成同一个任务,在执行速度上必须相互协调。 进程同步的例子 计算与打印的同步关系 互斥与同步的区别 互斥是进程间竞争共享资源的使用权,这种竞争无固定的必然关系。 同步是涉及共享资源的并发进程间有一种必然的依赖关系,即使没有进程在使用共享资源,尚未得到同步消息的进程仍不能去使用该资源。 用信号量机制解决进程同步 struct semaphore SC,SP=1,0; number x, y , buffer; cobegin void CP( void ) //computer process { while ( 1 ){ x = computer(); //计算并将结果存于x P( SC ); //请求存数 buffer = x; V( SP ); //与打印进程同步 } } void PP( void ) // print process { while( 1 ){ P( SP ); //请求取数 y=buffer; V( SC ); //与计算机进程同步 print y number; } } coend 用信号量机制解决

文档评论(0)

沃爱茜 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档