1.進程優先級
1.進程優先級是什么:進程獲取CPU資源的先后順序
2.為什么要有進程優先級:因為一般CPU只有一塊,資源短缺,所以就需要優先級來確定誰先誰后的問題
3.值越低 進程的優先級越高? ?ps -l進行查看
UID:user id
RPI 進程可被執行的優先級 值越小越早被執行 默認值80
NI 進程優先級的修正數據?我們在后面想要修改進程的優先級就需要使用這個nice值
優先級修改? 建議不要隨便修改 會限制次數 進程真實優先級 = PRI (默認)+ NI? top? r + pid 進行修改,頻繁的修改可能會破壞公平性
?
?nice值范圍[-20,19] ? ?Linux優先級范圍[60,99]??? 幅度不能太大 考慮公平性
優先級設計不合理 會導致優先級低的進程,長時間得不到CPU資源,導致進程饑餓
2.進程切換
一個進程在CPU上跑,一般不會直接跑完,會跑一個時間段,這個時間段就是一個時間片,每個進程跑完一個時間片,就需要繼續去排隊
相信大家都寫過死循環的代碼,我們的系統會卡死嗎?不會的,是因為這個代碼跑完一個時間片,然后就需要去排隊等待,排到這個進程再去跑一個時間片,所以這也是為什么我們寫死循環系統不會卡死 ,也證明了一個進程不會一直占有CPU
2.1CPU 寄存器
寄存器:CPU中有很多的寄存器 寄存器有很多功能 這里我們先不做詳細了解,只需要知道寄存器是CPU的一個臨時空間,用來存儲正在調度進程的臨時信息,只是一個空間,并不等于寄存器里面的內容
當一個進程跑完一個時間片,就將寄存器的對應的上下文數據拷貝一份,給進程讓其保存起來,保存到task_struct中 有一個tss結構體 里面保存的就是上下文數據,保證下次進程執行可以將上下文數據恢復到寄存器中,這個時候寄存器就可以在上次的歷史位置繼續運行了?
?進程切換本質核心就是保存和恢復當前硬件的上下文數據,就是CPU寄存器的內容?
Linux內核進程O(1)調度隊列
選擇進程
調度和切換共同構成調度器
我們可以通過下面的圖片來看,一個CPU有一個運行隊列,就是我們的runqueue,我們來理解一下為什么要這樣設計,active指向活躍隊列,expired指向過期隊列,nr_active來確定隊列中的進程總數,如果是0證明隊列中沒有進程,bitmap是位圖,來判斷140個優先級隊列是否為空,因為他們是一一映射的,所以可以提高運行效率,下面有為什么是bitmap[5]的解釋,queue,其中100個優先級隊列是實時調度,40個優先級隊列是分時調度,當進程被CPU調度,按照進程的優先級,進入到對應的優先級隊列進行排隊,當這個進程被調度完以后,就會進到過期隊列當中,并且更新它的優先級,這樣活躍隊列的進程就會越來越少,當活躍隊列里沒有進程了,過期隊列就會和活躍隊列進行交換,然后再去調用活躍隊列的進程,直到所有的進程都跑完
結語?
進調度器由切換和調度組成,我們學習了要選擇哪個進程讓CPU調度,如何去切換,了解Linux切換調度是如何實現的,增強自己的知識儲備!!