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