據我所知,同步可以在單核處理器使用旗語輕鬆完成。但是,如果我們有多核心,如果多個進程想要在相同的時刻進入臨界區,那麼它們全部進入臨界區還是隻有一個勝出?贏家流程贏得了什麼標準?同步在多處理器系統
回答
信號量只是在一個系統中通過線程進行信號傳遞的方式之一。您可以在一個或多個核心CPU中使用不影響其使用情況的信號量。
現在讓我們回到你的問題。如果你有關鍵部分,並且多個線程想要進入該區域,他們將全部進入該區域。您需要了解主線程(例如)或其他可以啓動它們的線程,它們之間會有一定的時間間隔(幾個ns周圍的時間空間非常小)。 因此,這就是爲什麼我們使用信號化,因爲我們不想要「勝利者」,而另一方面,在幾乎所有情況下,線程都可以在該關鍵部分進行不必要的更改。
在單核系統只能實現的,因爲不同的胎面用剛剛併發進程調度(假的平行度,經由的TaskScheduler)必須通過分配的時隙共用芯。
當兩個內核試圖在同一時間進入臨界區,它們都嘗試寫入信號量內存的同時,使用鎖定讀 - 修改 - 寫操作。爲了使核心完成寫入,緩存必須獨佔訪問包含信號量的緩存行。這迫使另一個核心將該行標記爲無效。緩存協議確保只有一個內核可以獲得獨佔訪問權限,並且該內核進入關鍵部分。
同時,其他核心,這也嘗試寫入信號量,必須等待,因爲它仍然需要高速緩存行的獨佔訪問。只要第一個內核完成其寫入操作,另一個內核便獲得獨佔訪問權並可完成其讀取 - 修改 - 寫入。但是讀 - 修改 - 寫的結果告訴它信號量很忙,所以它只有在檢測到信號量已被釋放後才能進入臨界區。
即使多個內核都存在,信號量(或互斥,或大多數其他的同步原語)的工作原理一樣的 - 只有線程指定數目可以輸入信號量。如果它只適用於單處理器機器,那它確實是一個糟糕的信號量!
有使這項工作所需的多種機制,我會盡量給一個高水平的視圖。
請注意,內存仍然在不同的內核之間共享。瞭解如何使用共享內存同步核心的簡化但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
指令)。
cmpxchg有兩個操作數。那麼,其實三個,但EAX是隱含的。 – prl
- 1. 進步處理器在android系統列表基礎適配器
- 2. 同步多線程處理器
- 3. 在多代理系統中實現同步
- 4. pthread_singal在多處理器系統上喚醒多個線程
- 5. 線程在單處理器系統
- 6. 多個同步版本控制系統?
- 7. 多線程可以在單處理器系統上實現嗎?
- 8. 多核/多處理器系統上Thread.currentThread()的語義?
- 9. 多處理器和多線程 - 操作系統
- 10. 處理多個登錄系統
- 11. Linux操作系統:系統()+ SIGCHLD處理多線程+
- 12. 文件系統同步庫?
- 13. ArangoDB同步系統集合
- 14. 同步系統活動
- 15. 同步(操作系統)
- 16. MySQL系統啓動同步
- 17. i7處理器與Windows8操作系統的多線程問題操作系統
- 18. pthread API是否在多處理器環境中提供同步?
- 19. Java同步處理
- 20. 處理ajax同步?
- 21. 同步與DFP廣告管理系統中的異步
- 22. 批處理系統如何處理很多對象
- 23. 多處理和數據同步
- 24. 多處理中的Python同步變量
- 25. 處理多個AJAX請求同步
- 26. 單處理器系統可以處理多級隊列調度嗎?
- 27. 單處理器系統上的多線程powershell腳本
- 28. 爲什麼多處理器系統需要禁用中斷
- 29. 多處理器系統上的POSIX線程
- 30. 處理鏈接系統
感謝您的回答。其實我是在講關於Process而不是線程。因此,對於幾個不同的過程,它們是彼此獨立的,我們不能在這些過程之間做出很小的時間差異,就像你說的應用於線程一樣。 –