2012-04-19 190 views
24

在SMP(Symmetrix多處理器/多核)機器上如何處理中斷?是否只有一個內存管理單元或更多?SMP如何處理中斷?

說兩個線程,運行在不同內核上的A和B觸及頁表中不存在的內存頁面(在同一時間),在這種情況下會出現頁面錯誤並導入新頁面來自記憶。

什麼是將發生的事件序列?如果有一個內存管理單元,哪個核心是頁面錯誤轉發給的?內核如何處理它?是否有多個內核實例,每個都運行在不同的內核上?如果是這樣,他們如何同步頁面錯誤處理等事件?

回答

7

在多核/多處理器體系結構上,APIC用於將中斷路由至內核/處理器。顧名思義,APIC可以被編程爲根據需要進行路由。

關於內核的同步:這取決於內核/操作系統。您可以使用帶有鎖定的方案(儘管IPI在非高速緩存一致的體系結構上可能是必需的),也可以使用您在每個核心上運行內核的建議方法,並使用某種明確的內核間通信。

Barrelfish是運行多個內核的OS的一個例子。如果你有興趣在那樣的建築,你可能需要閱讀的文件「The Multikernel: A new OS architecture for scalable multicore systems

8

嗯,這取決於具體的架構,但是從我可以從英特爾文檔記得......

有中斷的兩個主要來源:

  • 內部:這是由產生CPU本身。包括故障,陷阱,軟件中斷等。
  • 外部:這些是由外設生成的硬件中斷。

內部中斷總是被傳送給產生它的CPU。外部的是發送到arbirary核心。

在現代模型中,也可以使用類似總線的系統而不是舊的中斷驅動程序來提供中斷,但是如果此模型在任何當前操作系統中使用,則忽略。

關於MMU,當然每個內核都有自己的內核,但是它們通常被操作系統強制爲相同的段,因此它們可以對稱使用。請注意,物理和虛擬內存之間的大部分映射實際上都在內存中,並且始終是共享的。

關於在你的榜樣序列:

  • 頁面錯誤被轉發到生成它的核心。
  • 內核更新其MMU表,受共享鎖或類似的保護。
  • 不,只有一個內核,通常情況下,除非您應用虛擬化模型。
  • 它們使用共享鎖或類似結構進行同步。如果兩個核心在同一頁面發生故障,那麼實際上這並不是什麼大問題。
+0

同樣,請看Barrelfish作爲多內核的例子。單片內核方法不能超越數百個內核。 – mensi 2012-04-20 09:34:03

+0

@mensi - 當然,但我認爲OP更多地提到了主流操作系統,特別是Linux,因爲他包含了該標籤。而且AFAIK數百個內核還不是一個可擴展性問題...... – rodrigo 2012-04-20 16:40:37

1

每個邏輯CPU(即CPU內核),有它自己的cr3寄存器,處理指針分頁結構。這兩個頁面錯誤,可能會發生兩種:

  • 在同一進程
  • 的線程在不同進程的線程

如果這些不同進程的線程,那麼它是沒有問題的。我不知道什麼是Linux特有的實現這個(是的,我知道這是標記爲「LINUX」),但一般有兩種算法在SMP環境中管理虛擬內存:

  • 每個核心擁有它自己的當自己的列表中的所有頁面被分配時,免費物理頁面和請求的列表更多
  • 所有內核都使用相同的空閒頁列表,受到某種鎖的保護(通常是螺旋鎖就足夠了),這是當然速度較慢的解決方案

相同的代碼(#PF處理程序)可以在兩個不同的內核上同時執行,這不是一個問題EM。如果線程使用兩個不同的VAS ,那麼它們的頁面錯誤只是對稱地處理。如果頁面錯誤發生在單個VAS中,那麼它仍然沒有問題,直到#PF是由訪問同一頁面引起的。在這種情況下,VAS中的每個頁面都應該受到自旋鎖的保護(或者只是給定VAS中的#PF可以通過單鎖來保護 - 這樣可以減少內存開銷,但可以同時運行兩個#PF處理程序)。

根據this answer,只有在NUMA系統中,每個CPU核心都有自己的MMU;在其他系統中,每個物理處理器都有它自己的MMU,以及TLB來處理由cr3寄存器的不同值引用的不同分頁結構。


1. VAS =虛擬地址空間

0

我沒有拿到,通常內核規則,他們的人都「內核的多個實例」。這意味着它沒有實例,相反,應該將內核看作是爲應用程序提供服務的全局響應系統。據我所知,內存處理是一個單元(儘管每個內核都有自己的中斷向量),頁面被鎖定使用page_table_lock,因此頁面檢索只按照鎖定的順序執行一次。

**編輯:看到對方的意見後,我的答案可能是過時的:反正你應該檢查:http://www.xml.com/ldd/chapter/book/ch13.html

+0

「內核的多個實例」,他的意思是「多個#PF處理程序同時運行」。 – Griwes 2012-04-19 19:35:41

+0

有關「內核的多個實例」的示例,請參閱我在我的回答中鏈接的論文 – mensi 2012-04-19 19:36:20

3

每個處理器都有自己的內存管理單元轉換後備緩衝器。這是必要的,因爲每個內核都可以執行具有不同地址空間的不同進程。

多核可以同時獨立處理中斷/異常。因此,可以同時在內核中執行多個併發中斷上下文。

頁面錯誤或被零除的異常將始終在其出現的同一處理器上處理,因爲它與該處理器正在執行的操作有關。

外部中斷通常會經過某種交換結構,使它們能夠以靜態或動態方式映射到處理器。例如。 PC類型硬件上的「APIC」。

如果結構足夠複雜,那麼可以將中斷重新編程爲針對不同的內核。

這取決於體系結構。例如,一個簡單的架構可以將所有外部中斷連接到一個內核。這不會是非常對稱的;它不會允許IRQ負載平衡。如果每個內核都有自己的中斷定時器,那麼在調度器中處理時間片就是對稱的:這裏有一個例子:定時器中斷。沒有特殊的情況下處理一個主核心相對於其他核心中斷,核心運行調度程序代碼,並且如果當前任務的時間段結束,它會選擇另一個任務在該核心上運行。)

+0

酷;我喜歡你如何稱它爲「面料」。 ARM arch的任何細節(如OMAP3/4)?謝謝。 – kaiwan 2012-06-28 01:47:39