剛剛開始想這個(gè)問(wèn)題的時(shí)候,覺(jué)得好像這個(gè)根本就不是一個(gè)問(wèn)題.學(xué)操作系統(tǒng)的進(jìn)程間的通信時(shí),就是先說(shuō)用互斥鎖解決兩個(gè)進(jìn)程同時(shí)訪問(wèn)臨界區(qū)的方法.但是后來(lái)Dijkstra對(duì)于哲學(xué)家進(jìn)餐的問(wèn)題的解答使用了信號(hào)量,于是我們接受了信號(hào)量.在看pthread的時(shí)候,發(fā)現(xiàn)還有個(gè)自旋鎖.于是有點(diǎn)暈,這兩個(gè)不都是控制對(duì)臨界區(qū)的訪問(wèn)的么?怎么都上來(lái)了?他們之間有什么區(qū)別,他們又都是怎么實(shí)現(xiàn)的?
首先說(shuō)自旋鎖.這個(gè)實(shí)現(xiàn)基本上是和TSL相同.TSL指令,首先是要共享一個(gè)lock,當(dāng)進(jìn)入臨界區(qū)時(shí),首先將lock復(fù)制到寄存器,然后將lock置為1,接下來(lái)看寄存器中的值是否為0,為0進(jìn)入.不為0返回.而最重要的是它能保證指令執(zhí)行的不可分割性,也就是說(shuō)在這條指令結(jié)束之前,其他指令不允許訪問(wèn)內(nèi)存.實(shí)現(xiàn)的是方式是在指令執(zhí)行之前將內(nèi)存總線禁止.結(jié)束后在打開內(nèi)存總線.而自旋鎖實(shí)現(xiàn)就是這個(gè)樣子.只不過(guò)多循環(huán)了幾次.為了更好的讓cpu調(diào)度,在嘗試一定次數(shù)后返回.因?yàn)樗且恢痹谀沁呇h(huán)所以叫做自旋鎖.可見這種鎖很耗資源.但是速度上來(lái)說(shuō)很快.一旦鎖釋放,立刻可以得到資源.
再來(lái)看看信號(hào)量,信號(hào)量的實(shí)現(xiàn)就不這般精準(zhǔn)了.如果使用一個(gè)信號(hào)量來(lái)控制一個(gè)臨界區(qū)的話.就會(huì)有很多情況,首先最明顯的是讀者-寫者問(wèn)題.可以有多個(gè)讀者,寫者只可以有一個(gè).并且信號(hào)量的實(shí)現(xiàn)也和自旋鎖有者一定的區(qū)別.當(dāng)一個(gè)信號(hào)量不能訪問(wèn)后.進(jìn)程不會(huì)在那里循環(huán),會(huì)被睡眠掉.當(dāng)信號(hào)量可以使用的時(shí)候,調(diào)度器會(huì)從可以調(diào)度的進(jìn)程選擇一個(gè).
基本上就這個(gè)樣子.
首先說(shuō)自旋鎖.這個(gè)實(shí)現(xiàn)基本上是和TSL相同.TSL指令,首先是要共享一個(gè)lock,當(dāng)進(jìn)入臨界區(qū)時(shí),首先將lock復(fù)制到寄存器,然后將lock置為1,接下來(lái)看寄存器中的值是否為0,為0進(jìn)入.不為0返回.而最重要的是它能保證指令執(zhí)行的不可分割性,也就是說(shuō)在這條指令結(jié)束之前,其他指令不允許訪問(wèn)內(nèi)存.實(shí)現(xiàn)的是方式是在指令執(zhí)行之前將內(nèi)存總線禁止.結(jié)束后在打開內(nèi)存總線.而自旋鎖實(shí)現(xiàn)就是這個(gè)樣子.只不過(guò)多循環(huán)了幾次.為了更好的讓cpu調(diào)度,在嘗試一定次數(shù)后返回.因?yàn)樗且恢痹谀沁呇h(huán)所以叫做自旋鎖.可見這種鎖很耗資源.但是速度上來(lái)說(shuō)很快.一旦鎖釋放,立刻可以得到資源.
再來(lái)看看信號(hào)量,信號(hào)量的實(shí)現(xiàn)就不這般精準(zhǔn)了.如果使用一個(gè)信號(hào)量來(lái)控制一個(gè)臨界區(qū)的話.就會(huì)有很多情況,首先最明顯的是讀者-寫者問(wèn)題.可以有多個(gè)讀者,寫者只可以有一個(gè).并且信號(hào)量的實(shí)現(xiàn)也和自旋鎖有者一定的區(qū)別.當(dāng)一個(gè)信號(hào)量不能訪問(wèn)后.進(jìn)程不會(huì)在那里循環(huán),會(huì)被睡眠掉.當(dāng)信號(hào)量可以使用的時(shí)候,調(diào)度器會(huì)從可以調(diào)度的進(jìn)程選擇一個(gè).
基本上就這個(gè)樣子.