2015-10-14 107 views
0

在Linux平臺的ARM內核實現中,將tasklet中的延遲工作添加到percpu vec | vec_hi列表中。爲什麼同一個TASKLET不能同時在兩個內核上執行?

  1. 現在從ISR執行返回時,它會去處理softirq和tasklets中的延遲工作。
  2. 現在這個延遲工作可以在IRQ啓用的中斷上下文中處理,或者有可以在進程上下文中處理它的ksoftirq線程。
  3. 相同的tasklet將在ksoftirq線程爲percpu的同一CPU上執行。
  4. 我已經看到很多書籍,例如LDD,Robert Love的書,聲稱同一個tasklet不能同時在兩個內核上執行?

怎麼樣?有人可以幫助我...如果是這樣,我錯過了什麼?

回答

1

確實如此。雖然可以在任意數量的CPU上調度tasklet(即請求tasklet執行),但它只能在一個CPU上執行。

原因是我相信要簡化開發模型:爲了更容易實現本質上是中斷處理程序的內容,而不必擔心由於在多個處理器上同時執行而導致的競爭 - 並且不禁用其他中斷。 (很明顯,還有很多其他的賽車開發者需要了解的比賽機會,但這些都是最難解決的。)

如果你問的是實現,那實際上很簡單。在tasklet_actiontasklet_trylock被調用。它使用保證原子功能test_and_set_bit來設置TASKLET_STATE_RUN位。這隻能在一個處理器上成功。因此,所有其他處理器都會被禁止執行該tasklet,直到該位被清除 - 這隻能由在tasklet完成後設置它的處理器完成。

編輯:
澄清:上的任何數量的CPU調用tasklet_schedule(在執行之前)在微進程結果被執行一次:所述第一CPU進行呼叫上。同樣的機制(test_and_set_bit)可以確保如果tasklet已經在其他某個CPU上被調度過但尚未被執行,那麼將而不是添加到後面的C​​PU上的tasklets-to-run隊列中(因此贏得'根本不會在後面的CPU上執行)。另一方面,如果它已經開始在第一個CPU上執行,那麼TASKLET_STATE_SCHEDULE位將被清除(因此可能會被重新設置),因此另一個調用tasklet_schedule可確保最終將重新指定該tasklet。 - 在後面的CPU上執行,但直到它在第一個CPU上運行完成後才執行。

+0

感謝回答,我明白這一點,但我的觀點是,我創建一個微進程並將其添加到hi_vec上我的ISR來了,現在它會通過一個percpu線程ksoftirq送達的CPU,所以肯定會執行現在如果對於其他某個CPU上的相同ISR,我們會使用該核心的HI_VEC列表來提交相同的任務小程序。然後,相同的任務小程序將在兩個核心上執行。在兩個每個cpu線程的上下文中,ksoftirq/x和ksoftirqx1,現在聲稱一個tasklet不能同時在兩個內核上執行。這種說法是錯誤的,你建議什麼? –

+0

謝謝budy ,,我明白了..非常感謝.. –

0

softirqs是下半部中斷處理,它基於一個基於索引的函數調用機制,其中函數實現了softirq的功能。

保持一個函數指針數組。當softirq被註冊時,一個有效的函數指針被寫入適當的索引。該索引代表softirq的 號碼,0是最高優先級softirq。一個字作爲未決softirq的掩碼來維護。

softirq當前9的數量由一個字的每一位表示,當sofirqs被提升時,掩碼中的相應位被設置。當內核想要運行未決的softirqs時,它會使用被屏蔽的字來標識待定softirqs,並使用數組調用適當的函數調用,該數組的第0個索引與掩碼字的第0位映射。

微進程被實現在軟中斷,索引0和陣列的索引5包含指針,它們分別處理高和正常微進程的功能。 Tasklet使用包含函數指針和其他成員中的狀態標誌的結構來標識。

每當創建微進程,一個結構被創建,填充用實現這個tasklet的函數的地址的函數指針。維護所有這些結構的鏈接列表。 當tasklet被調度時,它(內核)向鏈表的頭部添加一個相應的結構並且提高tasklets的softirq,即在掩碼字中設置適當的位。

接下來,當調用處理tasklet的函數時,它檢查鏈表的所有元素,並在狀態標誌未運行時調用結構中的函數,這表明它已經在處理器中運行。

因此內核確保沒有2級相同的任務蕾在多個處理器上運行。

相關問題