關於鎖

簡單筆記一下鎖的概念

關於鎖(lock)

畢業後,太久沒有用到相關的東西,概念開始和資料庫的transaction有點混淆了,所以拿出恐龍本讀回來。順便做一篇筆記

一些專有名詞

名稱 說明
cooperation process (協作行程) 會操作到共同資源的不同process
critical section 在各種cooperation process 裡面會操作到共同資源的code區塊

鎖想解決的問題

在多核心多執行序問世之前的單核心的時代,是一個核心切換來切換去的做不同事,在時間區間上每個時間點都只有一個process正在被cpu執行,如下圖。

單核心運作示意圖

而在多核心問世以後開始會出現一些問題,如下圖。

多核心的運作示意圖

開始會發生圖上,兩個核心會同時執行不同的process ,這個時候可能會發生互相改到資料的問題。例如process B和D是要在印表機上面印出現在電腦的時間,就有可能會發生一下的輸出:

假設兩個核心在執行processB和D的時間點是15:3815:40

15:153:840

這是因為兩個核心互相搶著輸出到印表機,但是順序亂掉的緣故。為了解決這個問題,鎖的概念被提了出來。

鎖的用途

用來保護注critical section(以上面的例子來看,是Process B和Process D裡面,執行輸出資料到印表機的code block)。強制這兩個critical section,在同一個時間裡面,頂多只能有一個執行,另一個想要執行,得要等到另一個結束後,才能開始動作。

鎖的種類

mutex lock(互斥鎖)

又稱自旋鎖,會讓這個process一直卡在loop裡面,直到能夠存取資料後,才跳出迴圈,開始執行這個critical section。

因為實際上是一直在執行loop的狀態下做等待資源釋放的,所以它不需要使用到context switch,在獲得資源後的切換速度很快。所以常常被使用在共用資源都只會被佔用短短時間的情境下使用。

mutex lock的概念是一個被相同mutex lock保護起來的多個critical section,一個時間裡只能有一個被執行,其他都得要等待它mutex lock釋放後,才能繼續搶,搶到的才能執行。

semaphore lock(號誌鎖)

和mutex lock不同,可以設定資源同一時間下,最多可以有S個process同時執行,當同時執行的critical section數目大於S時,會被停下來,等待到同時執行的critical section小於S時,才能繼續搶進去執行。

如果要用mutex lock的方式執行,會讓很多process一直在執行loop,對於資源的浪費太大了,所以在semaphore lock的時候,會採用將process 暫停,將address存到lock S 的list裡面。等到有process把S給釋放,此時CPU會將S裡面的list,取出一個process出來執行。

我混淆的概念釐清

  • 鎖不是鎖住cpu,而是鎖住其他一樣需要這個鎖的process,讓同一個鎖保護的同一個(或者不同個)critical section ,一次最多只能有1(或者semaphore lock設定的數字)個process存取。

  • 被鎖保護住的critical section,只要裡面有存取某個共用資源的code,就能讓這項資源被鎖給保護,不被濫用。

結論

鎖的概念就是為了要保護有限的資源,不要被無限的取用。例如可以利用鎖來保護對同一個檔案的更改,讓這個檔案一次只能被一個process更新,防止檔案內資料變得亂七八糟的。

comments powered by Disqus