操作系统(二十二)用信号量机制实现进程互斥、同步、前驱关系
2.3.5 用信號量機制實現進程互斥、同步、前驅關系
目錄
2.3.5 用信號量機制實現進程互斥、同步、前驅關系
2.3.5.1?用信號量機制實現進程互斥
2.3.5.2?用信號量機制實現進程同步
2.3.5.3?信號量機制實現前驅關系
2.3.5.1?用信號量機制實現進程互斥
? 由之前的學習我們知道進程互斥就是在同一時間訪問臨界資源的進程只能有一個。并且P操作是申請資源并上鎖的原語,V操作時釋放資源并解鎖的原語,我們引用一個互斥信號量mutex表示進入臨界區的名額,并設置初值為1來實現進程互斥。
? ?1. 分析并發進程的關鍵活動,劃定臨界區(如:對臨界資源打印機的訪問就應放在臨界區)
? ?2. 設置互斥信號量 mutex,初值為 1
? ?3. 在進入區 P(mutex)——申請資源
? ?4. 在退出區 V(mutex)——釋放資源 這里需要注意:P(mutex)與V(mutex)必須成對存在,如果缺少P那么互斥性就不可以保證,如果缺少V就導致資源不能解鎖,并且等待進程永遠不會被喚醒。2.3.5.2?用信號量機制實現進程同步
? 進程同步就是將并發進程按照一定要求有序推進,以解決并發性帶來的問題。
??1. 分析什么地方需要實現“同步關系”,即必須保證“一前一后”執行的兩個操作(或兩句代碼)
? 2. 設置同步信號量 S, 初始為 0
3. 在“前操作”之后執行 V(S) 4. 在“后操作”之前執行 P(S) 以下面的操作為例,解釋一下這四個步驟的原因: semaphore S = 0; //初始化同步信號量,初值為0P1(){操作1;操作2;V(S);操作3; }P2(){P(S);操作4;操作5;操作6; }? 以上的代碼可以保證操作2發生在操作4之前。因為異步性導致的問題我理解就是資源不足,因為第二步需要第一步所帶的資源。所以同步信號量設為了0而非1(1的話意思就是資源十分充足,誰想用訪問就行)。因為操作2要發生在操作4之前就是說操作2要為操作4帶來所需資源,所以解鎖就是釋放資源,一定要在前操作之后使用。
2.3.5.3?信號量機制實現前驅關系
? 前驅關系就是一個同步問題,即某一操作必須在一個操作之后。下圖所示的前驅關系:S2必須在S1之后產生,S6必須在S4 S5 S3都完成之后進行。
實現步驟如下:
??1. 要為每一對前驅關系各設置一個同步信號量
? 2. 在“前操作”之后對相應的同步信號量執行 V 操作
? 3. 在“后操作”之前對相應的同步信號量執行 P 操作
總結
以上是生活随笔為你收集整理的操作系统(二十二)用信号量机制实现进程互斥、同步、前驱关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 这些数据分析方法你都掌握了么
- 下一篇: java信息管理系统总结_java实现科