新聞中心
執(zhí)行中的程序稱作進程。當(dāng)程序可以執(zhí)行文件存放在存儲中,并且運行的時候,每個進程會被動態(tài)得分配系統(tǒng)資源、內(nèi)存、安全屬性和與之相關(guān)的狀態(tài)??梢杂卸鄠€進程關(guān)聯(lián)到同一個程序,并同時執(zhí)行不會互相干擾。操作系統(tǒng)會有效地管理和追蹤所有運行著的進程,下面為大家詳細(xì)講解一下Linux進程。

創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計與策劃設(shè)計,晉寧網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:晉寧等地區(qū)。晉寧做網(wǎng)站價格咨詢:18982081108
u=800205596,459974077&fm=26&gp=0
一、進程概述
我們平時寫的 C 語言代碼,通過編譯器編譯,最終它會成為一個可執(zhí)行程序,當(dāng)這個可執(zhí)行程序運行起來后(沒有結(jié)束之前),它就成為了一個進程。 程序是存放在存儲介質(zhì)上的一個可執(zhí)行文件,而進程是程序執(zhí)行的過程。進程的狀態(tài)是變化的,其包括進程的創(chuàng)建、調(diào)度和消亡。程序是靜態(tài)的,進程是動態(tài)的。 在 Linux 系統(tǒng)中,操作系統(tǒng)是通過進程去完成一個一個的任務(wù),進程是管理事務(wù)的基本單元。進程擁有自己獨立的處理環(huán)境(如:當(dāng)前需要用到哪些環(huán)境變量,程序運行的目錄在哪,當(dāng)前是哪個用戶在運行此程序等)和系統(tǒng)資源(如:處理器 CPU 占用率、存儲器、I/O設(shè)備、數(shù)據(jù)、程序)。我們可以這么理解,公司相當(dāng)于操作系統(tǒng),部門相當(dāng)于進程,公司通過部門來管理(系統(tǒng)通過進程管理),對于各個部門,每個部門有各自的資源,如人員、電腦設(shè)備、打印機等。
二、進程狀態(tài)
我們現(xiàn)在的電腦基本上都是多任務(wù),我們聊著 QQ 的時候,同時可以看著視頻,這里相當(dāng)于 QQ 和視頻兩個程序同時運行著(兩個進程)。早期的時候,電腦的 CPU 是單核的(單核理論上只運行操作一個任務(wù)),那它是如何做到多任務(wù)的呢?這就涉及到進程的調(diào)度策略?,F(xiàn)在給大家舉這么一個例子,有 A,B,C 三個進程,在我們單 CPU 的情況下,每一個時刻只有一個進程在運行,如果 A 運行完,B 運行,B 運行完,C 運行,C 運行完,A 運行,而 CPU 的運算速度足夠快,A 兩次運行時間間隔足夠短,從宏觀上就我們就看到 A,B,C 好像同時運行,這就是實現(xiàn)單 CPU 運行多個任務(wù)的核心原理,通過時間片輪詢調(diào)度策略實現(xiàn)多任務(wù)(更多詳情,請看《Linux 進程調(diào)度淺析》)。 從上面的例子,我們可以得知,對于 A 進程而言,有時候在運行,有時候沒有運行,兩個狀態(tài)不一樣,所以,進程是有狀態(tài)的,同時,狀態(tài)是可以相互進行轉(zhuǎn)換的,從執(zhí)行的狀態(tài)轉(zhuǎn)換為不執(zhí)行的狀態(tài),這里,我們可以把進程運行的整個生命周期簡單劃分為三種狀態(tài)(實際上不指這三種狀態(tài)):就緒態(tài)、執(zhí)行態(tài)、等待態(tài)。
就緒態(tài):
進程已經(jīng)具備執(zhí)行的一切條件,正在等待分配 CPU 的處理時間。
執(zhí)行態(tài):
該進程正在占用 CPU 運行。
等待態(tài):
進程因不具備某些執(zhí)行條件而暫時無法繼續(xù)執(zhí)行的狀態(tài)。 這里需要注意,就緒態(tài)和等待態(tài)都是不執(zhí)行,但它們是有區(qū)別的,就緒態(tài)是指滿足條件,時間沒到,等待態(tài)是不滿足條件。 同樣的,進程的這三種狀態(tài)可以相互轉(zhuǎn)換:
執(zhí)行態(tài)–>等待態(tài):
正在執(zhí)行的進程因等待某種事件發(fā)生而無法繼續(xù)執(zhí)行時,便從執(zhí)行狀態(tài)變成等待狀態(tài)
等待態(tài)–>就緒態(tài):
處于等待態(tài)的進程,若其等待的事件發(fā)生,于是進程由等待狀態(tài)變成就緒態(tài)
就緒態(tài)–>執(zhí)行態(tài):
當(dāng)就緒態(tài)的進程所等待的cpu時間片一到來,進程就會從就緒態(tài)變成執(zhí)行態(tài)
執(zhí)行態(tài)–>就緒態(tài):
處于執(zhí)行狀態(tài)的進程在其執(zhí)行過程中,因分配給它的一個時間片已用完而不得不讓出cpu,于是進程從執(zhí)行狀態(tài)轉(zhuǎn)變成就緒狀態(tài) 為了讓大家更加清晰地了解三種狀態(tài)的轉(zhuǎn)換,給大家舉一個lh買火車票的例子。 lh匆忙地趕去火車站買火車票,太著急了,到了售票廳才發(fā)現(xiàn)忘記帶身份證,這時候,就算 lh排隊也沒用,因為 lh不具備買票的條件(沒帶身份證),這時候的 lh屬于等待態(tài)。 lh給它對象打電話,讓她把身份證帶過來,等會,身份證送到了,這時候,lh可以去排隊買票了,只是時間到,lh就可以買票了,這時,lh屬于就緒態(tài)。而這過程是由等待態(tài)轉(zhuǎn)換到就緒態(tài)。 等了 10 分鐘,終于到 lh了,lh開始買票,這時候, lh屬于執(zhí)行態(tài)。而這過程是由就緒態(tài)轉(zhuǎn)換為執(zhí)行態(tài)。 而在買票的過程中,lh的對象打電話給他,讓 lh也幫她買一張火車票,但是, lh沒有她對象的身份證,接著,lh繼續(xù)等他對象送身份證,這時候,lh由執(zhí)行態(tài)轉(zhuǎn)換為等待態(tài)。 假如是這么一種情況,lh買火車票是給公司的同事買的(需要買 100 多張票),在買著票的過程中(執(zhí)行態(tài)),后面還有很多人在排隊,后面排隊的人肯定不爽,這時售票員就說,20分鐘后,如果你還沒處理完,請你到后面排隊。結(jié)果,lh花了 20 分鐘還是沒有處理完,于是,乖乖地到后面重新排隊,這時候,lh由執(zhí)行態(tài)轉(zhuǎn)換為就緒態(tài)。
三、進程控制塊
對于操作系統(tǒng)而言,它需要控制很多進程,同時,每個進程都有不同的狀態(tài),系統(tǒng)如何知道 A 執(zhí)行完到 B 執(zhí)行而不是 C?系統(tǒng)如何協(xié)調(diào)控制進程呢? 當(dāng)我們運行一個程序使它成為一個進程時,系統(tǒng)會開辟一段內(nèi)存空間存放與此進程相關(guān)的數(shù)據(jù)信息,而這個數(shù)據(jù)信息是通過結(jié)構(gòu)體( task_struct,ubuntu12.04中打開 /usr/src/linux-headers-3.2.0-23/include/linux/sched.h 可以找到 task_struct 的定義 )來存放,我們把這個存放進程相關(guān)數(shù)據(jù)信息的結(jié)構(gòu)體稱為進程控制塊。 操作系統(tǒng)就是通過這個進程控制塊來操作控制進程。更多詳情,請看《 Linux 進程管理》。 進程控制塊是操作系統(tǒng)中最重要的記錄型數(shù)據(jù)結(jié)構(gòu)。進程控制塊記錄了用于描述進程進展情況及控制進程運行所需的全部信息,它是進程存在的唯一標(biāo)志。進程控制塊里有很多信息,其中比較重要的是進程號,至于其他的一些信息我們不在這詳細(xì)討論。
四、進程號
每個進程都由一個進程號來標(biāo)識,其類型為 pid_t(無符號整型),進程號的范圍:0~32767。進程號總是唯一的,但進程號可以重用。當(dāng)一個進程終止后,其進程號就可以再次使用。 所以,在 Linux 下面所有的進程都由 init 進程直接或者間接創(chuàng)建。 接下來,再給大家介紹三個不同的進程號。 進程號(PID): 標(biāo)識進程的一個非負(fù)整型數(shù)。 父進程號(PPID): 任何進程( 除 init 進程)都是由另一個進程創(chuàng)建,該進程稱為被創(chuàng)建進程的父進程,對應(yīng)的進程號稱為父進程號(PPID)。如,A 進程創(chuàng)建了 B 進程,A 的進程號就是 B 進程的父進程號。 進程組號(PGID): 進程組是一個或多個進程的集合。他們之間相互關(guān)聯(lián),進程組可以接收同一終端的各種信號,關(guān)聯(lián)的進程有一個進程組號(PGID) 。這個過程有點類似于 QQ 群,組相當(dāng)于 QQ 群,各個進程相當(dāng)于各個好友,把各個好友都拉入這個 QQ 群里,主要是方便管理,特別是通知某些事時,只要在群里吼一聲,所有人都收到,簡單粗暴。但是,這個進程組號和 QQ 群號是有點區(qū)別的,默認(rèn)的情況下,當(dāng)前的進程號會當(dāng)做當(dāng)前的進程組號。
五、進程號操作函數(shù)
Linux 操作系統(tǒng)提供了三個獲得進程號的函數(shù)getpid()、getppid()、getpgid()。 所需頭文件:
include
include
pid_t getpid(void);
功能: 獲取本進程號(PID) 參數(shù):無 返回值:本進程號
pid_t getppid(void);
功能:獲取調(diào)用此函數(shù)的進程的父進程號(PPID) 參數(shù):無 返回值:
pid_t getpgid(pid_tpid);
功能:獲取進程組號(PGID) 參數(shù):pid:進程號 返回值:參數(shù)為 0 時返回當(dāng)前進程組號,否則返回參數(shù)指定的進程的進程組號 示例代碼如下:
include
include
include
int main(int argc, char *argv[])
{
pid_t pid, ppid, pgid;
pid = getpid();
printf("pid = %d ", pid);
ppid = getppid();
printf("ppid = %d ", ppid);
pgid = getpgid(pid);
printf("pgid = %d ", pgid);
return 0;
}
運行結(jié)果:
分享文章:詳解Linux進程
分享地址:http://www.5511xx.com/article/ccodpos.html


咨詢
建站咨詢
