溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

linux進程調(diào)度是怎么發(fā)生的

發(fā)布時間:2022-07-27 17:08:24 來源:億速云 閱讀:133 作者:iii 欄目:建站服務器

本篇內(nèi)容介紹了“l(fā)inux進程調(diào)度是怎么發(fā)生的”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

linux的進程調(diào)度發(fā)生的情況:1、進程狀態(tài)轉換的時刻,進程終止、進程睡眠,進程要調(diào)用“sleep()”或“exit()”等函數(shù)進行狀態(tài)轉換,這些函數(shù)會主動調(diào)用調(diào)度程序進行進程調(diào)度;2、當前進程的“current->counter=0”時,進程的時間片是由時鐘中斷來更新的;3、當設備驅(qū)動程序執(zhí)行長而重復的任務時,直接調(diào)用調(diào)度程序;4、進程從中斷、異常及系統(tǒng)調(diào)用返回到用戶態(tài)時。

本教程操作環(huán)境:linux7.3系統(tǒng)、Dell G3電腦。

linux的進程調(diào)度發(fā)生在什么情況下

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

Linux進程調(diào)度采用的是搶占式多任務處理,所以進程之間的掛起和繼續(xù)運行無需彼此之間的協(xié)作。

主要有一下幾種狀況:

  • 進程狀態(tài)轉換的時刻:進程終止、進程睡眠;

進程要調(diào)用sleep()或exit()等函數(shù)進行狀態(tài)轉換,這些函數(shù)會主動調(diào)用調(diào)度程序進行進程調(diào)度;

  • 當前進程的時間片用完時(current->counter=0);

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

  • 設備驅(qū)動程序

當設備驅(qū)動程序執(zhí)行長而重復的任務時,直接調(diào)用調(diào)度程序。在每次反復循環(huán)中,驅(qū)動程序都檢查need_resched的值,如果必要,則調(diào)用調(diào)度程序schedule()主動放棄CPU。

  • 進程從中斷、異常及系統(tǒng)調(diào)用返回到用戶態(tài)時;

如前所述,不管是從中斷、異常還是系統(tǒng)調(diào)用返回,最終都調(diào)用ret_from_sys_call(),由這個函數(shù)進行調(diào)度標志的檢測,如果必要,則調(diào)用調(diào)用調(diào)度程序。

擴展知識

在Linux中,進程的運行時間不可能超過分配給他們的時間片,他們采用的是搶占式多任務處理,所以進程之間的掛起和繼續(xù)運行無需彼此之間的協(xié)作。

在一個如linux這樣的多任務系統(tǒng)中,多個程序可能會競爭使用同一個資源,在這種情況下,我們認為,執(zhí)行短期的突發(fā)性工作并暫停運行以等待輸入的程序,要比持續(xù)占用處理器以進行計算或不斷輪詢系統(tǒng)以查看是否有輸入到達的程序要更好。我們稱表現(xiàn)好的程序為nice程序,而且在某種意義上,這個nice 是可以被計算出來的。操作系統(tǒng)根據(jù)進程的nice值來決定它的優(yōu)先級,一個進程的nice值默認為0并將根據(jù)這個程序的表現(xiàn)不斷變化。長期不間斷運行的程序的優(yōu)先級一般會比較低。

為什么從系統(tǒng)調(diào)用返回時要調(diào)用調(diào)度程序呢?

這當然是從效率考慮。從系統(tǒng)調(diào)用返回意味著要離開內(nèi)核態(tài)而返回到用戶態(tài),而狀態(tài)的轉換要花費一定的時間,因此,在返回到用戶態(tài)前,系統(tǒng)把在內(nèi)核態(tài)該處理的事全部做完。

下面簡單看一下每個時鐘中斷發(fā)生時內(nèi)核要做的工作,首先對這個最頻繁的調(diào)度時機有一個大體了解,然后再詳細討論調(diào)度程序的具體工作過程。

每個時鐘中斷(timer interrupt)發(fā)生時,由三個函數(shù)協(xié)同工作,共同完成進程的選擇和切換,它們是:schedule()、do_timer()及ret_form_sys_call()。

schedule():進程調(diào)度函數(shù),由它來完成進程的選擇(調(diào)度);

do_timer():暫且稱之為時鐘函數(shù),該函數(shù)在時鐘中斷服務程序中被調(diào)用,是時鐘中斷服務程序的主要組成部分,該函數(shù)被調(diào)用的頻率就是時鐘中斷的頻率即每秒鐘100次(簡稱100赫茲或100Hz);

ret_from_sys_call():系統(tǒng)調(diào)用返回函數(shù)。

當一個系統(tǒng)調(diào)用或中斷完成時,該函數(shù)被調(diào)用,用于處理一些收尾工作,例如信號處理、核心任務等等。

“l(fā)inux進程調(diào)度是怎么發(fā)生的”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI