當前位置:首頁 » 操作系統 » linux線程調度

linux線程調度

發布時間: 2022-11-01 10:52:56

1. 為什麼說linux 內核調度的是線程,而不是進程呢 難道內核中進程是不切換,只切換線程

貌似不對哦,在LINUX系統之中,被調度的應該是進程。因為只有進程才擁有一個獨立的上下文環境,是分配系統資源的最小單位……而線程在SMP體系中加速了執行的效率……
在LINUX之中,線程也可稱作輕量級進程,它能享有自己的堆棧,線程ID等獨立資源,但大多還是要依賴其創建進程,比如地址空間,信號,文件句柄……

2. linux進程、線程及調度演算法(二)

執行一個 ,但是只要任何修改,都造成分裂如,修改了chroot,寫memory,mmap,sigaction 等。

p1 是一個 task_struct, p2 也是一個 task_struct. linux內核的調度器只認得task_struck (不管你是進程還是線程), 對其進行調度。
p2 的task_struck 被創建出來後,也有一份自己的資源。但是這些資源會短暫的與p1 相同。
進程是區分資源的單位,你的資源是我的資源,那從概念上將就不叫進程。

其他資源都好分配,唯一比較難的是內存資源的重新分配。

非常簡單的程序,但是可以充分說明 COW。
結果:10 -> 20 -> 10

COW 是嚴重依賴於CPU中的MMU。CPU如果沒有 MMU,fork 是不能工作的。
在沒有mmu的CPU中,不可能執行COW 的,所以只有vfork
vfork與fork相比的不同

P2沒有自己的 task_struct, 也就是說P1 的內存資源 就是 P2的內存資源。

結果 10,20,20

vfork:

vfork 執行上述流程,P2也只是指向了P1的mm,那麼將這個vfork 放大,其餘的也全部clone,共同指向P1,那麼就是線程的屬性了。
phtread_create -> Clone()

P1 P2 在內核中都是 task_struct. 都可以被調度。共享資源可調度,即線程。 這就是線程為什麼也叫做輕量級進程
不需要太糾結線程和進程的區別。

4651 : TGID
4652, 4653 tid 內核中 task_struct 真正的pid

linux 總是白發人 送 黑發人。如果父進程在子進程推出前掛掉了。那麼子進程應該怎麼辦?

p3 -> init, p5 -> subreaper

每一個孤兒都會找最近的火葬場
可以設置進程的屬性,將其變為subreaper,會像1號進程那樣收養孤兒進程。

linux的進程睡眠依靠等待隊列,這樣的機制類似與涉及模式中的訂閱與發布。
睡眠,分兩種

每一個進程都是創建出來的,那麼第一個進程是誰創建的呢?
init 進程是被linux的 0 進程 創建出來的。開機創建。

父進程就是 0 號進程,但在pstree,是看不到0進程的。因為0進程創建子進程後,就退化成了idle進程。
idle進程是 linux內核里,特殊調度類。 所有進程都睡眠停止 ,則調度idle進程,進入到 wait for interrupte 等中斷。此時 cpu及其省電,除非來一個中斷,才能再次被喚醒。
喚醒後的任何進程,從調度的角度上說,都比idle進程地位高。idle是調度級別最最低的進程。
0 進程 一跑,則進入等中斷。一旦其他進程被喚醒,就輪不到 0進程了。
所有進程都睡了,0就上來,則cpu需要進入省電模式

3. linux內核線程怎麼設置優先順序

Linux內核的三種調度策略:
1,SCHED_OTHER
分時調度策略,
2,SCHED_FIFO實時調度策略,先到先服務。一旦佔用cpu則一直運行。一直運行直到有更高優先順序任務到達或自己放棄
3,SCHED_RR實時調度策略,時間片輪轉。當進程的時間片用完,系統將重新分配時間片,並置於就緒隊列尾。放在隊列尾保證了所有具有相同優先順序的RR任務的調度公平
Linux線程優先順序設置
首先,可以通過以下兩個函數來獲得線程可以設置的最高和最低優先順序,函數中的策略即上述三種策略的宏定義:
int
sched_get_priority_max(int
policy);
int
sched_get_priority_min(int
policy);
SCHED_OTHER是不支持優先順序使用的,而SCHED_FIFO和SCHED_RR支持優先順序的使用,他們分別為1和99,數值越大優先順序越高。
設置和獲取優先順序通過以下兩個函數:
int
pthread_attr_setschedparam(pthread_attr_t
*attr,
const
struct
sched_param
*param);
int
pthread_attr_getschedparam(const
pthread_attr_t
*attr,
struct
sched_param
*param);
例如以下代碼創建了一個優先順序為10的線程:
struct
sched_param
{
int
__sched_priority;
//所要設定的線程優先順序
};
例:創建優先順序為10的線程
pthread_attr_t
attr;
struct
sched_param
param;
pthread_attr_init(&attr);
pthread_attr_setschedpolicy(&attr,
SCHED_RR);
param.sched_priority
=
10;
pthread_attr_setschedparam(&attr,
¶m);
pthread_create(xxx
,
&attr
,
xxx
,
xxx);
pthread_attr_destroy(&attr);

4. linux線程怎樣調整nice值

Linux內核的三種調度方法: 1、SCHED_OTHER 分時調度策略。 2、SCHED_FIFO實時調度策略,先到先服務。 3、SCHED_RR實時調度策略,時間片輪轉。 實時進程將得到優先調用,實時進程根據實時優先順序決定調度權值,分時進程則通過nice和counter值決定...

5. Linux如何進行進程調度引入線程機制後,進程管理內容包括哪些

進程調度的演算法有很多,簡單來說就是每個進程都有一個自己的時間片,時間到了,就會被掛起,然後系統挑選下一個合適的進程來執行。至於誰合適,那就要看演算法了,優先順序,是不是飢餓,I/O型還是運算型,都要考慮的。
調度演算法比較復雜龐大,不是這里說的清楚的。
進程切換的過程大概就是保存當前上下文,也就是各種寄存器的狀態,包括指令寄存器。然後把下一個進程的上下文載入上來。
有了線程機制之後,進程管理主要管理線程之間的數據共享,管理進程地址空間,進程的交換空間。因為這些資源是屬於進程的,線程之間是共享的。
​現代操作系統調度基本是圍繞線程進行的,進程更多的是起到資源管理分配的作用。

6. linux調度是基於進程還是線程

在LINUX系統之中,被調度的應該是進程。因為只有進程才擁有一個獨立的上下文環境,是分配系統資源的最小單位……而線程在SMP體系中加速了執行的效率……
在LINUX之中,線程也可稱作輕量級進程,它能享有自己的堆棧,線程ID等獨立資源,但大多還是要依賴其創建進程,比如地址空間,信號,文件句柄……

7. 淺析Linux下進程的調度策略與優先順序

在 Linux 中,線程是由進程來實現的,可以認為線程就是一個輕量級的進程,因此,線程調度是按照進程調度的方式來進行的。這樣設計,線程調度流程可以直接復用進程調度流程,沒必要再設計一個進程內的線程調度器了。

在 Linux 中,進程調度器是基於進程的調度策略與調度優先順序來決定調度哪個進程運行。

調度策略主要包括:

調度優先順序的范圍是 0~99,數值越大,表示優先順序越高。

其中,SCHED_OTHER、SCHED_IDLE、SCHED_BACH 為非實時調度策略,其調度優先順序為 0。而 SCHED_FIFO、SCHED_RR 是實時調度策略,其調度優先順序范圍為 1~99。

實時調度策略的進程總是比非實時調度策略的進程優先順序高。

在 Linux 內部實現中,調度器會為每個可能的調度優先順序維護一個可運行的進程列表,以最高優先順序列表頭部的進程作為下一次調度的進程,所有的調度都是搶占式的,如果一個具有更高調度優先順序的進程轉換為可運行狀態,那麼當前運行的進程將被強制進入其等待的隊列中。

SCHED_OTHER

該調度策略是默認的 Linux 分時調度策略,該調度策略為非實時的,其調度優先順序總是為 0。

對於該調度策略類型的進程,調度器是基於動態優先順序來調度的。動態優先順序跟屬性 nice 有關,nice 的值會隨著進程的運行時間而動態改變,以確保所有具有 SCHED_OTHER 策略的進程公平地得到調度。

