Linux 驅動程式的 Semaphore 觀念小談

jollen 發表於 January 20, 2008 10:53 AM

這二天在進行 Linux 驅動程式的訓練,課程裡談論到 semaphore 可以用來宣告 critical section。在作業系統所述敘的 critical section 觀念中提及,critical section 具備互斥性(mutual exclusive)與單一性(atomic)。對單一性來講,我們必須確保在 critical section 裡不會發生任何的排程(scheduling)動作,wait queue 的使用就是一個例子。Linux kernel 提供的 wait queue 可以讓驅動程式在進行 I/O polling 時,以睡覺(sleep)方式進行,以讓出系統時間;若以 busy-loop 方式進行,是不正確的做法。

所以,sleep 的動作就不能寫在 critical section 裡面,必須先做一個釋放的動作,再呼叫 wait queue 的 API 做睡覺的動作,醒來後再進入 critical section。但是,事情並沒有這麼單純,若是驅動程式的架構設計,能支援多個 minor device,就必須考慮可重覆進入的問題,這個時候,semaphore 的信號燈(semaphore variable)就要放在私有空間裡,Linux 驅動程式用 struct file 裡的 private_data 欄位來實作。對 wait queue 來講,我們也是將 wait queue 變數擺放在私有空間裡。

從互斥性的角度來講,semaphore 的使用可能是要用來保護資料,以避免資源衝突,因此將程式碼互斥。只是,kernel 所提供的睡覺 API,在真正重做排程前,還有對傳入的參數做存取,而這個參數就是擺在私有空間裡的 wait queue,於是便可能仍有同步(race condition)的問題。

Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue

您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw