我想澄清一下“可調度的 CPU 時間片單元”是“行程”還是“執行緒”(內核管理執行緒)。我所說的“CPU時間片的可調度單位”是指作業系統的CPU調度程式分配CPU時間片的單位。
根據維基百科中的“短期調度”,行程用于指代可調度單元。
“這個調度程式可以是搶占式的,這意味著當它決定將 CPU 分配給另一個行程時,它能夠強制從 CPU中洗掉行程”
另外,根據維基百科中的“時間片”,
“調度程式在每個時間片運行一次,以選擇下一個要運行的行程。”
此外,根據維基百科中的“執行緒”,
“行程是資源的單位,執行緒是調度和執行的單位”
根據微軟檔案中的“行程和執行緒”,
“執行緒是作業系統分配處理器時間的基本單位。”
根據“執行緒調度是由 CPU、內核還是兩者都完成? ”在 quora 中,
“CPU(硬體)只是執行指令。CPU 本身沒有執行緒或調度的概念,盡管 CPU 中可能有支持它們的功能。
“作業系統內核(一組指令,又稱軟體)在 CPU(硬體)上執行。作業系統內核中的調度演算法選擇下一個要執行的執行緒,并指示 CPU 開始執行下一條指令選擇的執行緒“。
uj5u.com熱心網友回復:
澄清:我對“CPU時間片的可調度單元”的理解是“可以在給定CPU時間片內調度的單元”(因為如果“可調度單元”是一個時間,那么這個問題對我來說沒有多大意義)。
基于此,簡而言之,給定邏輯內核的“一個可調度的 CPU 時間片單元”可以看作是一個軟體執行緒(更具體地說,它的執行背景關系由暫存器和行程資訊組成)。
作業系統調度程式對任務進行操作。任務可以是執行緒、行程或其他不尋常的結構(例如資料流)。
現代主流作業系統主要在處理單元上調度執行緒(通常是硬體執行緒,也稱為邏輯內核)。您可以在Microsoft 檔案中獲得有關 Windows 調度程式如何作業的更多資訊。該檔案明確指出:
執行緒是行程中可以調度執行的物體
在 Linux 上,默認調度程式CFS對任務(即task_struct資料結構)進行操作。任務可以是一個執行緒、一組執行緒或一個行程。這樣做是為了使調度程式更通用,也因為這個調度程式是很久以前設計的,當時處理器只有一個核心,人們專注于行程而不是執行緒。此后的多核時代導致應用程式使用大量執行緒以便使用可用內核。因此,如今,通常是實際安排的 AFAIK 執行緒。這在著名的研究論文The Linux Scheduler: a Decade of Wasted Cores中有解釋(也解釋了 CFS 如何在目標處理器上運行)。
請注意,術語“行程”有時可以指執行緒,因為執行緒有時被稱為“輕量級行程”,而基本行程有時被稱為“重型行程”。行程甚至可以是重型和輕量級行程(即執行緒和實際行程)的通用術語。這是一個非常令人困惑的術語和對語言的誤用(例如有時用于核心的術語“處理器”)。實際上,這在特定背景關系中通常不是問題,因為執行緒和行程可以互換使用(在這種情況下,人們應該使用像“任務”這樣的通用術語)。
至于“一個可調度的 CPU 時間片單元”,這就有點復雜了。一個簡單而天真的答案是:一個執行緒(它絕對不是單獨的行程)。話雖如此,執行緒是一個軟體定義的概念(如行程)。它基本上是一個堆疊、幾個暫存器和一個父行程(可能帶有一些元資訊和一個 TLS 空間)。CPU 不直接對這種資料結構進行操作。例如,CPU 沒有執行緒堆疊的概念(它只是虛擬行程記憶體的一部分)。他們只需要一個由暫存器和行程配置組成的執行背景關系(在保護模式下))。為簡單起見,我們可以說它們執行執行緒。主流的現代 x86 處理器非常復雜,每個內核往往能夠同時運行多個執行緒。這稱為同時多執行緒(也稱為英特爾處理器的超執行緒)。x86 物理內核通常由兩個邏輯執行緒(即硬體執行緒)組成,每個邏輯執行緒都可以執行一個軟體執行緒。
uj5u.com熱心網友回復:
我認為您的誤解實際上是對英語單詞在這種情況下的含義的誤解。
時間片是一段時間。也許它只是一秒鐘的一小部分。也許幾秒鐘。
執行緒和行程是計算機將要執行的有效任務。(我在這里進行了簡化。任務的概念具有多種含義,即使在 IT 環境中也是如此。在現代作業系統上,行程實際上是共享相同虛擬記憶體地址空間的執行緒的集合。)
CPU 1或處理器是運行(本機)執行緒的硬體。典型的計算機將具有多個 CPU。但是,計算機中的每個 CPU一次只能運行一個執行緒。
因此,作業系統需要調度它所知道的每個執行緒在特定 CPU 上運行。執行此操作的作業系統部分稱為調度程式。
如果要運行的執行緒多于運行它們的 CPU,則調度程式通常會將執行緒調度到 CPU 一段固定的時間;即時間片。當執行緒的時間片已經過去時,調度器會將其掛起并將其放回佇列中,然后調度不同的執行緒在 CPU 上運行。
比喻是我們正在“分割” CPU 上的可用計算時間,并在需要它的執行緒之間共享這些片。
1 - 對于“CPU”的實際含義存在一些分歧。我認為它指的是通常所說的“核心”。英特爾令人困惑地引入了營銷術語2 “超執行緒”,它指的是“核心”的物理硬體可以作為兩個獨立的指令執行器運行的功能。但是,在超執行緒模式下,作業系統調度程式通常會將超執行緒視為不同的內核,因此這與您的問題無關。
2 - 超執行緒背后的實際概念可以追溯到 1960 年代,甚至在英特爾作為一家公司存在之前;見https://en.wikipedia.org/wiki/Barrel_processor。
所以你的問題的答案:
我想澄清“CPU時間片的可調度單元”是“行程”還是“執行緒”(內核管理執行緒)。
時間片是 CPU 時間的可調度單位。
時間片既不是行程也不是執行緒。事實上,這甚至沒有意義,因為“行程”和“執行緒”不是時間。
我同意@Solomon Slow 的評論。維基百科不具有權威性。但真正的問題是,隨著時間的推移,不同的頁面是由不同的人撰寫和編輯的,而且他們經常使用不一致的 IT 術語。
我的建議是找到并閱讀一本關于(現代)作業系統設計和架構的好教科書。一本寫得很好的教科書在術語的使用上應該是自洽的。
uj5u.com熱心網友回復:
時間片是一個時間單位,例如在使用 HZ=100 構建的傳統 Linux 內核中為 10 毫秒(每秒 100 個定時器中斷)。在一個任務在一個 CPU 內核上運行了這么長時間之后,內核重新獲得對該 CPU 的控制權并呼叫schedule()來決定這個 CPU 內核接下來應該運行什么任務;它已經在運行的任務,或不同的任務。
如果外部中斷到來,調度程式也可以提前運行,尤其是在當前時間片快結束時:如果現在有更高優先級的任務正在等待 CPU,例如在等待 I/O 之后或sleep()系統呼叫結束之后,作業系統將其調度到這個核心上是有意義的,而不是完成任何 CPU 系結任務被中斷的時間片。
對于調度程式必須從中挑選的東西,任務是一個有用的詞。沒有暗示行程中的單獨行程或執行緒,也沒有為內核任務(如不是執行緒或行程的 Linux 中斷處理程式“下半部分”)留出空間。
行程的每個執行緒都需要單獨調度以在 CPU 內核上執行(如果它沒有被阻塞)。
您發現的有關調度行程的文章使用了每個行程都是單執行緒的簡化假設。
或者他們假設一個 1:n 執行緒模型,其中作業系統只知道整個行程的一個任務,并且多執行緒是在用戶空間中完成的,“綠色執行緒”而不是本機執行緒。如今,大多數主流作業系統都使用 1:1 執行緒模型,其中每個 C 或 Java 執行緒都是作業系統可見的單獨可調度任務,盡管在您有多個作業系統調度任務的情況下也可以使用 n:m 模型,但不如你有高級語言執行緒。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/482584.html
上一篇:物理內核越多,多執行緒C 代碼越慢?(執行緒化C mex函式)
下一篇:在執行緒中標記未來物件