在 Linux 中,nice 的值范圍為-20 ~ +19,默認值為 0。nice 值越大,則優先順序越低,因此相對較低 nice 值的進程可以獲得更多的處理器時間。

通過命令 ps -el 查看系統中的進程列表,其中 NI 列就是進程對應的 nice 值。

使用 top 命令,看到的 NI 列也是進程的 nice 值。

調整 nice 值,可以通過 shell 命令 nice ,該命令可以按照指定的 nice 值運行 cmd ,命令的幫助信息為:

重新調整已運行進程的 nice 值,可通過 renice 命令實現,命令的幫助信息為:

另外,可以執行 top 命令,輸入 r ,根據提示輸入進程的 pid ,再輸入 nice 數值,也可以調整進程的 nice 值。

SCHED_FIFO

該調度策略為先入先出調度策略,簡單概括,就是一旦進程佔用了 CPU,則一直運行,直到有更高優先順序的任務搶占,或者進程自己放棄佔用 CPU。

SCHED_RR

該調度策略為時間片輪轉調度策略,該調度策略是基於 SCHED_FIFO 策略的演進,其在每個進程上增加一個時間片限制,當時間片使用完成後,調度器將該進程置於隊列的尾端,放在尾端保證了所有具有相同調度優先順序的進程的調度公平。

使用 top 命令,如果 PR 列的值為 RT ,則說明該進程採用的是實時調度策略,其調度策略為 SCHED_FIFO 或者 SCHED_RR,而對於非實時調度策略的進程,該列的值為 NI + 20 。

可以通過命令 ps -eo state,uid,pid,ppid,rtprio,time,comm 來查看進程對應的實時優先順序,實時優先順序位於 RTPRIO 列下,如果進程對應的列顯示為 - ,說明該進程不是實時進程。

chrt 命令可以用來很簡單地更改進程的調度策略與調度優先順序。在 Linux 下查看 chrt 命令的幫助信息:

比如,獲取某個進程的調度策略,使用如下命令:

在比如,設置某個進程的調度策略為 SCHED_FIFO,調度優先順序為 70,使用如下命令:

8. linux中內核線程與用戶線程在調度上有什麼區別

用戶級實現線程時,內核調度是以進程為單位的,內核並不知道用戶級線程的存在,因此某個用戶級線程的阻塞即會引起整個進程的阻塞。
內核級線程阻塞時,內核完全可以調度同進程內的其它線程運行,也就是沒有阻塞整個線程

9. linux進程、線程及調度演算法(三)

調度策略值得是大家都在ready時,並且CPU已經被調度時,決定誰來運行,誰來被調度。

兩者之間有一定矛盾。
響應的優化,意味著高優先順序會搶占優先順序,會花時間在上下文切換,會影響吞吐。
上下文切換的時間是很短的,幾微妙就能搞定。上下文切換本身對吞吐並多大影響, 重要的是,切換後引起的cpu 的 cache miss.
每次切換APP, 數據都要重新load一次。
Linux 會盡可能的在響應與吞吐之間尋找平衡。比如在編譯linux的時候,會讓你選擇 kernal features -> Preemption model.
搶占模型會影響linux的調度演算法。

所以 ARM 的架構都是big+LITTLE, 一個很猛CPU+ 多個 性能較差的 CPU, 那麼可以把I/O型任務的調度 放在 LITTLE CPU上。需要計算的放在big上。

早期2.6 內核將優先順序劃分了 0-139 bit的優先順序。數值越低,優先順序越高。0-99優先順序 都是 RT(即時響應)的 ,100-139都是非RT的,即normal。
調度的時候 看哪個bitmap 中的 優先順序上有任務ready。可能多個任務哦。

在普通優先順序線程調度中,高優先順序並不代表對低優先順序的絕對優勢。會在不同優先順序進行輪轉。
100 就是比101高,101也會比102高,但100 不會堵著101。
眾屌絲進程在輪轉時,優先順序高的:

