Jollen's email: jollen # jollen.org

more: Jollen's Consulting | Jollen's Wiki

« 下週二的嵌入式系統大拜拜:DTF 2008 Embedded World | Home | OpenMoko 近況更新:Neo FreeRunner、Job Positions 與 Education »

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

引用通告

如果您想引用這篇文章到您的Blog,
請複製下面的鏈接,並放置到您發表文章的相應界面中。

http://www.jollen.org/cgi-bin/mt3/mt-tb.cgi/466

發表一個評論

(您發表的意見將被立即接受,但需要一點時間與後端伺服器做同步,您的留言才會顯示在網站上。為避免 spam 攻撃,按「發表」後請輸入帳號密碼。使用者帳號:「nospam」、密碼:「nospam」。)

[Top] Copyright (C) 2006,2010 www.jollen.org.
All rights reserved. All content licensed under Creative Commons License.