在Linux操作系統內核內部,進程是通過一個鏈表,而且是一個雙向鏈表來管理的。
進程描述符:每一個進程都有其描述符,每一個描述符彼此之間都有關聯性的。
雙向鏈表:
一個進程內部可能包含多個線程。
上下文切換(Context swtch)
假如說進程A從當前CPU上被拿走,切換成進程B,進程A有自己的描述符(task_struct),且被掛起。被Suspend(棧指針),CPU內部,包括指令計數器等保存下來。
保存在進程描述符文件當中。而進程描述符是由內核維持。所以這些信息都保存在內核中。
當A進程被切換出去,就意味着B進程被調度上來。這一過程被叫做恢復線程(Resume)
總的過程就叫做上下文切換。
進程A------CPU------進程B
上下文切換由誰完成?----由內核。
這意味着:
每一次進程切換都要先從用戶空間轉到內核模式,然后再到用戶模式。
注意:不可能由一個進程到另一個進程,必須由內核來指揮完成。
所以CPU的整體時間就分為兩部分:
一部分是用戶空間所有進程加起來的計的時間
另一部分是內核空間所占用的時間
不管是那個進程,CPU總是分配到用戶空間一部分,又分配到內核空間一部分。
Linux支持進程搶占。
優先級高的可以搶占優先級低的。
但不是隨時都可以搶占,-------系統時鍾。
系統時鍾:
有內部的時間頻率。
Tick:滴答----時間解析度
操作系統是怎么記錄時間的?
每一次滴答(tick),都會產生可搶的時鍾中斷。
滴答來了,就可以搶了。
Linux的進程類別:
1、 交互式進程(IO密集型):等待IO,對CPU要求量特別小。
2、 批處理進程(CPU密集型):也可以理解成守護進程。
3、 實時進程(Real-time):隨時運行,優先級非常高的進程
對於PC(桌面):交互式進程優先級應該是高優先級的,IO,,,,,
對於服務器來說:一般以批處理為主(CPU)
現在很多調度器可以這樣來實現:
讓批處理進程多一些時間片。----時間片比較大,但優先級低。
而交互式進程時間片少,但優先級高。
調度就是按照優先級來完成的。
Top命令是用來顯示系統運行的進程信息。
Linux優先級:
1、 實時進程優先級:1-99 數字越小,優先級越低。通常與內核相關。
2、 靜態優先級:通常用來描述用戶進程優先級。
100-139 數字越小,優先級越高。
所以優先級范圍是1-139
實時優先級比靜態優先級高。
很顯然,內核進程通常都是實時優先級。
TOP
顯示RT的為實時進程。