初始設置nice值為0,linux 會探測 你是喜歡睡眠,還是幹活。越喜歡睡,linux 越獎勵你,優先順序上升(nice值減少)。越喜歡幹活,優先順序下降(nice值增加)。所以一個進程在linux中,干著干著 優先順序越低,睡著睡著 優先順序越高。

後期linux補丁中

紅黑樹,數據結構, 左邊節點小於右邊節點
同時兼顧了 CPU/IO 和 nice。
數值代表著 進程運行到目前為止的virtual runtime 時間。

(pyhsical runtime) / weight * 1024(系數)。
優先調度 節點值(vruntime)最小的線程。權重weight 其實有nice 來控制。

一個線程一旦被調度到,則物理運行時間增加,vruntime增加,往左邊走。
weight的增加,也導致vruntime減小,往右邊走。
總之 CFS讓線程 從左滾到右,從右滾到左。即照顧了I/O(喜歡睡,分子小) 也 照顧了 nice值低(分母高).所以 由喜歡睡,nice值又低的線程,最容易被調度到。
自動調整,無需向nice一樣做出獎勵懲罰動作,個人理解權重其實相當於nice

但是 此時 來一個 0-99的線程,進行RT調度,都可以瞬間秒殺你!因為人家不是普通的,是RT的!

一個多線程的進程中,每個線程的調度的策略 如 fifo rr normal, 都可以不同。每一個的優先順序都可以不一樣。
實驗舉例, 創建2個線程,同時開2個:

運行2次,創建兩個進程
sudo renice -n -5(nice -5級別) -g(global), 會明顯看到 一個進程的CPU佔用率是另一個的 3倍。

為什麼cpu都已經達到200%,為什麼系統不覺得卡呢?因為,我們的線程在未設置優先順序時,是normal調度模式,且是 CPU消耗型 調度級別其實不高。

利用chrt工具,可以將進程 調整為 50 從normal的調度策略 升為RT (fifo)級別的調度策略,會出現:

chrt , nice renice 的調度策略 都是以線程為單位的,以上 設置的將進程下的所有線程進行設置nice值
線程是調度單位,進程不是,進程是資源封裝單位!

兩個同樣死循環的normal優先順序線程,其中一個nice值降低,該線程的CPU 利用率就會比另一個CPU的利用率高。

10. Linux 進程、線程和CPU的關系,cpu親和性

1、物理CPU數:機器主板上實際插入的cpu數量,比如說你的主板上安裝了一塊8核CPU,那麼物理CPU個數就是1個,所以物理CPU個數就是主板上安裝的CPU個數。

2、物理CPU核數:單個物理CPU上面有多個核,物理CPU核數=物理CPU數✖️單個物理CPU的核
3、邏輯CPU核數:一般情況,我們認為一顆CPU可以有多個核,加上intel的超線程技術(HT), 可以在邏輯上再分一倍數量的CPU core出來。邏輯CPU核數=物理CPU數✖️單個物理CPU的核*2
4、超線程技術(Hyper-Threading):就是利用特殊的硬體指令,把兩個邏輯CPU模擬成兩個物理CPU,實現多核多線程。我們常聽到的雙核四線程/四核八線程指的就是支持超線程技術的CPU。

1、並行:兩件(多件)事情在同一時刻一起發生。
2、並發:兩件(多件)事情在同一時刻只能有一個發生,由於CPU快速切換,從而給人的感覺是同時進行。
3、進程和線程
進程是資源分配的最小單位,一個程序有至少一個進程。線程是程序執行的最小單位。一個進程有至少一個線程。
線程之間的通信更方便,同一進程下的線程共享全局變數、靜態變數等數據,而進程之間的通信需要以通信的方式(IPC)進行。多進程程序更健壯,多線程程序只要有一個線程死掉,整個進程也死掉了,而一個進程死掉並不會對另外一個進程造成影響,因為進程有自己獨立的地址空間。
4、單核多線程:單核CPU上運行多線程, 同一時刻只有一個線程在跑,系統進行線程切換,系統給每個線程分配時間片來執行,看起來就像是同時在跑, 但實際上是每個線程跑一點點就換到其它線程繼續跑。
5、多核多線程:每個核上各自運行線程,同一時刻可以有多個線程同時在跑。

