Linux

linux中的執行緒程序

  • October 21, 2014

我想知道創建新執行緒時發生的“懲罰”。

根據我對 clone(2)、NPTL(新 POSIX 執行緒庫)、CFS(完全公平調度程序)的理解,當創建一個新執行緒時,它被視為一個新程序,因為 NPTL 使用 1:1 執行緒模型。

根據我對調度程序的了解,當將新程序添加到執行隊列時,fair_clock變數會增加到掛鐘的一小部分。

通過使用 pthread_create(3) 探索儀式,clone 最終被呼叫,就像在 fork(2) 中一樣。

現在,程序將具有 1:1 模型,執行緒也將具有。那麼,執行緒是否也會遭受同樣的命運呢?顯然,執行緒必須以某種形式受到懲罰,否則多執行緒程序可能會通過填滿 CFS 使用的 RR(循環)系統來佔用大部分 CPU 時間。

如果這真的,那麼使用執行緒而不是分叉有什麼優勢?它只是自動共享堆空間(而不是使用 shm_open(2))嗎?

從我提供的關於完全公平調度器的連結中,我們看到在核心 2.6.24 中有所謂的組調度。

引用 Chandandeep Singh Pabla 的話:

例如,假設系統中共有 25 個可執行程序。CFS 試圖通過將 4% 的 CPU 分配給所有人來做到公平。但是,假設在這 25 個程序中,有 20 個屬於使用者 A,而 5 個屬於使用者 B。使用者 B 處於固有劣勢,因為 A 比 B 獲得更多的 CPU 能力。組調度試圖消除這個問題。它首先嘗試對一個群體公平,然後對這個群體的個別任務公平。因此,啟用組調度的 CFS 將分配 50% 的 CPU 給每個使用者 A 和 B。分配的 A 的 50% 份額將分配給 A 的 20 個任務,而其他 50% 的 CPU 時間將公平分配在 B 的 5 個任務中。

現在,這適用於上述問題,因為當一個程序產生一個新執行緒時,它將在該程序調度組中。這可以防止產生 1000 個執行緒的程序佔用所有 CPU 時間,因為它只會獲得該特定程序組執行時間的 1/1001(1000 個執行緒加上原始程序)。

因此,通過減慢執行緒與整個系統相比的時間,這可以適當地懲罰執行緒應用程序。

引用自:https://unix.stackexchange.com/questions/162930