Linux進程的優(yōu)先級&&進程切換方式
前言
本文主要介紹了進程的優(yōu)先級及其調(diào)度算法:
一、進程優(yōu)先級
我們計算機里面一般只有一個cpu用來處理進程數(shù)據(jù),所以對于進程獲得CPU的使用權(quán)需要一種重要調(diào)度指標,而進程優(yōu)先級就是這種指標,它用來決定一個進程能夠優(yōu)先獲得CPU時間、內(nèi)存等系統(tǒng)資源。
1.1 基本概念
- cpu資源分配的先后順序,就是指進程的優(yōu)先權(quán)(priority)。
- 優(yōu)先權(quán)?的進程有優(yōu)先執(zhí)?權(quán)利。配置進程優(yōu)先權(quán)對多任務(wù)環(huán)境的linux很有?,可以改善系統(tǒng)性能。
- 還可以把進程運?到指定的CPU上,這樣?來,把不重要的進程安排到某個CPU,可能會改善系統(tǒng)整體性能。
1.2 查看系統(tǒng)進程
在linux或者unix系統(tǒng)中,?ps ?l 命令則會類似輸出以下?個內(nèi)容:
- ps -l命令用于顯示當前終端上的所有進程的詳細信息。
- ps -al命令則更加全面,它顯示了系統(tǒng)中所有用戶的所有進程(包括其他用戶的進程)的詳細信息。與ps -l相比,ps -al的輸出包含了更多進程的信息,并且不受當前終端的限制。
我們很容易注意到其中的?個重要信息,有下:
- UID : 代表執(zhí)?者的?份
- PID : 代表這個進程的代號
- PPID :代表這個進程是由哪個進程發(fā)展衍??來的,亦即?進程的代號
- PRI :代表這個進程可被執(zhí)?的優(yōu)先級,其值越?越早被執(zhí)?默認為80
- NI :代表這個進程的nice值
1.3 PRI和NI
PRI也還是?較好理解的,即進程的優(yōu)先級,或者通俗點說就是程序被CPU執(zhí)?的先后順序,此值越?進程的優(yōu)先級別越?
那NI呢?就是我們所要說的nice值了,其表?進程可被執(zhí)?的優(yōu)先級的修正數(shù)值
PRI值越?越快被執(zhí)?,那么加?nice值后,將會使得PRI變?yōu)椋篜RI(new)=PRI(oldest)+nice(這意味著我們修改進程優(yōu)先級的時候,無論中間的PRI怎么改變,都會會以最開始的PRI值作為基準值去改變)
這樣,當nice值為負值的時候,那么該程序?qū)?yōu)先級值將變?,即其優(yōu)先級會變?,則其越快被執(zhí)?
所以,調(diào)整進程優(yōu)先級,在Linux下,就是調(diào)整進程nice值
nice其取值范圍是-20?19,?共40個級別。(當我們調(diào)整的nice值超過這個區(qū)間的時候,會以區(qū)間里面的最低或最高值作為nice值)
需要強調(diào)?點的是,進程的nice值不是進程的優(yōu)先級,他們不是?個概念,但是進程nice值會影響到進程的優(yōu)先級變化??梢岳斫鈔ice值是進程優(yōu)先級的修正數(shù)據(jù)
1.4 調(diào)整優(yōu)先級
雖然一般情況下我們是不需要調(diào)整優(yōu)先級的,不過我們?nèi)匀恍枰私馊绾握{(diào)整優(yōu)先級。
使用下面的命令都需要管理者的身份。
1.4.1 top命令
top命令更改已存在進程的nice:
- top
- 進?top后按“r”?>輸?進程PID?>輸?nice值
- 按”q“退出,及修改完成
1.4.2 nice命令
nice命令用于在啟動一個新進程時指定其優(yōu)先級,即進程的“nice值”。Nice值是一個整數(shù),范圍從-20(最高優(yōu)先級)到19(最低優(yōu)先級),默認情況下,大多數(shù)進程的nice值為0。
語法:
- nice [選項] [nice值] 命令 [參數(shù)]
參數(shù):
- -n 或 --adjustment:指定nice值的增量或減量。
- -h 或 --help:顯示幫助信息。
- -V 或 --version:顯示版本信息。
1.4.3 renice命令
renice命令用于修改已經(jīng)運行的進程的優(yōu)先級。
語法:
- renice [選項] 優(yōu)先級 進程ID
選項:
- -n:指定要改變的優(yōu)先級值,取值范圍為-20到19。
- -g:指定要調(diào)整優(yōu)先級的進程組ID。
- -u:指定要調(diào)整優(yōu)先級的用戶名。
- -p:指定要調(diào)整優(yōu)先級的進程ID(默認)。
- -h 或 --help:顯示幫助信息。
- -V 或 --version:顯示版本信息。
二、進程切換
2.1 補充概念
競爭性:系 統(tǒng)進程數(shù)?眾多,?CPU資源只有少量,甚?1個,所以進程之間是具有競爭屬性的。為了?效完成任務(wù),更合理競爭相關(guān)資源,便具有了優(yōu)先級
獨?性: 多進程運?,需要獨享各種資源,多進程運?期間互不?擾
并?: 多個進程在多個CPU下分別,同時進?運?,這稱之為并?
并發(fā): 多個進程在?個CPU下采?進程切換的?式,在?段時間之內(nèi),讓多個進程都得以推進,稱之為并發(fā)
2.2 進程的運行和切換步驟(重要)
在進程運行的過程中會有個時間片的概念,是操作系統(tǒng)進行進程調(diào)度時分配給每個進程的一段固定時間。這么做一部分上是為了防止某個進程卡死的情況,例如某個進程調(diào)度的時候代碼內(nèi)部有個while(1)函數(shù)導(dǎo)致一直運行。及時的切換到運行隊列里其它進程是很有必要的
時間片內(nèi),進程可以執(zhí)行其代碼、訪問內(nèi)存和進行輸入輸出操作。當進程的時間片用完時,操作系統(tǒng)會暫停該進程的執(zhí)行,并將其保存到某種狀態(tài)(通常是通過進程控制塊PCB),然后切換到另一個進程的時間片。
切換步驟:
- 一個時間片結(jié)束的進程但是還沒被cpu執(zhí)行完其內(nèi)部的所有代碼數(shù)據(jù),從cpu內(nèi)被剝離下來
- 此時進程內(nèi)臨時運行的數(shù)據(jù)(比如執(zhí)行到代碼的哪一行了,其中變量的一些數(shù)據(jù)等)會被保存下來(通常是保存到進程的私有堆棧,也就是保存在task_struct本身,及task_struct里面會定義一個或多個變量或指針來存儲自己寄存器里面的信息),及cpu內(nèi)寄存器里面的內(nèi)容(當前進程的上下文數(shù)據(jù))會被保存到某個指定的地方
- 這樣子寄存器就可以處理新的進程的數(shù)據(jù)了,而舊的進程可以重新鏈入運行隊列
- 當恢復(fù)到這個進程的時候,就會把前一次本進程被中止時的中間數(shù)據(jù)再恢復(fù)到cpu寄存器里面去
二、Linux2.6內(nèi)核進程O(1)調(diào)度隊列(重要)
操作系統(tǒng)是如何根據(jù)優(yōu)先級來開展的調(diào)度呢?
一個cpu一個運行隊列
其中queue的類型為struct task_struct隊列中的[0-99]為實時優(yōu)先級我們不做考慮,而[100-139]則是我們進程的優(yōu)先級序列。
2.1 基本過程
在Linux2.6內(nèi)核中,每個CPU都擁有一個獨立的運行隊列(run_queue)。
運行隊列用于管理和調(diào)度該CPU上的所有可運行進程。
task_struct結(jié)構(gòu)體:
- 在Linux內(nèi)核中,每個進程都有一個對應(yīng)的task_struct結(jié)構(gòu)體,用于存儲該進程的所有信息。
- 它會被鏈入運行隊列中,在運行隊列中,task_struct結(jié)構(gòu)體通過指針數(shù)組來維護不同優(yōu)先級的進程隊列。
- 其下的run 對應(yīng)上面active ,wait對應(yīng)expired ,running對應(yīng)活躍進程,waiting對應(yīng)過期進程
這是一個類似哈希鏈地址法的指針數(shù)組,遍歷這個指針數(shù)組從上到下,從左到右就完成了對進程的優(yōu)先級的調(diào)度?。?!
除此之外我們在running下設(shè)計了個waiting,這么做的目的是
當我們遍歷這個指針數(shù)組的時候,可能會有新的task_struct插入進來,或者一個進程時間片結(jié)束后進程還沒被cpu處理完,那么此時就會進入到waiting里面,當running這個指針數(shù)組遍歷完的時候,利用位圖(bitmap)判斷指針數(shù)據(jù)這個隊列是否為空,然后只需要交換上面圖片中的run和wait兩者指向指針的地址,就能繼續(xù)調(diào)度未處理完數(shù)據(jù)或者新的task_struct了!
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Linux平臺和Windows平臺互傳文件的實現(xiàn)方法
本文講述了在Linux主機與windows主機之間如何互傳文件的方法,因為有時linux主機中的一些文件可能會在windows環(huán)境下用到,所以文章給大家介紹的非常詳細,感興趣的朋友可以參考下2024-05-05Linux設(shè)置虛擬內(nèi)存的教學與實戰(zhàn)教程
這篇文章主要給大家介紹了關(guān)于Linux設(shè)置虛擬內(nèi)存教學與實戰(zhàn)的相關(guān)資料,文中通過示例代碼以及圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-03-03VSCode連接實驗室服務(wù)器Xshell,Xftp向服務(wù)器傳輸文件的方法(win10)
這篇文章主要介紹了VSCode連接實驗室服務(wù)器,Xshell,Xftp向服務(wù)器傳輸文件(win10),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08