1、對於單核:多線程和多進程的多任務是在單cpu交替執行(時間片輪轉調度,優先順序調度等),屬於並發
2、對於多核:同一個時間多個進程運行在不同的CPU核上,或者是同一個時間多個線程能分布在不同的CPU核上(線程數小於內核數),屬於並行。
3、上下文切換:上下文切換指的是內核(操作系統的核心)在CPU上對進程或者線程進行切換。上下文切換過程中的信息被保存在進程式控制制塊(PCB-Process Control Block)中。PCB又被稱作切換幀(SwitchFrame)。上下文切換的信息會一直被保存在CPU的內存中,直到被再次使用。

CPU 親和性(affinity)就是進程要在某個給定的 CPU 上盡量長時間地運行而不被遷移到其他處理器的傾向性。這樣可以減少上下文切換的次數,提高程序運行性能。可分為:自然親和性和硬親和性
1、自然親和性:就是進程要在指定的 CPU 上盡量長時間地運行而不被遷移到其他處理器,Linux 內核進程調度器天生就具有被稱為 軟 CPU 親和性(affinity) 的特性,這意味著進程通常不會在處理器之間頻繁遷移。這種狀態正是我們希望的,因為進程遷移的頻率小就意味著產生的負載小。Linux調度器預設就支持自然CPU親和性(natural CPU affinity): 調度器會試圖保持進程在相同的CPU上運行。
2、硬親和性:簡單來說就是利用linux內核提供給用戶的API,強行將進程或者線程綁定到某一個指定的cpu核運行。Linux硬親和性指定API:taskset .

taskset [options] mask command [arg]...
taskset [options] -p [mask] pid

taskset 命令用於設置或者獲取一直指定的 PID 對於 CPU 核的運行依賴關系。也可以用 taskset 啟動一個命令,直接設置它的 CPU 核的運行依賴關系。

CPU 核依賴關系是指,命令會被在指定的 CPU 核中運行,而不會再其他 CPU 核中運行的一種調度關系。需要說明的是,在正常情況下,為了系統性能的原因,調度器會盡可能的在一個 CPU 核中維持一個進程的執行。強制指定特殊的 CPU 核依賴關系對於特殊的應用是有意義的
CPU 核的定義採用位定義的方式進行,最低位代表 CPU0,然後依次排序。這種位定義可以超過系統實際的 CPU 總數,並不會存在問題。通過命令獲得的這種 CPU 位標記,只會包含系統實際 CPU 的數目。如果設定的位標記少於系統 CPU 的實際數目,那麼命令會產生一個錯誤。當然這種給定的和獲取的位標記採用 16 進制標識。
0x00000001
代表 #0 CPU
0x00000003
代表 #0 和 #1 CPU
0xFFFFFFFF
代表 #0 到 #31 CPU

-p, --pid
對一個現有的進程進行操作,而不是啟動一個新的進程
-c, --cpu-list
使用 CPU 編號替代位標記,這可以是一個列表,列表中可以使用逗號分隔,或者使用 "-" 進行范圍標記,例如:0,5,7,9
-h, --help
列印幫助信息
-V, --version
列印版本信息

如果需要設定,那麼需要擁有 CAP_SYS_NICE 的許可權;如果要獲取設定信息,沒有任何許可權要求。

taskset 命令屬於 util-linux-ng 包,可以使用 yum 直接安裝。

熱點內容
python實用代碼 發布:2025-05-13 22:19:41 瀏覽:842
dede資料庫的配置文件 發布:2025-05-13 22:19:08 瀏覽:966
給字元加密 發布:2025-05-13 22:12:32 瀏覽:972
資料庫系統實現答案 發布:2025-05-13 22:11:57 瀏覽:140
哪個軟體可以共存安卓 發布:2025-05-13 22:10:15 瀏覽:552
上傳宦妃天下野泉肉肉 發布:2025-05-13 22:10:10 瀏覽:408
洗眼睛解壓 發布:2025-05-13 21:58:28 瀏覽:272
c存儲指針 發布:2025-05-13 21:49:04 瀏覽:921
結繩編程軟體 發布:2025-05-13 21:49:03 瀏覽:850
解壓體育館 發布:2025-05-13 21:27:48 瀏覽:263