首頁  >  文章  >  運維  >  linux的進程調度發生在什麼情況下

linux的進程調度發生在什麼情況下

WBOY
WBOY原創
2022-07-27 15:32:322775瀏覽

linux的進程調度發生的情況:1、進程狀態轉換的時刻,進程終止、進程睡眠,進程要呼叫「sleep()」或「exit()」等函數進行狀態轉換,這些函數會主動呼叫調度程序進行進程調度;2、當前進程的「current->counter=0」時,進程的時間片是由時鐘中斷來更新的;3、當設備驅動程式執行長而重複的任務時,直接呼叫調度程序;4、程序從中斷、異常及系統呼叫返回到用戶態時。

linux的進程調度發生在什麼情況下

本教學操作環境:linux7.3系統、Dell G3電腦。

linux的進程調度發生在什麼情況下

Linux的調度程式是一個叫Schedule()的函數,由它來決定是否要進行進程的切換。而所謂的調度時機則是在什麼情況下執行調度程序。

Linux進程排程採用的是搶佔式多工處理,所以進程之間的掛起和繼續運行無需彼此之間的協作。

主要有幾個狀況:

  • 進程狀態轉換的時刻:進程終止、進程睡眠;

    ##進程要呼叫sleep()或exit()等函數進行狀態轉換,這些函數會主動呼叫調度程式進行進程調度;
  • 目前進程的時間片用完時(current->counter=0);

#由於進程的時間片是由時鐘中斷來更新的,因此,這種情況和時機4是一樣的。

裝置驅動程式

#當裝置驅動程式執行長而重複的任務時,直接呼叫調度程式。在每次重複循環中,驅動程式都會檢查need_resched的值,如果必要,則呼叫調度程式schedule()主動放棄CPU。

處理程序從中斷、異常及系統呼叫回到使用者狀態時;

如前所述,不管是從中斷、異常或系統呼叫返回,最終都會呼叫ret_from_sys_call(),由這個函數進行調度標誌的偵測,如果必要,則呼叫呼叫調度程序。

擴展知識

在Linux中,進程的運行時間不可能超過分配給他們的時間片,他們採用的是搶佔式多任務處理,所以進程之間的掛起和繼續運行無需彼此之間的協作。 在一個如linux這樣的多任務系統中,多個程式可能會競爭使用同一個資源,在這種情況下,我們認為,執行短期的突發工作並暫停運行以等待輸入的程序,要比持續佔用處理器以進行計算或不斷輪詢系統以查看是否有輸入到達的程序要更好。我們稱表現好的程序為nice程序,而且在某種意義上,這個nice 是可以被計算出來的。作業系統根據行程的nice值來決定它的優先級,一個行程的nice值預設為0並將根據這個程式的表現不斷變化。長期不間斷運作的程式的優先順序一般會比較低。

######為什麼從系統呼叫返回時要呼叫調度程序呢? #########這當然是從效率來考慮。從系統呼叫返回意味著要離開內核態而返回到用戶態,而狀態的轉換要花費一定的時間,因此,在返回到用戶態前,系統把在內核態該處理的事全部做完。 ######下面簡單看一下每個時鐘中斷發生時內核要做的工作,首先對這個最頻繁的調度時機有一個大體了解,然後再詳細討論調度程序的具體工作過程。 ######每個時鐘中斷(timer interrupt)發生時,由三個函數協同工作,共同完成進程的選擇和切換,它們是:schedule()、do_timer()及ret_form_sys_call()。 ######schedule():進程調度函數,由它來完成進程的選擇(調度);######do_timer():暫且稱為時鐘函數,該函數在時鐘中斷服務程序中被調用,是時脈中斷服務程序的主要組成部分,函數被調用的頻率就是時脈中斷的頻率即每秒鐘100次(簡稱100赫茲或100Hz);######ret_from_sys_call():系統調用返回函數。 ######當一個系統調用或中斷完成時,該函數被調用,用於處理一些收尾工作,例如訊號處理、核心任務等等。 ######推薦學習:###Linux影片教學#######

以上是linux的進程調度發生在什麼情況下的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn