通过一道题目来理解互斥和同步
文章目錄
- 前言
- 題目:判斷下列問題的算法是否正確?若不正確,如何改正?
- 解答與剖析
- 第一小問:同步問題
- 解答
- 剖析
- 第二小問:互斥問題
- 解答
- 剖析
前言
在進程的學習中,互斥和同步是最重點的內容,但由于其過于抽象,繁雜的信號量的使用令同學們望而生畏,本博客的目的是想通過對一道題目的解析來探究互斥與同步最本質的特性。由于博主水平有限,還懇請大家批評指正。
題目:判斷下列問題的算法是否正確?若不正確,如何改正?
解答與剖析
第一小問:同步問題
解答
上圖中的算法是有誤的。假如進程A先運行,并且待存入緩沖區的信息數量很大,那么每一次存入新的信息時,原來已存入的信息就會丟失(每次只能存入一條消息),所以得想辦法讓進程A存入一條消息時,進程B就會接著運行并且取走進程A存入的那條消息。
那么我們要做的事情就明確了,題干中提到進程A“寫”,進程B“讀”,說明它們之間有合作關系,那么這就是同步問題。
待解決的問題如下:
① 必須讓進程A先運行,這樣才能保證進程B運行時有信息可以取;
② 進程A每次只能存入一條消息。
正確答案:
那為什么正確答案是這樣子的呢?請看剖析。剖析
首先,設置empty=1,full=0,為什么呢,可以這樣理解:empty=1說明是緩沖區是空的,full=0說明緩沖區不是滿的。(在本例中假設非空=滿)
當進程A執行時,empty變為0,full變為1,此時進程B就可以執行了(進程A未執行時full=0,此時進程中的代碼P(full)無法執行,故無法訪問緩沖區)。
我們可以看到,在同步中,其實也蘊含了互斥,而且同一個信號量一般都是放在不同的進程中的,這樣子才能通過對某共享資源的共同存取協同完成某項任務。
所以說實現同步時,要注意至少有一個信號量是放在不同進程中的,因為至少要兩個人要成實現所謂的協同,并且,既然要合作,那么他們肯定都掌握著某種共同的東西(這里指信號量),通過對這種東西進行操作而實現協同完成某項工作。
第二小問:互斥問題
解答
上圖中的算法是有誤的。題干提到,A、B是并發進程,他們共享一個臨界資源,說明A、B之間是競爭關系,并且它們之間無合作關系,所以可判斷這是互斥問題。
正確答案:
剖析
首先,設置信息量mutex(可以隨意命名),默認值為1(最重要的一點,無特殊情況下,互斥的信息量都是設置為1)。
此時,因為A與B是并發執行的,由于不確定性,A、B的執行順序是不確定的。無論是哪個進程先執行,在這里假設A先執行了,當A執行了P(mutex)之后,mutex變為0,這樣,B進程將無法訪問臨界資源,當A進程的代碼執行后,再執行V(mutex),mutex變為1,這個時候,所有進程就可以再次爭奪訪問臨界資源的資格(A進程也可繼續爭搶,因為操作系統的不確定性,各進程的執行順序是不確定的)。
完。
總結
以上是生活随笔為你收集整理的通过一道题目来理解互斥和同步的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作者:赵菁华(1977-),女,中国电子
- 下一篇: 作者:郑飞翔(1982-),男,中国农业