Linux操作系統(tǒng)的進(jìn)程的詳細(xì)介紹
Linux操作系統(tǒng)難免會(huì)碰到進(jìn)程的相關(guān)問題,下面由學(xué)習(xí)啦小編為大家整理了Linux操作系統(tǒng)的進(jìn)程的詳細(xì)介紹的相關(guān)知識(shí),希望對(duì)大家有幫助!
Linux操作系統(tǒng)的進(jìn)程的詳細(xì)介紹:一、進(jìn)程概述
我們平時(shí)寫的 C 語言代碼,通過編譯器編譯,最終它會(huì)成為一個(gè)可執(zhí)行程序,當(dāng)這個(gè)可執(zhí)行程序運(yùn)行起來后(沒有結(jié)束之前),它就成為了一個(gè)進(jìn)程。
程序是存放在存儲(chǔ)介質(zhì)上的一個(gè)可執(zhí)行文件,而進(jìn)程是程序執(zhí)行的過程。進(jìn)程的狀態(tài)是變化的,其包括進(jìn)程的創(chuàng)建、調(diào)度和消亡。程序是靜態(tài)的,進(jìn)程是動(dòng)態(tài)的。
在 Linux 系統(tǒng)中,操作系統(tǒng)是通過進(jìn)程去完成一個(gè)一個(gè)的任務(wù),進(jìn)程是管理事務(wù)的基本單元。進(jìn)程擁有自己獨(dú)立的處理環(huán)境(如:當(dāng)前需要用到哪些環(huán)境變量,程序運(yùn)行的目錄在哪,當(dāng)前是哪個(gè)用戶在運(yùn)行此程序等)和系統(tǒng)資源(如:處理器 CPU 占用率、存儲(chǔ)器、I/O設(shè)備、數(shù)據(jù)、程序)。我們可以這么理解,公司相當(dāng)于操作系統(tǒng),部門相當(dāng)于進(jìn)程,公司通過部門來管理(系統(tǒng)通過進(jìn)程管理),對(duì)于各個(gè)部門,每個(gè)部門有各自的資源,如人員、電腦設(shè)備、打印機(jī)等。
Linux操作系統(tǒng)的進(jìn)程的詳細(xì)介紹:二、進(jìn)程狀態(tài)
我們現(xiàn)在的電腦基本上都是多任務(wù),我們聊著 QQ 的時(shí)候,同時(shí)可以看著視頻,這里相當(dāng)于 QQ 和視頻兩個(gè)程序同時(shí)運(yùn)行著(兩個(gè)進(jìn)程)。早期的時(shí)候,電腦的 CPU 是單核的(單核理論上只運(yùn)行操作一個(gè)任務(wù)),那它是如何做到多任務(wù)的呢?這就涉及到進(jìn)程的調(diào)度策略?,F(xiàn)在給大家舉這么一個(gè)例子,有 A,B,C 三個(gè)進(jìn)程,在我們單 CPU 的情況下,每一個(gè)時(shí)刻只有一個(gè)進(jìn)程在運(yùn)行,如果 A 運(yùn)行完,B 運(yùn)行,B 運(yùn)行完,C 運(yùn)行,C 運(yùn)行完,A 運(yùn)行,而 CPU 的運(yùn)算速度足夠快,A 兩次運(yùn)行時(shí)間間隔足夠短,從宏觀上就我們就看到 A,B,C 好像同時(shí)運(yùn)行,這就是實(shí)現(xiàn)單 CPU 運(yùn)行多個(gè)任務(wù)的核心原理,通過時(shí)間片輪詢調(diào)度策略實(shí)現(xiàn)多任務(wù)(更多詳情,請(qǐng)看《Linux 進(jìn)程調(diào)度淺析》)。
從上面的例子,我們可以得知,對(duì)于 A 進(jìn)程而言,有時(shí)候在運(yùn)行,有時(shí)候沒有運(yùn)行,兩個(gè)狀態(tài)不一樣,所以,進(jìn)程是有狀態(tài)的,同時(shí),狀態(tài)是可以相互進(jìn)行轉(zhuǎn)換的,從執(zhí)行的狀態(tài)轉(zhuǎn)換為不執(zhí)行的狀態(tài),這里,我們可以把進(jìn)程運(yùn)行的整個(gè)生命周期簡(jiǎn)單劃分為三種狀態(tài)(實(shí)際上不指這三種狀態(tài)):就緒態(tài)、執(zhí)行態(tài)、等待態(tài)。
就緒態(tài):
進(jìn)程已經(jīng)具備執(zhí)行的一切條件,正在等待分配 CPU 的處理時(shí)間。
執(zhí)行態(tài):
該進(jìn)程正在占用 CPU 運(yùn)行。
等待態(tài):
進(jìn)程因不具備某些執(zhí)行條件而暫時(shí)無法繼續(xù)執(zhí)行的狀態(tài)。
這里需要注意,就緒態(tài)和等待態(tài)都是不執(zhí)行,但它們是有區(qū)別的,就緒態(tài)是指滿足條件,時(shí)間沒到,等待態(tài)是不滿足條件。
同樣的,進(jìn)程的這三種狀態(tài)可以相互轉(zhuǎn)換:
執(zhí)行態(tài)-->等待態(tài):
正在執(zhí)行的進(jìn)程因等待某種事件發(fā)生而無法繼續(xù)執(zhí)行時(shí),便從執(zhí)行狀態(tài)變成等待狀態(tài)
等待態(tài)-->就緒態(tài):
處于等待態(tài)的進(jìn)程,若其等待的事件發(fā)生,于是進(jìn)程由等待狀態(tài)變成就緒態(tài)
就緒態(tài)-->執(zhí)行態(tài):
當(dāng)就緒態(tài)的進(jìn)程所等待的cpu時(shí)間片一到來,進(jìn)程就會(huì)從就緒態(tài)變成執(zhí)行態(tài)
執(zhí)行態(tài)-->就緒態(tài):
處于執(zhí)行狀態(tài)的進(jìn)程在其執(zhí)行過程中,因分配給它的一個(gè)時(shí)間片已用完而不得不讓出cpu,于是進(jìn)程從執(zhí)行狀態(tài)轉(zhuǎn)變成就緒狀態(tài)
為了讓大家更加清晰地了解三種狀態(tài)的轉(zhuǎn)換,給大家舉一個(gè)lh買火車票的例子。
lh匆忙地趕去火車站買火車票,太著急了,到了售票廳才發(fā)現(xiàn)忘記帶身份證,這時(shí)候,就算 lh排隊(duì)也沒用,因?yàn)?lh不具備買票的條件(沒帶身份證),這時(shí)候的 lh屬于等待態(tài)。
lh給它對(duì)象打電話,讓她把身份證帶過來,等會(huì),身份證送到了,這時(shí)候,lh可以去排隊(duì)買票了,只是時(shí)間到,lh就可以買票了,這時(shí),lh屬于就緒態(tài)。而這過程是由等待態(tài)轉(zhuǎn)換到就緒態(tài)。
等了 10 分鐘,終于到 lh了,lh開始買票,這時(shí)候, lh屬于執(zhí)行態(tài)。而這過程是由就緒態(tài)轉(zhuǎn)換為執(zhí)行態(tài)。
而在買票的過程中,lh的對(duì)象打電話給他,讓 lh也幫她買一張火車票,但是, lh沒有她對(duì)象的身份證,接著,lh繼續(xù)等他對(duì)象送身份證,這時(shí)候,lh由執(zhí)行態(tài)轉(zhuǎn)換為等待態(tài)。
假如是這么一種情況,lh買火車票是給公司的同事買的(需要買 100 多張票),在買著票的過程中(執(zhí)行態(tài)),后面還有很多人在排隊(duì),后面排隊(duì)的人肯定不爽,這時(shí)售票員就說,20分鐘后,如果你還沒處理完,請(qǐng)你到后面排隊(duì)。結(jié)果,lh花了 20 分鐘還是沒有處理完,于是,乖乖地到后面重新排隊(duì),這時(shí)候,lh由執(zhí)行態(tài)轉(zhuǎn)換為就緒態(tài)。
Linux操作系統(tǒng)的進(jìn)程的詳細(xì)介紹:三、進(jìn)程控制塊
對(duì)于操作系統(tǒng)而言,它需要控制很多進(jìn)程,同時(shí),每個(gè)進(jìn)程都有不同的狀態(tài),系統(tǒng)如何知道 A 執(zhí)行完到 B 執(zhí)行而不是 C?系統(tǒng)如何協(xié)調(diào)控制進(jìn)程呢?
當(dāng)我們運(yùn)行一個(gè)程序使它成為一個(gè)進(jìn)程時(shí),系統(tǒng)會(huì)開辟一段內(nèi)存空間存放與此進(jìn)程相關(guān)的數(shù)據(jù)信息,而這個(gè)數(shù)據(jù)信息是通過結(jié)構(gòu)體( task_struct,ubuntu12.04中打開 /usr/src/linux-headers-3.2.0-23/include/linux/sched.h 可以找到 task_struct 的定義 )來存放,我們把這個(gè)存放進(jìn)程相關(guān)數(shù)據(jù)信息的結(jié)構(gòu)體稱為進(jìn)程控制塊。
操作系統(tǒng)就是通過這個(gè)進(jìn)程控制塊來操作控制進(jìn)程。更多詳情,請(qǐng)看《 Linux 進(jìn)程管理》。
進(jìn)程控制塊是操作系統(tǒng)中最重要的記錄型數(shù)據(jù)結(jié)構(gòu)。進(jìn)程控制塊記錄了用于描述進(jìn)程進(jìn)展情況及控制進(jìn)程運(yùn)行所需的全部信息,它是進(jìn)程存在的唯一標(biāo)志。進(jìn)程控制塊里有很多信息,其中比較重要的是進(jìn)程號(hào),至于其他的一些信息我們不在這詳細(xì)討論。
Linux操作系統(tǒng)的進(jìn)程的詳細(xì)介紹:四、進(jìn)程號(hào)
每個(gè)進(jìn)程都由一個(gè)進(jìn)程號(hào)來標(biāo)識(shí),其類型為 pid_t(無符號(hào)整型),進(jìn)程號(hào)的范圍:0~32767。進(jìn)程號(hào)總是唯一的,但進(jìn)程號(hào)可以重用。當(dāng)一個(gè)進(jìn)程終止后,其進(jìn)程號(hào)就可以再次使用。
系統(tǒng)允許一個(gè)進(jìn)程創(chuàng)建新進(jìn)程,新進(jìn)程即為子進(jìn)程,子進(jìn)程還可以創(chuàng)建新的子進(jìn)程,形成進(jìn)程樹結(jié)構(gòu)模型。整個(gè) Linux 系統(tǒng)的所有進(jìn)程也是一個(gè)樹形結(jié)構(gòu)。樹根是系統(tǒng)自動(dòng)構(gòu)造的,即在內(nèi)核態(tài)下執(zhí)行的 0 號(hào)進(jìn)程,它是所有進(jìn)程的祖先。進(jìn)程號(hào)為 0 的進(jìn)程通常是調(diào)度進(jìn)程,常被稱為交換進(jìn)程( swapper )。由 0 號(hào)進(jìn)程創(chuàng)建 1 號(hào)進(jìn)程(內(nèi)核態(tài)),1 號(hào)負(fù)責(zé)執(zhí)行內(nèi)核的部分初始化工作及進(jìn)行系統(tǒng)配置,并創(chuàng)建若干個(gè)用于高速緩存和虛擬主存管理的內(nèi)核線程。隨后,1 號(hào)進(jìn)程調(diào)用 execve() 運(yùn)行可執(zhí)行程序 init,并演變成用戶態(tài) 1 號(hào)進(jìn)程,即 init 進(jìn)程。
所以,在 Linux 下面所有的進(jìn)程都由 init 進(jìn)程直接或者間接創(chuàng)建。
接下來,再給大家介紹三個(gè)不同的進(jìn)程號(hào)。
進(jìn)程號(hào)(PID):
標(biāo)識(shí)進(jìn)程的一個(gè)非負(fù)整型數(shù)。
父進(jìn)程號(hào)(PPID):
任何進(jìn)程( 除 init 進(jìn)程)都是由另一個(gè)進(jìn)程創(chuàng)建,該進(jìn)程稱為被創(chuàng)建進(jìn)程的父進(jìn)程,對(duì)應(yīng)的進(jìn)程號(hào)稱為父進(jìn)程號(hào)(PPID)。如,A 進(jìn)程創(chuàng)建了 B 進(jìn)程,A 的進(jìn)程號(hào)就是 B 進(jìn)程的父進(jìn)程號(hào)。
進(jìn)程組號(hào)(PGID):
進(jìn)程組是一個(gè)或多個(gè)進(jìn)程的集合。他們之間相互關(guān)聯(lián),進(jìn)程組可以接收同一終端的各種信號(hào),關(guān)聯(lián)的進(jìn)程有一個(gè)進(jìn)程組號(hào)(PGID) 。這個(gè)過程有點(diǎn)類似于 QQ 群,組相當(dāng)于 QQ 群,各個(gè)進(jìn)程相當(dāng)于各個(gè)好友,把各個(gè)好友都拉入這個(gè) QQ 群里,主要是方便管理,特別是通知某些事時(shí),只要在群里吼一聲,所有人都收到,簡(jiǎn)單粗暴。但是,這個(gè)進(jìn)程組號(hào)和 QQ 群號(hào)是有點(diǎn)區(qū)別的,默認(rèn)的情況下,當(dāng)前的進(jìn)程號(hào)會(huì)當(dāng)做當(dāng)前的進(jìn)程組號(hào)。