前言
我們現在了解了進程是什么,進程狀態表示什么 ,我們現在繼續來了解進程的屬性 —— 進程優先級
進程執行者
在了解進程優先級之前,先來思考一個問題:在我們進行文件訪問操作時,操作系統是如何直到我們是誰(擁有者
、所屬者
或者other
)的?
我們知道指令它其實就是進程,所以我們進行文件訪問操作,本質上就是進程進行訪問,那操作系統是如何知道進程它是誰呢?
在進程的task_struct
中,存在一個UID
,它表示user id
就是用戶的id
我們可以使用ps -l
命令來查看:
通過上圖我們可以發現進程屬性UID
、PID
、PPID
、PRI
、NI
等
PID
是進程的id
,PPID
是進程的父進程的id
;
UID
:表示user id
,執行者的id
;
PRI
、NI
:和進程的優先級相關,本篇文章后面詳細講解。
我們使用ls -l
時,它會顯示出來文件的擁有者、所屬組,但都是以用戶名的形式顯示出來的;
我們可以通過ls -ln
,查看文件時將用戶名以數字形式顯示出來;
進程優先級
首先,優先級是什么?
CPU
資源分配的先后順序,就指進程的優先權- 優先權高的進程具有優先執行的權利
簡單來說,進程優先級就是進程等到CPU
資源的先后順序。
這里我們要理解一下優先級和權限
優先級:是決定得到某種資源的先后順序。
權限:是決定是否能夠得到某種資源。
為什么要存在優先級呢?
簡單來說就是,目標資源短缺,我們要通過優先級來確定先后順序。
那在Linux
中,我們如何查看進程的優先級呢?
查看進程優先級
在上述中提到了ps -l
,我們可以通過ps -l
指令來查看進程的優先級:
但是,在Linux
中優先級是如何表示的呢?
PRI
和NI
這里感覺怪怪的,進程優先級為什么要使用兩個值來表示呢?
PRI
:表示進程的優先級,默認是80
;NI
:表示進程優先級的修正數值;也稱為進程的nice
值。我們進程實際的優先級 =
PRI(默認)
+NI
PRI
PRI
表示進程當前的優先級,它的默認值是80
;
這個非常好理解,就不過多描述了。
NI
NI
:nice值表示進程可被執行的優先級的修正數值。當
nice
值為負數時,該進程的優先級值就會變小,優先級就變高,更快的被執行在
Linux
下,我們調整優先級就是調整nice
值。
nice
的取值范圍是[-20 , 19]
。
這里進程的PRI
和NI
都不是進程真實的優先級,進程真實的優先級P = PRI + NI
這里我們可以通過修改NI
值進而影響進程的優先級。
修改進程優先級
我們修改進程優先級,并不是直接修改進程的優先級值,而是通過修改nice
值來改變進程的優先級
我們可以通過top
來修改已經存在進程的優先級:
這里,我們修改過一次進程的
NI
值之后,再次修改會發現,無法進行修改了;這是因為操作系統為了防止惡意修改進程優先級,只允許普通用戶對進程修改一次優先級;
root
可以多次修改進程優先級。
這里我們還需要注意:
我們每次修改
NI
值之后,進程優先級都是等于PRI
的默認值(也就是80
)加上NI
值。
nice
和renice
除了使用top
來修改進程的NI
值之外,我們還可以使用nice
和renice
來修改
nice
nice
指令,在程序啟動時,修改程序進程的NI
值。
nice -n 10 ./code
這個指令就是在./code
程序運行時,將nice
修改為10
。
renice
nice
指令是在程序啟動時(創建進程時),就給定NI
值;而renice
指令則是修改已有進程的NI
值,從而修改進程優先級。
這里我們除了通過top
、nice
和renice
指令來查看和修改進程優先級之外,我們還可以通過系統調用,在代碼中查看和修改進程的優先級
getpriority
:獲取當前進程的優先級;
setpriority
:修改當前進程的優先級。
可以看到這兩個函數都是系統調用,這里就不過多描述了;
在后續內容中遇到了再詳細講解。
這里,普通用戶只能修改一次進程的優先級!!!
進程優先級的范圍
我們可以修改Ni
,從而影響進程的優先級,但是我們不能把NI
修改的非常大或者非常小吧;
NI
值的取值范圍:[-20,19]
(一共40
個數據)
進程優先級的范圍:[60 , 99]
(一共40
個優先級)
可以看到進程NI
值的范圍的確是[-20 , 19]
;進程優先級的范圍的確是[60 , 99]
。
理解競爭、獨立、并發、并行
進程具有競爭性、獨立性、并行、并發;
- 競爭性:系統中的進程非常多,而
CPU
資源只有很少的一部分,所以進程之間是具有競爭屬性的;為了使效率更高,更好的完成認為,更合理的競爭資源,就有了優先級這一概念。- 獨立性:多進行運行,需要獨自享有各種資源,多進程運行之間互不影響。
- 并行:多個進程在多個
CPU
下分別,同時運行,稱為并行- 并發:多個進程在一個
CPU
下采用進程切換的方式,在這一段時間內,多個進程都得以推進,稱為進程的并發。
到這里,本篇文章的內容就結束了
簡單總結:
- 了解了進程的優先級
- 進程
PRI
和NI
- 查看和修改進程的優先級(
NI
值)- 進程的特性(競爭性、獨立性、并行、并發)