欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報(bào)激活碼778899分享:運(yùn)維 Linux——進(jìn)程

柚子快報(bào)激活碼778899分享:運(yùn)維 Linux——進(jìn)程

http://yzkb.51969.com/

?個(gè)人主頁:Yui_ ?Linux專欄:Linux ?C語言筆記專欄:C語言筆記 ?數(shù)據(jù)結(jié)構(gòu)專欄:數(shù)據(jù)結(jié)構(gòu) ?C++專欄:C++

文章目錄

1. 進(jìn)程1.1 基本概念1.2 描述進(jìn)程 -PCB1.2.3 介紹task_struct

1.3 查看進(jìn)程1.4 通過系統(tǒng)調(diào)用獲取進(jìn)程標(biāo)識符1.5 通過系統(tǒng)調(diào)用創(chuàng)建進(jìn)程 -fork

2. 進(jìn)程狀態(tài)

1. 進(jìn)程

1.1 基本概念

當(dāng)我們編寫完代碼運(yùn)行并讓代碼編譯起來時(shí),在當(dāng)前路徑下會出現(xiàn)由代碼編譯而成的可執(zhí)行文件.exe。當(dāng)我們運(yùn)行這個(gè)可執(zhí)行文件時(shí),該程序便會被加載到計(jì)算機(jī)的內(nèi)存當(dāng)中,一些教材可能會把這個(gè)已經(jīng)運(yùn)行起來的程序叫做進(jìn)程,其實(shí)這是不完整的,真實(shí)的進(jìn)程還需要包括管理這個(gè)程序的PCB。

課本概念:程序的一個(gè)執(zhí)行實(shí)例,正在執(zhí)行的程序。內(nèi)核觀念:擔(dān)當(dāng)分配系統(tǒng)資源(CPU時(shí)間,內(nèi)存)的實(shí)體。

1.2 描述進(jìn)程 -PCB

進(jìn)程信息被放在一個(gè)叫做進(jìn)程控制塊(process control block)的數(shù)據(jù)結(jié)構(gòu)中,可以理解為進(jìn)程屬性的集合。在教材中一般叫PCB(process control block),Linux操作系統(tǒng)下的PCB是task_struct. PCB是一個(gè)結(jié)構(gòu)體,是為了管理加載到內(nèi)存的程序而產(chǎn)生的。

1.2.3 介紹task_struct

在Linux中每一個(gè)進(jìn)程都由task_struct數(shù)據(jù)結(jié)構(gòu)來定義,task_struct就是我們通常所說的PCB,它是隊(duì)進(jìn)程的唯一控制手段也是最有效的手段,當(dāng)我們調(diào)用fork()時(shí),系統(tǒng)會為我們產(chǎn)生一個(gè)task_struct結(jié)構(gòu)。然后從父進(jìn)程繼承一些數(shù)據(jù),并把新的進(jìn)程插入到進(jìn)程樹,以待進(jìn)行進(jìn)程管理,因此了解task_struct的結(jié)構(gòu)對于我們理解進(jìn)程調(diào)度的關(guān)鍵。 task_struct是如何管理進(jìn)程的,先描述,再組織。在task_struct結(jié)構(gòu)中有以下定義:

進(jìn)程狀態(tài),將記錄進(jìn)程在等待、運(yùn)行、或者死鎖。調(diào)度信息,由哪個(gè)調(diào)度函數(shù)調(diào)度,怎樣調(diào)度等。進(jìn)程的通訊情況。因?yàn)橐迦脒M(jìn)程樹,必須有聯(lián)系父子兄弟的指針,當(dāng)然是task_struct類型。時(shí)間信息,比如計(jì)算好執(zhí)行時(shí)間,以便于CPU分配。標(biāo)號,決定計(jì)進(jìn)程歸屬??梢宰x寫打開的一些文件信息。進(jìn)程上下文和內(nèi)核上下文。處理上下文。內(nèi)存信息。等等 因?yàn)槊總€(gè)PCB都是這樣的,只有這些結(jié)構(gòu)才能滿足另一個(gè)進(jìn)程的所有要求。 task_struct:

struct task_struct

{

//標(biāo)識符:描述本進(jìn)程的唯一標(biāo)識符,用來區(qū)分其他進(jìn)程

//狀態(tài):任務(wù)狀態(tài),退出代碼,退出信號

//優(yōu)先級:相對于其他進(jìn)程的優(yōu)先級

//程序計(jì)數(shù)器:程序中即將被執(zhí)行的下一條指令的地址。

//內(nèi)存指針:包括程序代碼的進(jìn)程相關(guān)數(shù)據(jù)的指針,還有其他進(jìn)程共享的內(nèi)存塊的指針。

//上下文數(shù)據(jù):進(jìn)程執(zhí)行時(shí)處理的寄存器中的數(shù)據(jù)。

//I/O狀態(tài)信息:包括顯示的I/O請求,分配給進(jìn)程的I/O設(shè)備和被進(jìn)程使用的文件列表。

//記賬信息:可能包括處理器時(shí)間總和,使用的時(shí)鐘數(shù)總和,時(shí)間限制,計(jì)賬號等。

//...

};

