http://lxr.linux.no/linux+v2.6.35/include/linux/preempt.h#L21Linux如何同步搶佔計數
我只是想獲得Linux源代碼。我看到這個搶先計數,以及linux如何確保搶先計數是原子的?代碼只是增加值。
另外我還有一個問題。爲什麼中斷句柄需要保持互斥。因爲只有一個人可以一次執行對嗎?
此外,當中斷被禁用時,OS會做什麼?忽略中斷或保持隊列?
http://lxr.linux.no/linux+v2.6.35/include/linux/preempt.h#L21Linux如何同步搶佔計數
我只是想獲得Linux源代碼。我看到這個搶先計數,以及linux如何確保搶先計數是原子的?代碼只是增加值。
另外我還有一個問題。爲什麼中斷句柄需要保持互斥。因爲只有一個人可以一次執行對嗎?
此外,當中斷被禁用時,OS會做什麼?忽略中斷或保持隊列?
它增加preempt_count()
- 注意()
- 這是一個宏定義爲:
#define preempt_count() (current_thread_info()->preempt_count)
所以它是增加每線程變量,它不需要任何鎖和安全。
最好是問你多等問題作爲單獨的問題,但簡要地說:
對preempt_count變量的操作不是原子操作。線程的搶佔計數的inc和dec之間的代碼區域被保證不被調度程序切換出去。從此代碼區域中當前線程的上下文切換隻能發生在進一步的嵌入式異常或中斷中。第一次inc操作完成後,其他處理程序將看到變量非零,因此不會導致上下文切換。公司完成之前,線程可以切換出來,但沒關係,因爲代碼尚未到達保護區域。
一些細節:原子變量的定義應該像"Atomic variables are the ones on whom the read modify write operation is done as one instruction with out any interruption"。對preempt_count的「讀 - 修改 - 寫」操作可以被另一個異常處理程序或中斷處理程序中斷,但只能以嚴格嵌入的方式進行中斷,即由內核設計。由於這些嵌入式操作是成對的,因此最終不會破壞先佔計數的價值。儘管R-M-W操作可以被中斷並且當前線程可以被切換出來(只有當多個嵌入式公司都沒有完成時),但是沒關係,因爲代碼還沒有到達保護區域。一旦線程被切換回來,它將繼續完成R-M-W操作,並且從當前線程的那一點開始,直到所有成對的dec(s)全部完成爲止。
非常感謝。你能否回答我的下一個問題。 – mousey 2010-09-03 01:08:04
非常感謝。 – mousey 2010-09-03 03:09:59
@caf和mousey:如果inc/dec也被錯誤處理程序或中斷處理程序調用,它會安全嗎?或者是否有任何規則說不能做到?想法? – minghua 2013-05-26 01:55:47