- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统第3章_2概要1
avail:array[1..2] of semaphore =(n1,n2)full :array[1..2] of semaphore =( 0 , 0 )mutex[2][max(n1,n2)]:每个有界缓冲区一个,保证一对一操作。 Send(i,m) Begin 在队列i中选一空缓冲区 j 把m送入空缓冲区,置满标志 End Receive(i,m) Begin 在队列i中选一满缓冲区 j 从满空缓冲区取数到m ,置空标志 End P(avail[i]) V(full[i]) P(full[i]) V(avail[i]) P(mutex[i][j]) V(mutex[i][j]) P(mutex[i][j]) V(mutex[i][j]) PA 、 PB动作的描述 PA: 加工生成消息resultA Send(1,resultA) Receive(2,materialA) Goto PA PB: Receive(1,materialB) 加工生成消息resultB Send(2,resultB) Goto PB * 讨论: 1、用于互斥的P(mutex)和V(mutex)必须在各进程中成对出现; 2、针对avail和full的P、V操作也成对出现,不过分别位于合作的两个进程中; 3、一个进程的两个P原语位置不能颠倒:先私后公 4、一个进程的两个V原语位置可以颠倒。 * 实例2:哲学家进餐问题 要求: 1、只有拿到两支筷子才能吃饭; 2、若筷子已被人拿起,只能等别人放下后才能拿; 3、任意一人先拿到一支筷子后,在没有拿到另一支筷子前决不放下第一支。 5位哲学家围着摆放5支筷子的圆桌,交替思考问题和进餐。 * 临界资源:筷子(两两共用一支筷子) 五支筷子的状态 — 五个信号量描述: 1 — 空闲;0 — 已被占用;-1 — 一人占用,一人等待 并发进程的描述:哲学家的活动:进餐— 思考 是否获得临界资源(筷子)进餐,通过分别对其左右的筷子状态测试,只有同时获得,才能进餐。 * var chopstick: array[0..4] of semaphore :=(1,1,1,1,1); 第i个哲学家的活动进程: Process(i): eat think goto process(i); 保证不会有相邻两人同时进餐,但五人同时进行左筷子的测试并拿起左筷子,会怎样? 大家饿死 方法一:最多允许4人同时要求进餐,保证至少有一人会成功。 另设一个公用信号量 var s = 4 P(s); V(s); P(chopstick[i]); P(chopstick[(i+1)mod5]); V(chopstick[i]); V(chopstick [(i+1)mod5]); * 方法二:仅当左右两支筷子均可用时才能拿起。 Process(i): think SP(chopstick[i] , chopstick [(i+1)mod5]); eat SV(chopstick[i] , chopstick [(i+1)mod5]); goto process(i); SP(s1,s2) if (s1=1 and s2=1) then s1 = s1 - 1 s2 = s2 - 1 else 阻塞所在进程,进程调度 endif SV(s1,s2) s1 = s1 + 1 s2 = s2 + 1 唤醒等待s1或 s2的阻塞进程 * * 第三章、进程管理 3.1 进程的概念 3.2 进程的描述 3.3 进程状态及其转换 3.4 进程控制 3.5 进程互斥 3.6 进程同步 3.7 进程通信 3.8 死锁问题 3.9 线程 * 3. 5 进程互斥 一、进程制约方式: 1、间接相互制约:由资源共享引起——进程互斥解决 2、直接相互制约:由进程合作引起——进程同步解决 二、临界区(Critical Section) 临界区:不允许多个并发进程交叉执行的一段程序,访问临界资源的那段程序。 临界资源:一次仅允许一个进程使用的资源 P1: R1 = C P2: R2 = C R1 = R1 + 1 R2 = R2 + 1 C = R1 C = R2 * 堆栈操作: Procedure getaddr(top) begin local r r
文档评论(0)