提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔
目錄
文章目錄
前言
一、進(jìn)程優(yōu)先級(jí)
1.1、進(jìn)程優(yōu)先級(jí)的基本概念
1.2、優(yōu)先級(jí) VS 權(quán)限
1.3、為什么要有優(yōu)先級(jí)?
1.4、Linux的優(yōu)先級(jí)的特點(diǎn) && 查看方式
1.5、PRI and NI
1.6、用top命令更改已存在進(jìn)程的nice
1.7、其他概念
二、命令行參數(shù)
三、環(huán)境變量
3.1、基本概念
3.2、常見環(huán)境變量
3.3、查看環(huán)境變量方法
3.4、有什么方法可以不用帶路徑,直接就可以運(yùn)行呢?
強(qiáng)硬的方法:
溫柔的方法:
但是我們依然想要將可執(zhí)行程序myprocess的路徑添加到PATH環(huán)境變量里?
我們想要我們添加的路徑,永久的保存在PATH環(huán)境變量里,怎么做呢?
3.5、和環(huán)境變量相關(guān)的命令
3.6、環(huán)境變量的組織方式
3.7、通過(guò)代碼如何獲取環(huán)境變量
通過(guò)第三方變量environ獲取
命令行第三個(gè)參數(shù)
3.8、通過(guò)系統(tǒng)調(diào)用獲取或設(shè)置環(huán)境變量
3.9、環(huán)境變量通常是具有全局屬性的
3.10、內(nèi)建命令
總結(jié)
前言
世上有兩種耀眼的光芒,一種是正在升起的太陽(yáng),一種是正在努力學(xué)習(xí)編程的你!一個(gè)愛學(xué)編程的人。各位看官,我衷心的希望這篇博客能對(duì)你們有所幫助,同時(shí)也希望各位看官能對(duì)我的文章給與點(diǎn)評(píng),希望我們能夠攜手共同促進(jìn)進(jìn)步,在編程的道路上越走越遠(yuǎn)!
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、進(jìn)程優(yōu)先級(jí)
1.1、進(jìn)程優(yōu)先級(jí)的基本概念
- 指定進(jìn)程獲取某種資源(如:CPU等)的先后順序。
- 優(yōu)先權(quán)高的進(jìn)程有優(yōu)先執(zhí)行權(quán)利。配置進(jìn)程優(yōu)先權(quán)對(duì)多任務(wù)環(huán)境的linux很有用,可以改善系統(tǒng)性能。
- 還可以把進(jìn)程運(yùn)行到指定的CPU上,這樣一來(lái),把不重要的進(jìn)程安排到某個(gè)CPU,可以大大改善系統(tǒng)整體性能。
- Linux中優(yōu)先級(jí)數(shù)字越小,優(yōu)先級(jí)越高。
要維護(hù)一個(gè)進(jìn)程的優(yōu)先級(jí):task_struct 進(jìn)程控制塊(是描述進(jìn)程,里面包含了進(jìn)程的所有屬性) --->? ? ?struct ----> 內(nèi)部字段 ----> (default_proi = 80) + (nice = ??) = proi(新的優(yōu)先級(jí))。
進(jìn)程的優(yōu)先級(jí)也是進(jìn)程控制塊中所有屬性的一種(是內(nèi)部字段中的一部分)。
1.2、優(yōu)先級(jí) VS 權(quán)限
權(quán)限:是能不能的問(wèn)題。
優(yōu)先級(jí):已經(jīng)能了,我們獲取資源的順序。
1.3、為什么要有優(yōu)先級(jí)?
進(jìn)程訪問(wèn)的資源(CPU)始終都是有限的,系統(tǒng)中進(jìn)程大部分情況都是較多的。
操作系統(tǒng)關(guān)于調(diào)度和優(yōu)先級(jí)的原則:分時(shí)操作系統(tǒng),基本的公平,如果進(jìn)程因?yàn)殚L(zhǎng)時(shí)間不被調(diào)度,就造成了饑餓問(wèn)題。
1.4、Linux的優(yōu)先級(jí)的特點(diǎn) && 查看方式
- ps -l:只能查看當(dāng)前終端(當(dāng)前所在分頻頁(yè)面)下啟動(dòng)的進(jìn)程。
- ps -al:查看所有終端下啟動(dòng)的進(jìn)程。
我們很容易注意到其中的幾個(gè)重要信息,有下:
- UID : 代表執(zhí)行者的身份
- PID : 代表這個(gè)進(jìn)程的代號(hào)
- PPID :代表這個(gè)進(jìn)程是由哪個(gè)進(jìn)程發(fā)展衍生而來(lái)的,亦即父進(jìn)程的代號(hào)
- PRI :代表這個(gè)進(jìn)程可被執(zhí)行的優(yōu)先級(jí),其值越小越早被執(zhí)行
- NI :代表這個(gè)進(jìn)程的nice值
- 每次調(diào)整優(yōu)先級(jí),都是從80開始的
- nice/renice:可以對(duì)一個(gè)指定的進(jìn)程,在啟動(dòng)前或運(yùn)行時(shí),對(duì)進(jìn)程的優(yōu)先級(jí)做動(dòng)態(tài)調(diào)整
- nice并不能讓你任意調(diào)整,而是有范圍的!若任意調(diào)整的話,會(huì)打破原則中基本的公平
- ?一個(gè)進(jìn)程的優(yōu)先級(jí)是不能頻繁更改的
NI:進(jìn)程優(yōu)先級(jí)的修正數(shù)據(jù),nice值,新的優(yōu)先級(jí) = 優(yōu)先級(jí) + nice,達(dá)到對(duì)于進(jìn)程優(yōu)先級(jí)動(dòng)態(tài)修改的過(guò)程。
nice并不能讓你隨意調(diào)整,而是有范圍的。[-20~19]
1.5、PRI and NI
- PRI也還是比較好理解的,即進(jìn)程的優(yōu)先級(jí),或者通俗點(diǎn)說(shuō)就是程序被CPU執(zhí)行的先后順序,此值越小 進(jìn)程的優(yōu)先級(jí)別越高
- 那NI呢?就是我們所要說(shuō)的nice值了,其表示進(jìn)程可被執(zhí)行的優(yōu)先級(jí)的修正數(shù)值
- PRI值越小越快被執(zhí)行,那么加入nice值后,將會(huì)使得PRI變?yōu)椋篜RI(new)=PRI(old)+nice
- 這樣,當(dāng)nice值為負(fù)值的時(shí)候,那么該程序?qū)?huì)優(yōu)先級(jí)值將變小,即其優(yōu)先級(jí)會(huì)變高,則其越快被執(zhí)行
- 所以,調(diào)整進(jìn)程優(yōu)先級(jí),在Linux下,就是調(diào)整進(jìn)程nice值
- nice其取值范圍是-20至19,一共40個(gè)級(jí)別。
1.6、用top命令更改已存在進(jìn)程的nice
- top
- 進(jìn)入top后按“r”–>輸入進(jìn)程PID–>輸入nice值
1.7、其他概念
- 競(jìng)爭(zhēng)性: 系統(tǒng)進(jìn)程數(shù)目眾多,而CPU資源只有少量,甚至1個(gè),所以進(jìn)程之間是具有競(jìng)爭(zhēng)屬性的。為了高效完成任務(wù),更合理競(jìng)爭(zhēng)相關(guān)資源,便具有了優(yōu)先級(jí)。
- 獨(dú)立性: 多進(jìn)程運(yùn)行,需要獨(dú)享各種資源,多進(jìn)程運(yùn)行期間互不干擾。
- 并行: 多個(gè)進(jìn)程在多個(gè)CPU下分別,同時(shí)進(jìn)行運(yùn)行,這稱之為并行。
- 并發(fā): 多個(gè)進(jìn)程在一個(gè)CPU下采用進(jìn)程切換的方式,在一段時(shí)間之內(nèi),讓多個(gè)進(jìn)程都得以推進(jìn),稱之為并發(fā)。
多個(gè)進(jìn)程在一個(gè)CPU下采用進(jìn)程切換的方式,在一段時(shí)間之內(nèi),讓多個(gè)進(jìn)程都得以推進(jìn)的方式:
如果這種方式下,進(jìn)程過(guò)多,CPU切換負(fù)擔(dān)過(guò)重,那么這些進(jìn)程會(huì)出現(xiàn)卡頓的情況,本質(zhì)是每一個(gè)進(jìn)程被CPU調(diào)度的周期變長(zhǎng)了。
二、命令行參數(shù)
vim Makefile
myprocess : myprocess.c
gcc - o $@ $ ^ -g
.PHONY:clean
clean :
rm - f myprocess
:%s/testStatus/myprocess/ //:將testStatus改成myprocess
vim myprocess.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
//第一個(gè)參數(shù)argc代表指針數(shù)組中參數(shù)的個(gè)數(shù)有多少
//第二個(gè)參數(shù)類型:指針數(shù)組,char *指向的是字符串首字符的地址
int main(int argc, char* argv[])
{
if (argc != 2)
{
printf("Usage: %s -[a,b,c,d]\n", argv[0]);//下標(biāo)為0的位置,始終會(huì)有元素(./程序名)
return 1;
}
if(strcmp(argv[1], "-a") == 0)
{
printf("this is function1\n");
}
else if(strcmp(argv[1], "-b") == 0)
{
printf("this is function2\n");
}
else if(strcmp(argv[1], "-c") == 0)
{
printf("this is function3\n");
}
else if(strcmp(argv[1], "-d") == 0)
{
printf("this is function4\n");
}
else
{
printf("no this function!!\n");
}
for(int i = 0; i < argc; i++)
{
printf("argv[%d]->%s\n", i, argv[i]);
}
}
為什么要有命令行參數(shù):
本質(zhì):命令行參數(shù)本質(zhì)是交給我們程序不同的選型,用來(lái)定制不同的程序功能。命令行中會(huì)攜帶很多的選項(xiàng)。就像 switch 和 case一樣。
命令行解釋器(bash)在啟動(dòng)時(shí),會(huì)為我們維護(hù)一張指針數(shù)組表,bash將 ./myprocess -a -b -c -d這條命令,遇到這條命令的空格就分成了 n 個(gè)子字符串,將子字符串轉(zhuǎn)換成指針數(shù)組表里的元素。
我們?cè)賮?lái)看接下來(lái)的代碼:
vim myprocess.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
int g_val = 100000;
int main()
{
printf("I am father process, pid: %d, ppid: %d, g_val: %d\n", getpid(), getppid(), g_val);
sleep(5);
pid_t id = fork();
if(id == 0)
{
//child
while(1)
{
printf("I am child process, pid: %d, ppid: %d, g_val: %d\n", getpid(), getppid(), g_val);
sleep(1);
}
}
else
{
// father
while(1)
{
printf("I am father process, pid: %d, ppid: %d, g_val: %d\n", getpid(), getppid(), g_val);
sleep(1);
}
}
}
父進(jìn)程的數(shù)據(jù),默認(rèn)能被子進(jìn)程看到并訪問(wèn)。
命令行中啟動(dòng)的程序,都會(huì)變成進(jìn)程,其實(shí)都是bash的子進(jìn)程。
三、環(huán)境變量
3.1、基本概念
- 環(huán)境變量(environment variables)一般是指在操作系統(tǒng)中用來(lái)指定操作系統(tǒng)運(yùn)行環(huán)境的一些參數(shù),如:我們?cè)诰帉慍/C++代碼的時(shí)候,在鏈接的時(shí)候,從來(lái)不知道我們的所鏈接的動(dòng)態(tài)靜態(tài)庫(kù)在哪里,但是照樣可以鏈接成功,生成可執(zhí)行程序,原因就是有相關(guān)環(huán)境變量幫助編譯器進(jìn)行查找。
- 環(huán)境變量通常具有某些特殊用途,還有在系統(tǒng)當(dāng)中通常具有全局特性。
3.2、常見環(huán)境變量
- PATH : 指定命令的搜索路徑
- HOME : 指定用戶的主工作目錄(即用戶登陸到Linux系統(tǒng)中時(shí),默認(rèn)的目錄)
- SHELL : 當(dāng)前Shell,它的值通常是/bin/bash
- HISTSIZE:默認(rèn)記錄用戶輸入的最新的1000條的歷史命令
3.3、查看環(huán)境變量方法
echo $PATH
//顯示 PATH 環(huán)境變量的內(nèi)容
3.4、有什么方法可以不用帶路徑,直接就可以運(yùn)行呢?
我們自己生成的可執(zhí)行程序,必須加程序的路徑(./)才可以執(zhí)行;但是Linux中的ls、pwd等這些可執(zhí)行程序不需要加程序的路徑,都可以執(zhí)行,為什么呢?
Linux中,存在一些全局的設(shè)置,表明,告訴命令行解釋器,應(yīng)該去那些路徑下,去尋找可執(zhí)行程序。ls命令的路徑是在PATH環(huán)境變量當(dāng)中的,所以執(zhí)行l(wèi)s命令,就不用帶./
echo $PATH
我們一般執(zhí)行那個(gè)命令的時(shí)候,我們的命令行解釋器(bash)會(huì)先去 PATH 這個(gè)環(huán)境變量下的所有路徑里去找有沒有我們對(duì)應(yīng)的可執(zhí)行程序,如果有,就不用加程序的路徑(./)了;如果沒有,就得加程序的路徑(./)。
強(qiáng)硬的方法:
sudo cp myprocess usr/bin/
我們把我們寫的myprocess可執(zhí)行程序拷貝(安裝)到Linux系統(tǒng)里指定的PATH環(huán)境變量下的 usr/bin 路徑下。
溫柔的方法:
把我們寫的可執(zhí)行程序myprocess的路徑添加到PATH環(huán)境變量里呢?
PATH=/home/song/111/code/lesson
因?yàn)镻ATH是變量,我們可以直接讓路徑賦值給環(huán)境變量,但是我們會(huì)把PATH環(huán)境變量下的所有路徑都給覆蓋了,不能這么干。
但是不用擔(dān)心,因?yàn)槟壳?span style="color:#fe2c24;">PATH環(huán)境變量是我們登錄Linux系統(tǒng)的時(shí)候,就已經(jīng)被加載到bash進(jìn)程當(dāng)中(內(nèi)存),現(xiàn)在的環(huán)境變量是內(nèi)存級(jí)的(默認(rèn)我們查到的環(huán)境變量是內(nèi)存級(jí)的);實(shí)際上環(huán)境變量的設(shè)置,不僅僅是在內(nèi)存里,在系統(tǒng)的配置文件里也是有的,我們?cè)僦匦碌卿浺幌翷inux系統(tǒng)就可以了。
但是我們依然想要將可執(zhí)行程序myprocess的路徑添加到PATH環(huán)境變量里?
PATH=$PATH:/home/song/111/code/lesson
保留原來(lái)PATH里的路徑,再添加一個(gè)路徑。
但是這個(gè)只是在內(nèi)存級(jí)里設(shè)置的,Linux系統(tǒng)重新登錄一下,我們添加的路徑又會(huì)消失。
我們想要我們添加的路徑,永久的保存在PATH環(huán)境變量里,怎么做呢?
最開始的環(huán)境變量不是在內(nèi)存中,而是默認(rèn)在系統(tǒng)對(duì)應(yīng)的配置文件中。在登錄Linux系統(tǒng)的時(shí)候,會(huì)創(chuàng)建一個(gè)bash進(jìn)程,系統(tǒng)里的配置文件會(huì)被bash進(jìn)程拷貝一份,所以,我們每次重新登錄的時(shí)候,PATH下的路徑都會(huì)回復(fù)原樣。
系統(tǒng)的配置文件在哪里?
這些配置文件都在屬于自己的家目錄下。
PATH=$PATH:/home/song/111/code/lesson
我們可以把我們添加的路徑,可以通過(guò) PATH=$PATH:/home/song/111/code/lesson它,添加到系統(tǒng)的配置文件中,這樣我們每次重新打開Linux系統(tǒng),我們都可以不帶路徑(./)來(lái)執(zhí)行可執(zhí)行程序(myprocess)。
3.5、和環(huán)境變量相關(guān)的命令
- echo + $xxx: 顯示某個(gè)環(huán)境變量值
- export + name=val: 導(dǎo)入一個(gè)新的環(huán)境變量name
- env: 顯示所有環(huán)境變量
- unset + name: 清除環(huán)境變量
- set: 顯示本地定義的shell變量和環(huán)境變量
我們導(dǎo)入一個(gè)變量 hello=123456 ,但是我們沒有寫export,我們?cè)谒械沫h(huán)境變量中搜索,并沒有找到,但是我們卻能夠單獨(dú)把這個(gè)變量的內(nèi)容打印到屏幕上。雖然?hello 變量在環(huán)境變量中,但是叫本地變量(身在曹營(yíng),心在漢)。
3.6、環(huán)境變量的組織方式
每個(gè)程序都會(huì)收到一張環(huán)境變量表,環(huán)境變量表是一個(gè)字符指針數(shù)組,每個(gè)指針指向一個(gè)以’\0’結(jié)尾的環(huán)境字符串。
3.7、通過(guò)代碼如何獲取環(huán)境變量
通過(guò)第三方變量environ獲取
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
// 獲取一下環(huán)境變量
extern char** environ;//聲明一下 environ
for(int i = 0; environ[i]; i++)
{
printf("env[%d]->%s\n", i, environ[i]);
}
}
//字符串可以理解為數(shù)組,數(shù)組名就是數(shù)組首元素的地址
//environ[i]:是指針數(shù)組里面的元素,元素是環(huán)境變量(字符串)的地址,所以元素就是字符串
libc中定義的全局變量environ指向環(huán)境變量表,environ沒有包含在任何頭文件中,所以在使用時(shí) 要用extern聲明。
命令行第三個(gè)參數(shù)
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[], char *env[])
{
int i = 0;
for(; env[i]; i++){
printf("%s\n", env[i]);
}
return 0;
}
磁盤中有系統(tǒng)的配置文件,而配置文件里面包含了環(huán)境變量;Linux系統(tǒng)登錄,會(huì)在內(nèi)存中加載bash進(jìn)程。bash進(jìn)程將配置文件(里面包含,環(huán)境變量)里的數(shù)據(jù)拷貝了一份。
環(huán)境變量可是很多的,bash內(nèi)部是如何組織的呢?
bash在啟動(dòng)時(shí),也會(huì)為我們維護(hù)一張表,這張表是一個(gè)指針數(shù)組表(char *env[]),這張表指向的內(nèi)容都是char*的,所以,每當(dāng)我們有一個(gè)環(huán)境變量(就是字符串,如:PATH=/usr/bin:/a/b/c/...),環(huán)境變量把對(duì)應(yīng)的字符串,從配置文件加載進(jìn)來(lái),字符串信息就有了,把字符串的地址填到我們的環(huán)境變量表里,環(huán)境變量表的最后一位以 NULL 結(jié)尾。
bash進(jìn)程啟動(dòng)的時(shí)候,默認(rèn)會(huì)給我們子進(jìn)程形成兩張表:argv[]命令行參數(shù)表,env[]環(huán)境變量表(從OS的配置文件夾來(lái))。bash通過(guò)各種方式交給子進(jìn)程。
3.8、通過(guò)系統(tǒng)調(diào)用獲取或設(shè)置環(huán)境變量
putenv , 后面講解
getenv , 根據(jù)環(huán)境變量名拿到環(huán)境變量的內(nèi)容,本次講解
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char* argv[], char* env[])
{
char* path = getenv("PATH");
if (path == NULL)
return 1;
printf("path: %s\n", path);
for (int i = 0; env[i]; i++)
{
printf("env[%d]->%s\n", i, env[i]);
}
fork(); // 能!子進(jìn)程能獲得命令行參數(shù)和全局變量 bash(父進(jìn)程) ---> main(子進(jìn)程) ---> fork()(創(chuàng)建子進(jìn)程的子進(jìn)程)
}
常用getenv和putenv函數(shù)來(lái)訪問(wèn)特定的環(huán)境變量。
3.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;
}
直接查看,發(fā)現(xiàn)沒有結(jié)果,說(shuō)明該環(huán)境變量根本不存在
- 導(dǎo)出環(huán)境變量? ?export MYENV="hello world"
- 再次運(yùn)行程序,發(fā)現(xiàn)結(jié)果有了!說(shuō)明:環(huán)境變量是可以被子進(jìn)程繼承下去的!想想為什么?
3.10、內(nèi)建命令
export myval=111111
//將導(dǎo)入myval成環(huán)境變量
echo $myval
//也能將環(huán)境變量myval的內(nèi)容打印出來(lái)(111111)
那么export命令被命令行解釋器(bash)運(yùn)行的時(shí)候,不會(huì)創(chuàng)建子進(jìn)程嗎?
如果創(chuàng)建子進(jìn)程,那么export導(dǎo)出來(lái)的環(huán)境變量就不應(yīng)該被bash看到。
因?yàn)楦高M(jìn)程的數(shù)據(jù),默認(rèn)能被子進(jìn)程看到并訪問(wèn),是因?yàn)閯?chuàng)建子進(jìn)程的時(shí)候,子進(jìn)程是通過(guò)fork()繼承的方式,看到父進(jìn)程的。如果子進(jìn)程導(dǎo)入了一些環(huán)境變量做修改了,父進(jìn)程是看不到的。
但是,我們這里的父進(jìn)程是能夠看到導(dǎo)入環(huán)境變量的內(nèi)容的,這是怎么回事?
那是因?yàn)?export 、echo是內(nèi)建命令,由父進(jìn)程(bash)親自執(zhí)行,并不會(huì)創(chuàng)建子進(jìn)程。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-843276.html
總結(jié)
好了,本篇博客到這里就結(jié)束了,如果有更好的觀點(diǎn),請(qǐng)及時(shí)留言,我會(huì)認(rèn)真觀看并學(xué)習(xí)。
不積硅步,無(wú)以至千里;不積小流,無(wú)以成江海。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-843276.html
到了這里,關(guān)于【Linux】進(jìn)程優(yōu)先級(jí) && 命令行參數(shù) && 環(huán)境變量的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!