Linux進(jìn)程優(yōu)先級(jí)和環(huán)境變量詳解_第1頁(yè)
Linux進(jìn)程優(yōu)先級(jí)和環(huán)境變量詳解_第2頁(yè)
Linux進(jìn)程優(yōu)先級(jí)和環(huán)境變量詳解_第3頁(yè)
Linux進(jìn)程優(yōu)先級(jí)和環(huán)境變量詳解_第4頁(yè)
Linux進(jìn)程優(yōu)先級(jí)和環(huán)境變量詳解_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

WordLinux進(jìn)程優(yōu)先級(jí)和環(huán)境變量詳解一、進(jìn)程優(yōu)先級(jí)

1、基本概念

(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)對(duì)多任務(wù)環(huán)境的(Linux)很有用,可以改善系統(tǒng)性能。還可以把進(jìn)程運(yùn)行到指定的CPU上,這樣一來(lái),把不重要的進(jìn)程安排到某個(gè)CPU,可以大大改善系統(tǒng)整體性能。

2、查看以及修改系統(tǒng)進(jìn)程的優(yōu)先級(jí)

在Linux或者unix系統(tǒng)中,用ps–al命令則會(huì)類似輸出以下幾個(gè)內(nèi)容,其中:

UID:代表執(zhí)行者的身份

(PI)D:代表這個(gè)進(jìn)程的

PPID:代表這個(gè)進(jìn)程是由哪個(gè)進(jìn)程發(fā)展衍生而來(lái)的,亦即父進(jìn)程的

PRI:代表這個(gè)進(jìn)程可被執(zhí)行的優(yōu)先級(jí),其值越小越早被執(zhí)行

NI:代表這個(gè)進(jìn)程的nice值,其表示進(jìn)程可被執(zhí)行的優(yōu)先級(jí)的修正數(shù)值。

我們看到我們現(xiàn)在有兩個(gè)進(jìn)程bashps它們的進(jìn)程優(yōu)先級(jí)都是80,如果我們要修改它們的優(yōu)先級(jí)就要用到NI的nice值了。

P

R

I

(

n

e

w

)

=

P

R

I

(

o

l

d

)

+

n

i

c

e

PRI(new)=PRI(old)+nicePRI(new)=PRI(old)+nice

從這個(gè)公式中我們知道新的PRI=老的PRI+nice值,但是這個(gè)老的PRI的值是指PRI最初的默認(rèn)值,例如上面的bashps是80,那么這個(gè)PRI以后不論怎么改老的PRI都是80,當(dāng)然大多數(shù)進(jìn)程默認(rèn)的PRI都是80。

此外nice是有范圍的!其取值范圍是-20至19,一共40個(gè)級(jí)別。

于是下面我們?nèi)L試去更改processC進(jìn)程的優(yōu)先級(jí)。

注意:將進(jìn)程優(yōu)先級(jí)調(diào)高(即將nice值設(shè)置為負(fù)數(shù))需要root用戶進(jìn)行操作!

修改進(jìn)程優(yōu)先級(jí)的Linux指令

top命令

進(jìn)入top后按"r"->輸入進(jìn)程PID->輸入nice值

按下“r”

輸入-20

再次[查看進(jìn)程]的相關(guān)信息:

我們發(fā)現(xiàn)進(jìn)程的優(yōu)先級(jí)確實(shí)改變了,但是我們能改變進(jìn)程優(yōu)先級(jí)有限[?20,19][-20,19][?20,19],因?yàn)檎{(diào)度器不允許我們將一個(gè)進(jìn)程設(shè)置的優(yōu)先級(jí)太高,進(jìn)而導(dǎo)致其他進(jìn)程難以被調(diào)度。

3、一些其他的關(guān)于進(jìn)程優(yōu)先級(jí)的指令和函數(shù)調(diào)用

nice指令,nice命令的功能是用于調(diào)整進(jìn)程的優(yōu)先級(jí),合理分配系統(tǒng)資源。-n參數(shù)是nice值的優(yōu)先級(jí)別,

以nice值為-5的方式執(zhí)行指定程序

查看進(jìn)程優(yōu)先級(jí)

renice命令可以修改正在運(yùn)行的進(jìn)程的調(diào)度優(yōu)先級(jí)。

renice更改一個(gè)或多個(gè)進(jìn)程的調(diào)度優(yōu)先級(jí)。第一個(gè)參數(shù)是要使用的優(yōu)先級(jí)值,另一個(gè)參數(shù)被表示為進(jìn)程標(biāo)識(shí)信息。

renice

[-n]

priority

[-(gpu)]

iden(ti)fier

-g,后面加組的pgid,改變一個(gè)組的進(jìn)程優(yōu)先級(jí)

-u,后面加username或uid,改變一個(gè)用戶所擁有的進(jìn)程優(yōu)先級(jí)。

-p,后面加pid,改變一個(gè)進(jìn)程的進(jìn)程優(yōu)先級(jí)。

使用renice命令

函數(shù)調(diào)用

在Linux中關(guān)于改變進(jìn)程優(yōu)先級(jí)函數(shù)調(diào)用主要有兩個(gè):getpriority()與setpriority()。

4、與進(jìn)程優(yōu)先級(jí)有關(guān)的一些進(jìn)程性質(zhì)

競(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ā)

二、環(huán)境變量

1、基本概念

環(huán)境變量(environmentvariables)一般是指在(操作系統(tǒng))中用來(lái)指定操作系統(tǒng)運(yùn)行環(huán)境的一些參數(shù),環(huán)境變量通常具有某些特殊用途,在系統(tǒng)當(dāng)中通常具有全局特性。

如:我們?cè)诰帉慍/(C++)代碼的時(shí)候,在鏈接的時(shí)候,從來(lái)不知道我們的所鏈接的動(dòng)態(tài)[靜態(tài)庫(kù)]在哪里,但是照樣可以鏈接成功,生成可執(zhí)行程序,原因就是有相關(guān)環(huán)境變量幫助編譯器進(jìn)行查找。

