溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

LINUX系統(tǒng)編程之進(jìn)程

發(fā)布時(shí)間:2020-07-09 20:01:13 來(lái)源:網(wǎng)絡(luò) 閱讀:424 作者:Czyy1 欄目:系統(tǒng)運(yùn)維

LINUX系統(tǒng)編程之進(jìn)程

一、操作系統(tǒng)職責(zé):管理所有的資源,將不同的設(shè)備和不同的程序關(guān)聯(lián)起來(lái)。


二、系統(tǒng)調(diào)用是操作系統(tǒng)提供給用戶(hù)程序的一組特殊函數(shù)接口,用戶(hù)程序可以通過(guò)這組接口獲得系統(tǒng)內(nèi)核提供的服務(wù),例如:打開(kāi)文件,關(guān)閉文件,讀寫(xiě)文件。


三、POSIX(Portable Operation System interface)

Linux中,應(yīng)用程序編程接口(API)遵循POSIX標(biāo)準(zhǔn),用于保證應(yīng)用程序可以在源代碼一級(jí)上在多種操作系統(tǒng)上移植運(yùn)行。


四、系統(tǒng)調(diào)用按功能邏輯可分為:進(jìn)程控制、進(jìn)程間通信、文件系統(tǒng)控制、系統(tǒng)控制、內(nèi)存管理、網(wǎng)絡(luò)管理、socket控制、用戶(hù)管理。

通常用一個(gè)負(fù)的返回值表明錯(cuò)誤,0值表明成功可用perror打印出錯(cuò)信息


五、進(jìn)程

程序:可執(zhí)行文件(靜態(tài)),進(jìn)程:程序的執(zhí)行實(shí)例(動(dòng)態(tài))

進(jìn)程的狀態(tài):創(chuàng)建,調(diào)度,消亡

進(jìn)程擁有自己的環(huán)境和資源

用exec函數(shù)將程序由內(nèi)核讀入內(nèi)存使其執(zhí)行起來(lái)成為一個(gè)進(jìn)程


六、進(jìn)程的生命周期

創(chuàng)建

調(diào)度

就緒態(tài):已具備執(zhí)行條件,等待分配CPU時(shí)間

執(zhí)行態(tài):正在占用CPU

等待態(tài):不具備某些執(zhí)行條件,無(wú)法繼續(xù)執(zhí)行

消亡


七、PCB(進(jìn)程控制塊)

OS根據(jù)PCB對(duì)并發(fā)執(zhí)行的進(jìn)程進(jìn)行控制和管理,系統(tǒng)在創(chuàng)建一個(gè)進(jìn)程時(shí)會(huì)開(kāi)辟一段內(nèi)存空間存放與此進(jìn)程相關(guān)的PCB數(shù)據(jù)結(jié)構(gòu)

PCB中記錄了用于描述進(jìn)程進(jìn)展情況及控制進(jìn)程運(yùn)行所需的全部信息。

PCB是進(jìn)程存在的唯一標(biāo)志,linux中PCB存放在task_struct結(jié)構(gòu)體中,打開(kāi)/include/linux/sched.h可以找到task_struct 的定義


八、進(jìn)程控制

進(jìn)程號(hào)0~32767   0號(hào)調(diào)度進(jìn)程   1號(hào)init進(jìn)程

除調(diào)度進(jìn)程外,所有進(jìn)程都是由init進(jìn)程直接或間接創(chuàng)建的

PID進(jìn)程號(hào)getpid()   PPID父進(jìn)程號(hào)getppid()  PGID進(jìn)程組號(hào)getpgid()


九、文件描述符:以進(jìn)程為單位分配0-1023最小可用的描述符


十、進(jìn)程狀態(tài)轉(zhuǎn)換

CPU調(diào)度算法:優(yōu)先級(jí),先來(lái)先調(diào)度,短時(shí)間優(yōu)先,時(shí)間片輪轉(zhuǎn)

umask掩碼,屏蔽文件權(quán)限

ps命令查看當(dāng)前進(jìn)程


十一、創(chuàng)建進(jìn)程 fork()  vfork()

1.fork()在子進(jìn)程中返回0,在父進(jìn)程中返回值大于0,調(diào)用fork()以后,源程序被復(fù)制了一份,兩份程序中只有fork()返回值不一樣,兩份程序同時(shí)執(zhí)行,順序不定,父子進(jìn)程物理地址不同,虛擬地址相同。

問(wèn):如果一個(gè)程序同時(shí)執(zhí)行了三個(gè)fork(),它創(chuàng)建了幾個(gè)進(jìn)程

fork();1(0)

fork();2(0) 3(1)

fork();4(0) 5(1) 6(2) 7(3)

第一次調(diào)用,0號(hào)進(jìn)程創(chuàng)建了1號(hào)進(jìn)程

第二次調(diào)用,0號(hào)進(jìn)程創(chuàng)建了2號(hào)進(jìn)程,1號(hào)進(jìn)程創(chuàng)建了3號(hào)進(jìn)程

第三次調(diào)用,0號(hào)進(jìn)程創(chuàng)建了4號(hào)進(jìn)程,1號(hào)進(jìn)程創(chuàng)建了5號(hào)進(jìn)程,2號(hào)進(jìn)程創(chuàng)建了6號(hào)進(jìn)程,3號(hào)進(jìn)程創(chuàng)建了7號(hào)進(jìn)程

一共創(chuàng)建了2的n次方減一個(gè)進(jìn)程


2.vfork()一般配合exec使用,子進(jìn)程共用父進(jìn)程地址空間,保證子進(jìn)程先運(yùn)行,調(diào)用exec或exit后父進(jìn)程再運(yùn)行

exec函數(shù)族是進(jìn)程替換函數(shù),將新的地址空間賦給原來(lái)的進(jìn)程,進(jìn)程號(hào)不變,新程序從main開(kāi)始運(yùn)行

exec只有失敗才返回,exec后面的代碼不執(zhí)行

但注意exec是一個(gè)函數(shù)族,有execlp,execvp,execle,execve等

只能用exit()結(jié)束子進(jìn)程,而return是返回到函數(shù)執(zhí)行的首地址

atexit(void (*function)(void))注冊(cè)退出處理函數(shù)



十二、輸入輸出緩沖區(qū)

系統(tǒng)調(diào)用無(wú)緩沖

標(biāo)準(zhǔn)IO庫(kù)函數(shù)輸入輸出為行緩沖

標(biāo)準(zhǔn)IO庫(kù)操作文件為全緩沖


十三、

僵尸進(jìn)程:子進(jìn)程結(jié)束而父進(jìn)程未調(diào)用wait()或waitpid()回收其資源

孤兒進(jìn)程:父進(jìn)程結(jié)束而子進(jìn)程未結(jié)束

守護(hù)進(jìn)程:特殊的孤兒進(jìn)程,脫離終端運(yùn)行在后臺(tái)

wait()/waitpid():等待子進(jìn)程結(jié)束并回收其資源

用ps查看進(jìn)程,kill+pid或pkill+進(jìn)程名結(jié)束進(jìn)程


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI