目錄
一、進(jìn)程優(yōu)先級
?1、優(yōu)先級概念
?2、優(yōu)先級特點(diǎn)
?3、修改Linux下的優(yōu)先級
二、進(jìn)程切換
?1、進(jìn)程特性
?2、進(jìn)程切換
三、環(huán)境變量
?1、基本概念
?2、常見環(huán)境變量
?3、查看環(huán)境變量方法
?4、PATH環(huán)境變量
?5、和環(huán)境變量相關(guān)的命令
?6、環(huán)境變量的組織方式
?7、通過代碼如何獲取環(huán)境變量
?8、通過系統(tǒng)調(diào)用獲取或設(shè)置環(huán)境變量
?9、環(huán)境變量通常是具有全局屬性的
一、進(jìn)程優(yōu)先級
?1、優(yōu)先級概念
- CPU 資源分配的先后順序,就是指進(jìn)程的優(yōu)先權(quán)(priority);
- 優(yōu)先權(quán)高的進(jìn)程有優(yōu)先執(zhí)行權(quán)利。配置進(jìn)程優(yōu)先權(quán)對多任務(wù)環(huán)境的 Linux 很有用,可以改善系統(tǒng)性能;
- 還可以把進(jìn)程運(yùn)行到指定的 CPU 上,這樣一來,把不重要的進(jìn)程安排到某個 CPU,可以大大改善系統(tǒng)整體性能.
?2、優(yōu)先級特點(diǎn)
- 進(jìn)程的優(yōu)先級和狀態(tài)一樣,本質(zhì)都是PCB里面的一個數(shù)字(也可能是多個數(shù)字),操作系統(tǒng)通過這些數(shù)字來辨別進(jìn)程的狀態(tài)和優(yōu)先級;
- 通過 ps -al 指令可以查看到進(jìn)程的詳細(xì)信息,PRI 和 NI 的值合并在一起代表 Linux 進(jìn)程的優(yōu)先級。PRI 其實就是最終優(yōu)先級,只不過它受 NI 值的調(diào)控。
輸入 ps -l 命令后,會顯示一下內(nèi)容
此時可以注意到其中幾個重要信息,有下:
- UID : 代表執(zhí)行者的身份;
- PID : 代表這個進(jìn)程的代號;
- PPID :代表這個進(jìn)程是由哪個進(jìn)程發(fā)展衍生而來的,亦即父進(jìn)程的代號;
- PRI :代表這個進(jìn)程可被執(zhí)行的優(yōu)先級,其值越小越早被執(zhí)行;
- NI :代表這個進(jìn)程的 nice 值。
- PRI 也還是比較好理解的,即進(jìn)程的優(yōu)先級,或者通俗點(diǎn)說就是程序被CPU執(zhí)行的先后順序,此值越小進(jìn)程的優(yōu)先級別越高。
- 那NI呢?就是我們所要說的nice值了,其表示進(jìn)程可被執(zhí)行的優(yōu)先級的修正數(shù)值。
- PRI值越小越快被執(zhí)行,那么加入nice值后,將會使得PRI變?yōu)椋?strong>PRI(new)=PRI(old)+nice。
- 這樣,當(dāng)nice值為負(fù)值的時候,那么該程序?qū)?yōu)先級值將變小,即其優(yōu)先級會變高,則其越快被執(zhí)行。
- 所以,調(diào)整進(jìn)程優(yōu)先級,在Linux下,就是調(diào)整進(jìn)程nice值,nice其取值范圍是-20至19,一共40個級別。
Linux 給我們提供了修改 進(jìn)程 優(yōu)先級的權(quán)限,目的就是讓我們對多任務(wù)運(yùn)行進(jìn)行合理處理,提高系統(tǒng)運(yùn)行效率。
注意:(1)進(jìn)程的nice值不是進(jìn)程的優(yōu)先級,他們不是一個概念,但是進(jìn)程nice值會影響到進(jìn)程的優(yōu)先級變化;(2)可以理解nice值是進(jìn)程優(yōu)先級的修正修正數(shù)據(jù)。
?3、修改Linux下的優(yōu)先級
先輸入top,進(jìn)入top后,按‘r’,然后輸入進(jìn)程PID,輸入nice值。
(1)輸入 top 指令
(2) 輸入 r?
(3) 輸入進(jìn)程的 id
(4)輸入 NI 值(例如:NI = -10)?
結(jié)果:PRI(新的) = PRI(舊的) + NI(-10) = 70?
注意:普通用戶無法直接修改NI的值,必須切換成root用戶或者使用sudo提權(quán)執(zhí)行top指令。
二、進(jìn)程切換
?1、進(jìn)程特性
- 競爭性: 系統(tǒng)進(jìn)程數(shù)目眾多,而CPU資源只有少量,甚至1個,所以進(jìn)程之間是具有競爭屬性的。為了高 效完成任務(wù),更合理競爭相關(guān)資源,便具有了優(yōu)先級;
- 獨(dú)立性: 多進(jìn)程運(yùn)行,需要獨(dú)享各種資源,多進(jìn)程運(yùn)行期間互不干擾;
- 并行: 多個進(jìn)程在多個CPU下分別,同時進(jìn)行運(yùn)行,這稱之為并行;
- 并發(fā): 多個進(jìn)程在一個CPU下采用進(jìn)程切換的方式,在一段時間之內(nèi),讓多個進(jìn)程都得以推進(jìn),稱之為并發(fā).
?2、進(jìn)程切換
(1) 一個CPU里面存在一套硬件寄存器,寄存器分為用戶可見的寄存器,用戶不可見的寄存器。
(2) 計算機(jī)調(diào)度某個進(jìn)程時,CPU 會把這個進(jìn)程的 PCB 地址加載到某個寄存器,也就是說,CPU內(nèi)有寄存器可以只找到進(jìn)程的PCB地址。
(3) CPU里有一個 eip 寄存器(PC指針),指向當(dāng)前執(zhí)行指令的下一條指令的地址。
(4) 當(dāng)進(jìn)程在運(yùn)行的時候,一定會產(chǎn)生非常多的臨時數(shù)據(jù),這些臨時數(shù)據(jù)只屬于當(dāng)前進(jìn)程,雖然CPU內(nèi)部只有一套寄存器硬件,但是寄存器里面保存的數(shù)據(jù)是屬于當(dāng)前進(jìn)程的,寄存器硬件和寄存器內(nèi)的數(shù)據(jù)是兩碼事。
(5) 進(jìn)程在調(diào)度的時候占有CPU,但是卻不是一直占有到進(jìn)程結(jié)束,進(jìn)程都有自己的時間片!因為時間片的存在,進(jìn)程會出現(xiàn)沒有被執(zhí)行完就被拿下去的情況。
(6) 在進(jìn)程重新被CPU調(diào)度的時候,CPU必須知道上一次這個進(jìn)程運(yùn)行到哪,當(dāng)進(jìn)程被換下去的時候,進(jìn)程的運(yùn)行信息會被存在操作系統(tǒng)里面,以便下次CPU重新調(diào)度時進(jìn)程能夠正常運(yùn)行,這叫做進(jìn)程的上下文保護(hù)。當(dāng)進(jìn)程被CPU重新調(diào)度上來時,首先要做的第一件事情就是讀取操作系統(tǒng)中進(jìn)程運(yùn)行的相關(guān)數(shù)據(jù),這叫做進(jìn)程的上下文恢復(fù)。
三、環(huán)境變量
?1、基本概念
- 環(huán)境變量一般是指在操作系統(tǒng)中用來指定操作系統(tǒng)運(yùn)行環(huán)境的一些參數(shù)。如:我們在編寫C/C++代碼的時候,在鏈接的時候,從來不知道我們的所鏈接的動態(tài)靜態(tài)庫在哪里,但 是照樣可以鏈接成功,生成可執(zhí)行程序,原因就是有相關(guān)環(huán)境變量幫助編譯器進(jìn)行查找;
- 環(huán)境變量通常具有某些特殊用途,還有在系統(tǒng)當(dāng)中通常具有全局特性。
?2、常見環(huán)境變量
- PATH : 指定命令的搜索路徑;
- HOME : 指定用戶的主工作目錄(即用戶登陸到Linux系統(tǒng)中時,默認(rèn)的目錄;
- SHELL : 當(dāng)前Shell,它的值通常是/bin/bash。
?3、查看環(huán)境變量方法
我們可以通過指令 echo $NAME 來查看當(dāng)前環(huán)境變量信息(NAME :環(huán)境變量名)
//查看用戶信息
echo $USER
//查看PATH環(huán)境變量
echo $PATH
?4、PATH環(huán)境變量
? (1)直接添加PATH環(huán)境變量
? (2)使用 export 命令添加
注意:我們不能直接寫成這樣:export PATH=/home/xqh/dir,這樣會導(dǎo)致把系統(tǒng)默認(rèn)的環(huán)境變量PATH覆蓋掉,我們默認(rèn)的那些指令就不能直接使用了,只能通過指定路徑的方式來使用(關(guān)掉Xshell,重新打開,就恢復(fù)了)。
?5、和環(huán)境變量相關(guān)的命令
- echo: 顯示某個環(huán)境變量值;
- export: 設(shè)置一個新的環(huán)境變量;
- env: 顯示所有環(huán)境變量;
- unset: 清除環(huán)境變量;
- set: 顯示本地定義的shell變量和環(huán)境變量。
? 1、查看所有的環(huán)境變量:env 指令
? 2、也可以通過set 指令來查看環(huán)境變量表,不過還會多很多信息,包括本地環(huán)境變量等。?
? 環(huán)境變量?具有全局屬性,可以供所有子進(jìn)程共享,倘若我們不想讓 環(huán)境變量 被共享,可以設(shè)置本地變量。
$ TEST=private? //可以直接在命令行中添加本地變量。
?
現(xiàn)在的 TEST 環(huán)境變量是不被子進(jìn)程共享的。
$ unset TEST? //移除已設(shè)置的本地環(huán)境變量
想讓 TEST 進(jìn)入 環(huán)境變量表,只用加上 export 關(guān)鍵字。
$ export TEST=public? ? ?// 此時環(huán)境變量已經(jīng)加入到環(huán)境變量表中。
?6、環(huán)境變量的組織方式
? 環(huán)境變量表是以指針數(shù)組的形式存儲的。
?7、通過代碼如何獲取環(huán)境變量
? 我相信大家心中想的 main 函數(shù)是無參的形式,實際上main函數(shù)是可以傳參的,并且最多可以傳 3 個參數(shù)。
int argc, char *argv[], char *env[]
- 我們可以通過上面的3個參數(shù)來獲取環(huán)境變量。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char* argv[], char* env[])
{
int i = 0;
for (; env[i]; i++)
{
printf("%s\n", env[i]);
}
return 0;
}
- ? 還可以通過第三方變量 environ 獲取
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
extern char** environ;
int i = 0;
for (; environ[i]; i++)
{
printf("%s\n", environ[i]);
}
return 0;
}
注意:libc 中定義的全局變量 environ 指向環(huán)境變量表,environ 沒有包含在任何頭文件中,所以在使用時要用 extern 聲明。
?8、通過系統(tǒng)調(diào)用獲取或設(shè)置環(huán)境變量
- getenv
- putenv
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* env = getenv("PATH");
printf("%s\n", env);
return 0;
}
? 通過以上運(yùn)行,可以看到既可以用函數(shù) getenv() 來獲取,也可以使用 echo $環(huán)境變量名 來獲取。
?9、環(huán)境變量通常是具有全局屬性的
- 環(huán)境變量通常具有全局屬性,可以被子進(jìn)程繼承下去。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* env = getenv("MYENV");
if (env)
{
printf("%s\n", env);
}
return 0;
}
運(yùn)行如下:?
直接查看,發(fā)現(xiàn)沒有結(jié)果,說明該環(huán)境變量根本不存在。
然后,導(dǎo)出環(huán)境變量?export MYENV="hello world" ,此時再次運(yùn)行程序,發(fā)現(xiàn)有結(jié)果了!
說明:環(huán)境變量是可以被子進(jìn)程繼承下去的!
?文章來源地址http://www.zghlxwxcb.cn/news/detail-500382.html
本文要是有不足的地方,歡迎大家在下面評論,我會在第一時間更正。
老鐵們,記著點(diǎn)贊加關(guān)注!!!???
文章來源:http://www.zghlxwxcb.cn/news/detail-500382.html
?
到了這里,關(guān)于【Linux】進(jìn)程優(yōu)先級 && 進(jìn)程切換 && 環(huán)境變量的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!