2、和環(huán)境變量相關(guān)的命令

1.env:顯示所有環(huán)境變量

2.echo:顯示的變量值(需要帶上$符號(hào))

3.export:設(shè)置一個(gè)新的環(huán)境變量,或者將本地[變量提升]成環(huán)境變量。

4.unset:清除環(huán)境變量

5.set:顯示本地定義的shell變量和環(huán)境變量

3、Linux中的常見(jiàn)環(huán)境變量介紹

PATH:指定命令的搜索路徑

例如我們使用的Linux中l(wèi)spwd命令,其實(shí)就是一個(gè)個(gè)C語(yǔ)言寫的一個(gè)個(gè)小程序,為什么我們運(yùn)行自己寫的程序就要用./+自己的程序名,而我們運(yùn)行l(wèi)spwd從來(lái)不加./,這就和環(huán)境變量PATH有關(guān)了!

我們查看環(huán)境變量可以使用echo$環(huán)境變量命令:

默認(rèn)情況下我們使用的Linux指令會(huì)去PATH路徑下尋找源程序,由于ls指令的路徑位置就在PATH的環(huán)境變量中所以我們可以不用加./

我們現(xiàn)在嘗試將我們的路徑添加到PATH環(huán)境變量里面,來(lái)讓我們的程序也不需要加./,這時(shí)我們就需要使用一個(gè)新的指令了:export

export令可以將本地變量提升成環(huán)境變量,于是我們將我們的路徑添加到PATH中就可以這樣寫:

export

PATH=$PATH:你要添加的路徑

當(dāng)然我們使用export命令是暫時(shí)將本地變量提升為環(huán)境變量,當(dāng)我們退出云服務(wù)器或關(guān)機(jī)重啟都會(huì)消除export暫時(shí)提升的環(huán)境變量,想要真正的修改我們要修改相應(yīng)的配置文件。

當(dāng)然我們還可以將我們寫的程序拷貝到Linux的PATH默認(rèn)路徑下,這樣我們也不用使用./了,在Linux中,把可執(zhí)行程序,拷貝到系統(tǒng)默認(rèn)路徑下,讓我們可以直接訪問(wèn)的方式,相當(dāng)于Linux下軟件的安裝!

HOME:指定用戶的主工作目錄(即用戶登陸到Linux系統(tǒng)中時(shí),默認(rèn)的目錄)

由于HOME環(huán)境變量的存在,我們使用相同的命令cd~卻得到了不同的結(jié)果。

SHELL:當(dāng)前Shell,它的值通常是/bin/bash。

4、環(huán)境變量的組織方式以及在C代碼中如何獲取環(huán)境變量

在Shell內(nèi)部,環(huán)境變量其實(shí)是以環(huán)境變量表的方式進(jìn)行維護(hù)的!

此外環(huán)境變量還具有全局性,我們知道我們?cè)赽ash下運(yùn)行的程序其父進(jìn)程都是bash,那么bash就可以將自己的環(huán)境變量傳遞給子進(jìn)程,并在子進(jìn)程中發(fā)揮作用!

我們來(lái)看一段代碼來(lái)驗(yàn)證環(huán)境變量具有全局性。

1.C庫(kù)函數(shù)getenv()獲得單個(gè)環(huán)境變量

在看驗(yàn)證代碼之前我們先了解一個(gè)函數(shù)getenv()getenv()是一個(gè)C庫(kù)函數(shù),它可以獲取一個(gè)環(huán)境變量的內(nèi)容

函數(shù)原型:

函數(shù)的參數(shù)是環(huán)境變量的名稱,返回值是一個(gè)char*字符串記錄了環(huán)境變量里面的內(nèi)容,如果調(diào)用失敗會(huì)返回NULL指針。

實(shí)例代碼

#include

#include

int

main(){

char*

env

=

getenv("USER");//USER是環(huán)境變量

if(env

==

NULL)

{

perror("getenv

fail:");

}

printf("%s",env);

return

0;}

代碼輸出結(jié)果

我們?cè)诖a里面多出來(lái)的USER變量就是來(lái)自Shell傳遞給我們的(te)st1c進(jìn)程的環(huán)境變量!

2.main()函數(shù)參數(shù)獲得環(huán)境變量

此外我們我們還可以用main函數(shù)的參數(shù)來(lái)獲得所有環(huán)境變量的地址,通過(guò)地址我們也能遍歷所有環(huán)境變量

函數(shù)原型

int

main(int

argc,

char

*argv[],

char

*envp[]);

在這里我們先不談?wù)摵瘮?shù)的參數(shù)argc*argv[],我們來(lái)談?wù)摰谌齻€(gè)參數(shù)!其中*envp[]是一個(gè)字符數(shù)組指針,指向的是一個(gè)指針數(shù)組,數(shù)組名代表首元素的地址,首元素是一個(gè)字符指針,*envp[]剛好又是指向首元素的指針,故其實(shí)*envp[]其實(shí)是一個(gè)二級(jí)指針!

明白了這些,我們來(lái)看下面一段代碼:

#includeint

main(int

argc,

int

*argv[],

int

*envp[]){

for(int

i

=0;

envp[i]

!=

NULL

;

++i)

{

//打印所有環(huán)境變量,相當(dāng)于env命令!

printf("envp[%d]-->%s",

i,

envp[i]);

}

return

0;}

可以看到我們確實(shí)打印出了所有的環(huán)境變量,而且這個(gè)環(huán)境變量來(lái)自于其父進(jìn)程bash。

3.C語(yǔ)言全局變量environ獲得環(huán)境變量

變量詳情:

environ變量是一個(gè)二級(jí)指針與main()函數(shù)參數(shù)的char*envp[]類似。遍歷所有環(huán)境變量也可以這樣寫:

#include

#include

int

main(){

extern

char**

environ;

for(int

i

=0;

environ[i]

!=

NULL;

++i)

{

printf("environ[%d]-->%s",

i,

environ[i]);

}

return

0;}

5、不同用戶的環(huán)境變量是怎么形成的

通過(guò)上面的講解我們知道了環(huán)境變量的概念與作用,環(huán)境變量中的每一個(gè),都有自己的用途:有的是進(jìn)行路徑查找的,有的時(shí)進(jìn)行身份(認(rèn)證)的,有的時(shí)進(jìn)行動(dòng)態(tài)庫(kù)查找的,有的是用來(lái)進(jìn)行確認(rèn)當(dāng)前路徑等等每一個(gè)環(huán)境變量都有自己的特定應(yīng)用場(chǎng)景。

我們也知道為什么,對(duì)于不同的用戶其環(huán)境變量也并不相同,例如我們上面的root用戶的環(huán)境變量與pan的環(huán)境變量有的一樣有的不一樣,那么Linux是怎樣形成不同的環(huán)境變量的呢?

這里先給出結(jié)論:環(huán)境變量本質(zhì)就是一個(gè)內(nèi)存級(jí)的一張表,這張表由用戶在登陸會(huì)統(tǒng)的時(shí)候,給特定用戶形成屬于自己的環(huán)境變量表。

在我們的家目錄下有兩個(gè)文件叫.bashrc.bash_profile在根目錄下有一個(gè)bashrc的文件

打開(kāi)這些文件看看!

6、main()函數(shù)的命令行參數(shù)

在前面我們談?wù)撝形覀冋f(shuō)到過(guò)main()函數(shù)的參數(shù)問(wèn)題,我們還有兩個(gè)參數(shù)沒(méi)有談?wù)搃ntargcchar*argv[]。現(xiàn)在我們來(lái)討論它們!

由于C語(yǔ)言中無(wú)法傳遞整個(gè)數(shù)組,所以在函數(shù)中想要獲得數(shù)組元素的個(gè)數(shù)必須在傳參時(shí)就要提前傳遞好,于是其中intargc就是char*argv[]數(shù)組指針指向的數(shù)組的有效元素個(gè)數(shù),不包含NULL。

這個(gè)char*argv[]是一個(gè)數(shù)組指針,其指向的數(shù)組里面存放的都是char*的指針,這些char*的指針指向的內(nèi)容需要我們使用命令行的方式進(jìn)行設(shè)置。

我們先看下面一段代碼:

#include

int

main(int

argc,

int

*argv[]){

printf("arg

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論