Linux系統中 進程 、線程 、時間片的關係?

在Linux系統中,對於用戶創建的進程(線程)來說,CPU分配時間片的單位是線程還是進程?

if(CPU分配時間片的單位是線程):

1.這是不是就意味著盡量使用多線程並發,這樣可以搶到更多的時間片。

2.操作系統對於擁有多線程的進程,是否會減少其每個線程的時間片,

或做其他處理來保證公平性?

else:

1.這是不是表明我們應該合理分配線程。在一個進程中的多個線程要注

意在可能的情況下將本線程阻塞,將剩餘的時間片讓給兄弟線程。

2.程序盡量將任務交給多個子進程,以獲得更多的時間片來執行整個程序?

上述內容如有問題,請網友指正,多謝。。


在Linux系統中,對於用戶創建的進程(線程)來說,CPU分配時間片的單位是線程還是進程?

是線程。線程是實際工作的單元[1],進程只是一個容器,用來管理一個或多個線程。

1.這是不是就意味著盡量使用多線程並發,這樣可以搶到更多的時間片。

理論上是的,多線程的一種用途就是能同時做好幾件事情,以提高效率。但實際問題是,CPU的數量(核心數,下同)是有限的,而且並不多。如果你的CPU有8個CPU,並且整個系統中有8個線程的話,不考慮中斷等因素,每個線程理論上能一直執行下去。然而多於8個線程以後,操作系統就必須進行調度,也就是分配時間片。具體的分配方案,或者說調度演算法有很多種,詳情參見Scheduling (computing)。如果一個進程創建了很多線程的話,最多也只有8個能夠處於執行的狀態[2],其餘的線程必須等待調度。線程被調度的時候需要進行上下文切換,這個操作是一種額外的開銷。線程數量過多的時候,上下文切換產生的額外開銷會對系統的效率造成負面影響。

2.操作系統對於擁有多線程的進程,是否會減少其每個線程的時間片,或做其他處理來保證公平性?

這就是調度演算法需要考慮和優化的問題。比如線程和進程有優先順序,在搶佔式的調度中,優先順序高的線程可以從優先順序低的線程那裡搶佔CPU。另外,在多CPU平台上,調度演算法還要考慮緩存的關聯性等。

在一個進程中的多個線程要注意在可能的情況下將本線程阻塞,將剩餘的時間片讓給兄弟線程。

在主流的操作系統實現里,一般進程是不能直接控制自己的線程的執行順序的。也就是說,把一個線程掛起並不能保證另一個線程一定能夠被執行。

注1:Linux內核其實不區分進程和線程,內核把執行單元叫做任務(task)。操作系統實際上調度的是進程,進程通過fork()來創建同樣的另一個進程。每個進程有一個PID,同一組進程中最先啟動的那個還有一個TGID。嚴格來說前者應該叫線程ID,後者應該叫進程ID。Linux里的線程實際上是共享一些資源的一系列進程而已。不過這裡面要展開講的話就又能寫一篇回答了,就先講這麼多吧。

注2:這裡說的是物理線程,有別於邏輯線程。


if(CPU分配時間片的單位是線程):

1.這是不是就意味著盡量使用多線程並發,這樣可以搶到更多的時間片。

2.操作系統對於擁有多線程的進程,是否會減少其每個線程的時間片,

或做其他處理來保證公平性?

else:

1.這是不是表明我們應該合理分配線程。在一個進程中的多個線程要注

意在可能的情況下將本線程阻塞,將剩餘的時間片讓給兄弟線程。

2.程序盡量將任務交給多個子進程,以獲得更多的時間片來執行整個程序?

在我看來:

由於歷史原因,Linux內核層面,進程和線程的概念是混亂的,所以盡量不要去糾結概念。與其糾結調度的到底是進程還是線程,不如轉而關注調度器的許可權和實現機制。

為此專門寫了一個文章,談談Linux和Windows操作系統下的調度。

袈裟披肩上:內核級調度和用戶級調度


上面的回答的挺好,比較全面。我補充一點內容。

一般來說,內核調度的單元是一個lwp,也叫輕進程,而它可以對應一個或多個用戶線程,到了Linux,就只有1對1了,因此,posix本來定義了一個線程的scope屬性,在scope_process的情況下,即使有4線程在4core上也不能用滿。這個屬性在Linux上面沒有實現。命運多舛的Solaris是完美的實現了這個屬性的。

那麼Linux是不是不能控制用戶惡意的多開線程行為?

這個問題在上古時代就已經被考慮過了,解決方案就是ulimit。

到了近代,有了cgroup這種新的控制方案。

它們都可以限制進程的CPU使用時間。


說幾點

1,在內核里的調度單元是task,線程或者進程沒有分別

2,調度策略根據不同版本的內核不一樣,有搶佔式的,非搶佔式的,時間片由調度器根據當前task的狀態決定

3,高級別的任務會臨時打斷當前任務,比如中斷,timer,tasklet等

4,task主動出讓cpu也會引起調度,比如信號量,鎖,sleep。

5,補充一點,進程和線程的主要區別在於map的空間不一樣,而不是調度。


進程:資源分配的最小單位

線程:系統調度的最小單位


補充樓上一點關於

1.這是不是就意味著盡量使用多線程並發,這樣可以搶到更多的時間片。

多線程是能提高大多數程序的執行效率的,但是很明顯並不是越多越好。除了樓上說的調度開銷之外還要考慮 IO密集型任務和計算密集型任務在多線程下的區別……

在特定條件下,如果玩的不好多線程還沒單線程效率高也是有可能的


Linux不區分進程和線程,這難道不是Linux的常識內容嗎……


推薦閱讀:

如何實現一個安全的thread.stop的api?
線程崩潰是否會造成進程崩潰?

TAG:中央處理器CPU | Linux | Linux內核 | 線程 | 進程管理 |