2010-09-03 58 views

回答

6

它增加preempt_count() - 注意() - 這是一個宏定義爲:

#define preempt_count() (current_thread_info()->preempt_count) 

所以它是增加每線程變量,它不需要任何鎖和安全。


最好是問你多等問題作爲單獨的問題,但簡要地說:

  • 中斷處理程序一般可以通過其他的中斷處理程序被中斷;
  • 中斷處理程序可以在一個CPU內核上運行,而其他內核代碼在另一個內核上運行;
  • 中斷通常使用硬件機制禁用。這些往往會記住待處理的中斷,但每個中斷向量最多隻能有一個。
+0

非常感謝。你能否回答我的下一個問題。 – mousey 2010-09-03 01:08:04

+0

非常感謝。 – mousey 2010-09-03 03:09:59

+0

@caf和mousey:如果inc/dec也被錯誤處理程序或中斷處理程序調用,它會安全嗎?或者是否有任何規則說不能做到?想法? – minghua 2013-05-26 01:55:47

0

每個現代處理器都有原子test-and-set指令的一些變體。

+1

檢查來源。它不使用任何系統特定的說明。它只是增加 – mousey 2010-09-03 00:23:42

1

對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)全部完成爲止。