2017-08-10 78 views
3

據我所知,同步可以在單核處理器使用旗語輕鬆完成。但是,如果我們有多核心,如果多個進程想要在相同的時刻進入臨界區,那麼它們全部進入臨界區還是隻有一個勝出?贏家流程贏得了什麼標準?同步在多處理器系統

回答

0

信號量只是在一個系統中通過線程進行信號傳遞的方式之一。您可以在一個或多個核心CPU中使用不影響其使用情況的信號量。

現在讓我們回到你的問題。如果你有關鍵部分,並且多個線程想要進入該區域,他們將全部進入該區域。您需要了解主線程(例如)或其他可以啓動它們的線程,它們之間會有一定的時間間隔(幾個ns周圍的時間空間非常小)。 因此,這就是爲什麼我們使用信號化,因爲我們不想要「勝利者」,而另一方面,在幾乎所有情況下,線程都可以在該關鍵部分進行不必要的更改。

在單核系統只能實現的,因爲不同的胎面用剛剛併發進程調度(假的平行度,經由的TaskScheduler)必須通過分配的時隙共用芯。

+0

感謝您的回答。其實我是在講關於Process而不是線程。因此,對於幾個不同的過程,它們是彼此獨立的,我們不能在這些過程之間做出很小的時間差異,就像你說的應用於線程一樣。 –

1

當兩個內核試圖在同一時間進入臨界區,它們都嘗試寫入信號量內存的同時,使用鎖定讀 - 修改 - 寫操作。爲了使核心完成寫入,緩存必須獨佔訪問包含信號量的緩存行。這迫使另一個核心將該行標記爲無效。緩存協議確保只有一個內核可以獲得獨佔訪問權限,並且該內核進入關鍵部分。

同時,其他核心,這也嘗試寫入信號量,必須等待,因爲它仍然需要高速緩存行的獨佔訪問。只要第一個內核完成其寫入操作,另一個內核便獲得獨佔訪問權並可完成其讀取 - 修改 - 寫入。但是讀 - 修改 - 寫的結果告訴它信號量很忙,所以它只有在檢測到信號量​​已被釋放後才能進入臨界區。

1

即使多個內核都存在,信號量(或互斥,或大多數其他的同步原語)的工作原理一樣的 - 只有線程指定數目可以輸入信號量。如果它只適用於單處理器機器,那它確實是一個糟糕的信號量!

有使這項工作所需的多種機制,我會盡量給一個高水平的視圖。

請注意,內存仍然在不同的內核之間共享。瞭解如何使用共享內存同步核心的簡化但IMO有用的方法是CMPXCHG instruction。這條指令可以自動地(見下面的更多細節)比較並設置一個存儲器地址。如果內存地址有你正在比較的值,它也會將零標誌設置爲1。

考慮下面的代碼:

wait: 
mov eax, 0 
mov ecx, 1 
lock cmpxchg [address of lock], ecx 
jne wait 
// We now own the lock 

代碼邏輯迴路執行以下操作:設置僅當值爲0

此代碼可以由多個內核運行,並且cmpxchg的原子性保證只有一個核心會勝出。

如果每個內核都有自己的緩存(現在通常如此),情況會變得更加複雜。對於單獨的緩存,每個核心都有自己的內存視圖,因此必須小心確保這些內存視圖一致。簡短的回答是,這可以通過在數據更改時讓緩存通知對方來完成,以便其他緩存可以在需要時使其副本無效或更新。查看snooping和MESI協議以獲取更多細節。請注意,如果內核位於同一個物理芯片上,那麼它們都將競爭內存總線,並且有在內核之間共享它的機制(例如仲裁機制;也可以查詢LOCK指令)。

+0

cmpxchg有兩個操作數。那麼,其實三個,但EAX是隱含的。 – prl