由於每個CPU的核心可以同時處理一兩個線程,那麼即使有多個線程在運行,作業系統如何仍然穩定?

由於每個CPU的核心可以同時處理一兩個線程,那麼即使有多個線程在運行,作業系統如何仍然穩定?

為了解釋更多,假設我們有一個沒有超線程的雙核心CPU,這意味著它只能同時處理2 個線程,那麼,現在假設我們有一個網路應用程式正在運行兩個後台網路線程,每個線程都在等待傳入連接來處理,所以這些線程應該一直運行,現在,為什麼另一個作業系統的進程和線程仍在工作?在我看來,它們無法被處理,因為有兩個線程完全耗盡了CPU 處理單元,因為它們正在等待網路傳入連接,因此,它們應該每納秒準備好連接......這是如何發生和工作的? CPU 如何能夠同時處理許多執行緒而沒有任何明顯的凍結? (我知道,有時,如果同時運行大量繁重的程序,Windows 會變得緩慢而瘋狂,但這不是普遍問題)

謝謝。

答案1

答案相對簡單:當一個執行緒等待 I/O 事件時,它將剩餘的時間片交給作業系統,然後作業系統可以調度另一個執行緒。當高延遲 I/O 完成時,執行緒被標記為準備執行。

這在很大程度上是可能的,因為大多數 I/O 都是透過中斷來管理的,而不是反覆檢查 I/O 請求是否已完成(稱為輪詢)。

答案2

如果您使用協作式多工處理並且程式很糟糕:那麼是的,您是對的。

然而在現實世界中應該會發生以下情況:

  1. 協作多工:我不會永遠使用CPU。相反,它會在一段時間後或在被阻止時給另一個程式一個機會。
    保羅的回答描述了後者。

  2. 搶佔式多工處理(幾乎無所不在):作業系統(而非程式)會將 CPU 短暫交給程序,然後將其收回。這可以像運行計時器一樣簡單,一旦計時器到期,就停止進程並將其交給正在等待的下一個步驟/程序。


在您的情況下,可以將其視為一個有兩名員工和三個(或更多)任務的辦公室。 (我們稱它們為任務 A、任務 B 和任務 C)。

第一個工作人員檢查主管命令,其中規定:

  • 設定計時器 10 分鐘。當它響起時,請停止處理當前任務,將其放在 TODO 清單的底部並繼續閱讀本文檔。
  • 接下來從 TODO 清單頂部刪除第一項並開始處理它。
  • 重複。

Worker 1 設定計時器並取得 TODO 清單中的第一個任務(在本例中為任務 A)。

Worker 2 做同樣的事情:它設定一個計時器並從 TODO 清單頂部取得現在的內容。由於工作人員 1 從中刪除了任務 A,工作人員 2 現在開始執行任務 B。

十分鐘後,計時器響起。工作人員 1 停止執行任務 A 並取得主管的指示。這些狀態會將目前任務放在 TODO 清單的底部。繼續主管的指示,它現在重新啟動計時器並開始處理現在位於 TODO 清單頂部的內容(即任務 C)。

Worker 2 執行相同操作並停止任務 B 並從 TODO 清單的頂部開始(在範例中為任務 A)

等等等等。

這有點簡化了。但它應該讓您了解兩個步驟(工作線程)如何能夠 100% 地完成三個或更多任務。

在真正的調度程序中還有更多的事情。例如,中斷(將其與任務中途的電話鈴聲進行比較以及如何處理)、智慧調度(將相同的任務交給同一工作人員可能會導致任務完成得更快,因為工作人員已經熟悉了) ,I/ O(如果一個工作人員需要從圖書館借一本書,他不會等到計時器到期,而是立即繼續下一個任務,等等。

答案3

作業系統保持穩定的方式與在不同 CPU 上執行多個執行緒時保持穩定的方式幾乎相同。從 CPU 核心外部來看,同一核心中的兩個 LP 以及兩個不同核心中各一個 LP 之間的行為幾乎沒有明顯差異。在這兩種情況下都必須使用所有相同的“多處理器安全”編程技術,例如信號量。

相關內容