雲端計算髮展前景,linux系統課程

weixin_34117211發表於2018-07-16

在我們的Linux學習中,由於一些翻譯問題,會導致我們在學習中遇到一些生僻的、相似的詞與概念。有的很難理解,有的很容易混淆。在Linux系統中,對於使用者建立的程式(執行緒)來說,CPU分配時間片的單位是執行緒還是程式?

11266364-b646275039ace9e9.jpeg

是執行緒。執行緒是實際工作的單元,程式只是一個容器,用來管理一個或多個執行緒。

1.這是不是就意味著儘量使用多執行緒併發,這樣可以搶到更多的時間片。

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

11266364-fbf4d70d5fd893fe.jpeg

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

這就是排程演算法需要考慮和優化的問題。比如執行緒和程式有優先順序,在搶佔式的排程中,優先順序高的執行緒可以從優先順序低的執行緒那裡搶佔CPU。另外,在多CPU平臺上,排程演算法還要考慮快取的關聯性等。

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

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

11266364-16f9b3a9e9a1f677.jpeg

Linux核心其實不區分程式和執行緒,核心把執行單元叫做任務(task)。作業系統實際上排程的是程式,程式通過fork()來建立同樣的另一個程式。每個程式有一個PID,同一組程式中最先啟動的那個還有一個TGID。嚴格來說前者應該叫執行緒ID,後者應該叫程式ID。Linux裡的執行緒實際上是共享一些資源的一系列程式而已。

相關文章