具體結(jié)構(gòu)看:task_struct結(jié)構(gòu)體結(jié)構(gòu) 提問:為什么程序加載到內(nèi)存中,變成進(jìn)程之后,我們要給進(jìn)程形成一個(gè)PCB對象呢? 回答:因?yàn)椴僮飨到y(tǒng)需要進(jìn)行管理,操作系統(tǒng)是無法直接對正在運(yùn)行的程序做管理的,需要通過一個(gè)PCB來間接管理,PCB上有進(jìn)程的信息,對PCB對象的管理其實(shí)就是對進(jìn)程的管理。 所以:進(jìn)程 = 內(nèi)核PCB對象 + 正在運(yùn)行的程序 這就是說,所有對進(jìn)程的控制和操作,都只和進(jìn)程PCB有關(guān),和進(jìn)程的可執(zhí)行程序無關(guān)!如果你想,你可以把PCB放到任何數(shù)據(jù)結(jié)構(gòu)當(dāng)中。

1.3 查看進(jìn)程

進(jìn)程信息可以通過/proc系統(tǒng)文件中查看。

當(dāng)你需要獲取PID為1的進(jìn)程信息,你需要查看/proc/1這個(gè)文件夾。 大多數(shù)進(jìn)程信息同樣可以使用top和ps這些用戶級工具來獲取。

ps aux | grep test | grep -v grep

過濾出于test有關(guān)的進(jìn)程

1.4 通過系統(tǒng)調(diào)用獲取進(jìn)程標(biāo)識符

進(jìn)程id(PID)父進(jìn)程id(PPID)

#include

#include

#include

int main()

{

pid_t id = getpid();//獲取該程序進(jìn)程標(biāo)識符id

pid_t fid = getppid();//獲取該程序進(jìn)程父進(jìn)程的標(biāo)識符id

while(1)

{

printf("i am process! pid = %d,ppid = %d\n",id,fid);

sleep(1);

}

return 0;

}

pid_t也是一個(gè)類型,就像int一樣,int用來標(biāo)識整型,pid_t就用來標(biāo)識進(jìn)程號類型。

如何判斷確實(shí)是這樣呢?

while :;do ps ajx|head -1 && ps ajx|grep mybin|grep -v grep;sleep 1; done

使用該條語句可以在屏幕中循環(huán)打印mybin的進(jìn)程是否存在。

1.5 通過系統(tǒng)調(diào)用創(chuàng)建進(jìn)程 -fork

運(yùn)行man fork認(rèn)識forkfork有兩個(gè)放回值。父子進(jìn)程代碼共享,數(shù)據(jù)各開辟空間,私有一份(采用寫時(shí)拷貝) 功能 fork是復(fù)制進(jìn)程的函數(shù),程序一開始就會產(chǎn)生一個(gè)進(jìn)程,當(dāng)這個(gè)進(jìn)程(代碼)執(zhí)行到fork()時(shí),fork就會復(fù)制一份原來的進(jìn)程來產(chǎn)生一個(gè)新的進(jìn)程,新產(chǎn)生的進(jìn)程為子進(jìn)程,而原來的進(jìn)程為父進(jìn)程,此時(shí)父子進(jìn)程是共存的,他們會同時(shí)向下執(zhí)行代碼。 關(guān)于放回值 在父進(jìn)程中,fork會返回新創(chuàng)建子進(jìn)程的進(jìn)程ID,在子進(jìn)程中,fork返回0。如果出現(xiàn)錯(cuò)誤,fork會返回一個(gè)負(fù)值。

也就是說,在fork函數(shù)執(zhí)行完畢后,如果創(chuàng)建進(jìn)程成功,則出現(xiàn)兩個(gè)進(jìn)程,一個(gè)子進(jìn)程,一個(gè)父進(jìn)程。在子進(jìn)程中,fork函數(shù)返回0,在父進(jìn)程中,fork返回新創(chuàng)建的子進(jìn)程的進(jìn)程ID。我們可以通過dork返回的值來判斷當(dāng)前進(jìn)程是子進(jìn)程還是父進(jìn)程。

下面寫一段代碼,執(zhí)行邏輯將會和過去不同。

#include

#include

#include

int main()

{

pid_t id = fork();

if(id<0)

{

printf("出錯(cuò)?。?!\n");

return 0;

}

if(id == 0)//子進(jìn)程

{

printf("i am a precoss PID:%d PPID:%d\n",getpid(),getppid());

}

else

{

printf("i am a precoss PID:%d PPID:%d\n",getpid(),getppid());

}

}

return 0;

}

//打印結(jié)果

/*

i am a precoss PID:29088 PPID:19144

i am a precoss PID:29089 PPID:29088

*/

運(yùn)行結(jié)果:

簡直匪夷所思!if里的內(nèi)容和else里面的內(nèi)容居然同時(shí)執(zhí)行了。這是怎么回事呢? 就像前面所說,在fork函數(shù)執(zhí)行完畢后,如果創(chuàng)建進(jìn)程成功,則出現(xiàn)兩個(gè)進(jìn)程,一個(gè)子進(jìn)程,一個(gè)父進(jìn)程。子進(jìn)程和父進(jìn)程是同時(shí)運(yùn)行的,可以看出兩個(gè)程序,不過他們的代碼數(shù)據(jù)是相同的。由由于fork在父子進(jìn)程中的返回值不同,也就造成了這種看上去if和else同時(shí)執(zhí)行的情況。

2. 進(jìn)程狀態(tài)

為了弄明白正在運(yùn)行的進(jìn)程是什么意思,我們需要知道進(jìn)程的不同狀態(tài)。一個(gè)進(jìn)程可以有多個(gè)狀態(tài),在Linux內(nèi)核中,進(jìn)程也可以叫做任務(wù)。 …

柚子快報(bào)激活碼778899分享:運(yùn)維 Linux——進(jìn)程

http://yzkb.51969.com/

文章來源

評論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。

轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19560766.html

發(fā)布評論

您暫未設(shè)置收款碼

請?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