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)的問題。

讀者留言 (0)

留言功能維護中。將於近日重新開放。

連絡作者

Jollen Chen,Moko365(仕橙3G教室)講師,熱愛研究 Linux 與 Android 技術。曾為 Motorola、HTC、Foxconn、LG、OPPO、騰迅、廣達電腦、緯創、仁寶等超過 50 家企業講授課程。目前在 MokoVersity 擔任軟體工程師,撰寫 Node.js 程式,也在幾家科技廠兼任 Android Framework 研發顧問。您可透過電子郵件 <jollen (at) jollen (dot) org> 或這裡與我連絡。