全面了解Linux進(jìn)程技術(shù)
在啟用電腦時(shí),你會(huì)發(fā)現(xiàn)必不可少的就是操作系統(tǒng)。操作系統(tǒng)中微軟占很大部分,不過(guò)這幾年Linux也趕上了微軟。Linux是一個(gè)多用戶(hù)多任務(wù)的操作系統(tǒng)。這里介紹Linux的知識(shí),讓你學(xué)好應(yīng)用Linux系統(tǒng)。今天一講Linux進(jìn)程技術(shù),希望你記住Linux進(jìn)程技術(shù)。
一、 進(jìn)程的屬性
進(jìn)程的定義:一個(gè)進(jìn)程是一個(gè)程序的一次執(zhí)行的過(guò)程,程序是靜態(tài)的,它是一些保存在磁盤(pán)上的可執(zhí)行的代碼和數(shù)據(jù)集合,進(jìn)程是一個(gè)動(dòng)態(tài)的概念。它是Linux 系統(tǒng)的基本的調(diào)度單位,一個(gè)進(jìn)程由如下元素組成:
1、 程序的讀取上下文,它表示程序讀取執(zhí)行的狀態(tài)。
2、 程序當(dāng)前執(zhí)行目錄。
3、 程序服務(wù)的文件和目錄
4、 程序的訪問(wèn)權(quán)限。
5、 內(nèi)存和其他分配給進(jìn)程的系統(tǒng)資源。
Linux進(jìn)程中最知名的屬性就是它的進(jìn)程號(hào)(Process Idenity Number,PID)和它的父進(jìn)程號(hào)(parent process ID,PPID)。PID、PPID都是非零正整數(shù)。一個(gè)PID惟一地標(biāo)識(shí)一個(gè)進(jìn)程。一個(gè)進(jìn)程創(chuàng)建新進(jìn)程稱(chēng)為創(chuàng)建了子進(jìn)程(child process)。相反地,創(chuàng)建子進(jìn)程的進(jìn)程稱(chēng)為父進(jìn)程。所有進(jìn)程追溯其祖先最終都會(huì)落到進(jìn)程號(hào)為1的進(jìn)程身上,這個(gè)進(jìn)程叫做init進(jìn)程。是內(nèi)核自舉后***個(gè)啟動(dòng)的進(jìn)程。init進(jìn)程作用是扮演終結(jié)父進(jìn)程的角色。因?yàn)閕nit進(jìn)程永遠(yuǎn)不會(huì)被終止,所以系統(tǒng)總是可以確信它的存在,并在必要的時(shí)候以它為參照。如果某個(gè)進(jìn)程在它衍生出來(lái)的全部子進(jìn)程結(jié)束之前被終止,就會(huì)出現(xiàn)必須以init為參照的情況。此時(shí)那些失去了父進(jìn)程的子進(jìn)程就都會(huì)以init作為它們的父進(jìn)程。如果你執(zhí)行一下ps -af 命令,可以列出許多父進(jìn)程ID(Parent Process ID,PPID)為1的進(jìn)程來(lái)。Linux提供了一條pstree命令,允許用戶(hù)查看系統(tǒng)內(nèi)正在運(yùn)行的各個(gè)進(jìn)程之間的繼承關(guān)系。直接在命令行中輸入pstree即可,程序會(huì)以樹(shù)狀結(jié)構(gòu)方式列出系統(tǒng)中正在運(yùn)行的各進(jìn)程之間的繼承關(guān)系。
二、進(jìn)程在運(yùn)行中的三種狀態(tài):
執(zhí)行(Running)狀態(tài):CPU正在執(zhí)行,即進(jìn)程正在占用CPU。
就緒(Waiting)狀態(tài):進(jìn)程已經(jīng)具備的執(zhí)行的一切條件,正在等待分配CPU的處理時(shí)間片。
停止(Stoped)狀態(tài):進(jìn)程不能使用CPU。
內(nèi)核使用進(jìn)程來(lái)控制對(duì)CPU和其他系統(tǒng)資源的訪問(wèn),并且使用進(jìn)程來(lái)決定在CPU上運(yùn)行那個(gè)程序、運(yùn)行多久以及采用什么特性運(yùn)行它。內(nèi)核的調(diào)度器負(fù)責(zé)在所有的進(jìn)程間分配CPU執(zhí)行時(shí)間,稱(chēng)為時(shí)間片(time slice),它輪流在每個(gè)進(jìn)程分得的時(shí)間片用完后從進(jìn)程那里得到控制權(quán)。如果處理器比較快的話(huà),你會(huì)覺(jué)得時(shí)間片非常小,仿佛是幾個(gè)進(jìn)程在同時(shí)運(yùn)行。在Linix操作系統(tǒng)啟動(dòng)過(guò)程中,系統(tǒng)自動(dòng)創(chuàng)建init等系統(tǒng)進(jìn)程,用于管理內(nèi)存資源以及對(duì)用戶(hù)進(jìn)程進(jìn)行調(diào)度等。進(jìn)程是動(dòng)態(tài)的, 一個(gè)程序的可以有多個(gè)進(jìn)程同時(shí)或不同時(shí)執(zhí)行它。一次執(zhí)行多進(jìn)程的好處在于你可以一邊發(fā)郵件,一邊聽(tīng)音樂(lè)。
三、 理解Linux下進(jìn)程的結(jié)構(gòu)
Linux中一個(gè)進(jìn)程在內(nèi)存里有三部份的數(shù)據(jù),就是"數(shù)據(jù)段","堆棧段"和"代碼段",基于I386兼容的中央處理器,都有上述三種段寄存器,以方便操作系統(tǒng)的運(yùn)行。
代碼段,是存放了程序代碼的數(shù)據(jù),假如機(jī)器中有數(shù)個(gè)進(jìn)程運(yùn)行相同的一個(gè)程序,那么它們就可以使用同一個(gè)代碼段。而數(shù)據(jù)段則存放程序的全局變量,常數(shù)以及動(dòng)態(tài)數(shù)據(jù)分配的數(shù)據(jù)空間。堆棧段存放的就是子程序的返回地址、子程序的參數(shù)以及程序的局部變量。堆棧段包括進(jìn)程控制塊PCB(Process Control Block)中。PCB處于進(jìn)程核心堆棧的底部,不需要額外分配空間。
四、 Linux進(jìn)程的種類(lèi)
Linux操作系統(tǒng)包括三種不同類(lèi)型的進(jìn)程,每種進(jìn)程都有自己的特點(diǎn)和屬性?!?BR>a) 交互進(jìn)程--由一個(gè)shell啟動(dòng)的進(jìn)程。交互進(jìn)程既可以在前臺(tái)運(yùn)行,也可以在后臺(tái)運(yùn)行。
b) 批處理進(jìn)程--這種進(jìn)程和終端沒(méi)有聯(lián)系,是一個(gè)進(jìn)程序列。
c) 監(jiān)控進(jìn)程(也稱(chēng)守護(hù)進(jìn)程)--Linux系統(tǒng)啟動(dòng)時(shí)啟動(dòng)的進(jìn)程,并在后臺(tái)運(yùn)行。
五、 Linux進(jìn)程的創(chuàng)建
在Linux下產(chǎn)生新的進(jìn)程的系統(tǒng)調(diào)用就是fork函數(shù),這個(gè)函數(shù)名是英文中"分叉"的意思。為什么取這個(gè)名字呢?因?yàn)橐粋€(gè)進(jìn)程在運(yùn)行中,如果使用了fork,就產(chǎn)生了另一個(gè)進(jìn)程,于是進(jìn)程就"分叉"了,所以這個(gè)名字取得很形象。fock的語(yǔ)法:
#include #include pid_t fork();
說(shuō)明:本系統(tǒng)調(diào)用產(chǎn)生一個(gè)新的進(jìn)程, 叫子進(jìn)程, 調(diào)用進(jìn)程叫父進(jìn)程。
在Linux網(wǎng)絡(luò)編程中經(jīng)常用到fork()系統(tǒng)調(diào)用。例如一個(gè)客戶(hù)機(jī)/Web服務(wù)器構(gòu)建的網(wǎng)絡(luò)環(huán)境中,Web服務(wù)器往往可以滿(mǎn)足許多客戶(hù)端的請(qǐng)求。如果一個(gè)客戶(hù)機(jī)如果需要訪問(wèn)Web服務(wù)器需要發(fā)送一個(gè)請(qǐng)求,此時(shí)由服務(wù)器生成一個(gè)父進(jìn)程,然后父進(jìn)程通過(guò)fork()系統(tǒng)調(diào)用產(chǎn)生一個(gè)子進(jìn)程,此時(shí)客戶(hù)機(jī)的請(qǐng)求由子進(jìn)程完成。父進(jìn)程可以再度回到等待狀態(tài)不斷服務(wù)其他用戶(hù)端。
有一個(gè)更簡(jiǎn)單的執(zhí)行其它程序的函數(shù)system,參數(shù)string傳遞給一個(gè)命令解釋器(一般為sh)執(zhí)行, 即string被解釋為一條命令, 由sh執(zhí)行該命令.若參數(shù)string為一個(gè)空指針則為檢查命令解釋器是否存在.該命令可以和同命令行下的命令形式相同, 但由于命令做為一個(gè)參數(shù)放在系統(tǒng)調(diào)用中, 應(yīng)注意編譯時(shí)對(duì)特殊意義字符的處理. 命令的查找是按PATH環(huán)境變量的定義的. 命令所生成的后果一般不會(huì)對(duì)父進(jìn)多進(jìn)程編程造成影響. 返回值:當(dāng)參數(shù)為空指針時(shí), 只有當(dāng)命令解釋器有效時(shí)返回值為非零.若參數(shù)不為空指針, 返回值為該命令的返回狀態(tài)(同waitpid())的返回值. 命令無(wú)效或語(yǔ)法錯(cuò)誤則返回非零值,所執(zhí)行的命令被終止. 其他情況則返回-1.它是一個(gè)較高層的函數(shù),實(shí)際上相當(dāng)于在Shell下執(zhí)行一條命令,除了system之外,系統(tǒng)調(diào)用exec是用來(lái)執(zhí)行一個(gè)可執(zhí)行文件來(lái)代替當(dāng)前進(jìn)程的執(zhí)行映像。系統(tǒng)調(diào)用exit的功能是終止發(fā)出調(diào)用的進(jìn)程。sleep 函數(shù)調(diào)用用來(lái)指定進(jìn)程掛起的秒數(shù)。wait函數(shù)族用來(lái)等待和控制進(jìn)程。poppen函數(shù)和system函數(shù)類(lèi)似,區(qū)別是用管道方式處理的輸出。
六、進(jìn)程的管理
Linux管理進(jìn)程***方法就是使用命令行下的系統(tǒng)命令。
1、啟動(dòng)進(jìn)程
鍵入需要運(yùn)行的程序的程序名,執(zhí)行一個(gè)程序,其實(shí)也就是啟動(dòng)了一個(gè)進(jìn)程。在Linux系統(tǒng)中每個(gè)進(jìn)程都具有一個(gè)進(jìn)程號(hào)(PID),用于系統(tǒng)識(shí)別和調(diào)度進(jìn)程。啟動(dòng)一個(gè)進(jìn)程有兩個(gè)主要途徑∶手工啟動(dòng)和調(diào)度啟動(dòng),后者是事先進(jìn)行設(shè)置,根據(jù)用戶(hù)要求自行啟動(dòng)。由用戶(hù)輸入命令,直接啟動(dòng)一個(gè)進(jìn)程便是手工啟動(dòng)進(jìn)程。但手工啟動(dòng)進(jìn)程又可以分為很多種,根據(jù)啟動(dòng)的進(jìn)程類(lèi)型不同、性質(zhì)不同,實(shí)際結(jié)果也不一樣。
(1) 前臺(tái)啟動(dòng)
是手工啟動(dòng)一個(gè)進(jìn)程的最常用的方式。一般地,用戶(hù)鍵入一個(gè)命令"df",這就已經(jīng)啟動(dòng)了一個(gè)進(jìn)程,而且是一個(gè)前臺(tái)的進(jìn)程。這時(shí)候系統(tǒng)其實(shí)已經(jīng)處于一個(gè)多進(jìn)程狀態(tài)。有許多運(yùn)行在后臺(tái)的、系統(tǒng)啟動(dòng)時(shí)就已經(jīng)自動(dòng)啟動(dòng)的進(jìn)程正在悄悄運(yùn)行著。有的用戶(hù)在鍵入"df"命令以后趕緊使用"ps -x"查看,卻沒(méi)有看到df進(jìn)程,也覺(jué)得很奇怪。其實(shí)這是因?yàn)閐f這個(gè)進(jìn)程結(jié)束太快,使用ps查看時(shí)該進(jìn)程已經(jīng)執(zhí)行結(jié)束了。如果啟動(dòng)一個(gè)比較耗時(shí)的進(jìn)程,例如在根命令下運(yùn)行: find , 然后使用ps aux查看,就會(huì)看到一個(gè)find進(jìn)程在里面。
(2) 后臺(tái)啟動(dòng)
直接從后臺(tái)手工啟動(dòng)一個(gè)進(jìn)程用得比較少一些,除非是該進(jìn)程甚為耗時(shí),且用戶(hù)也不急著需要結(jié)果的時(shí)候。假設(shè)用戶(hù)要啟動(dòng)一個(gè)需要長(zhǎng)時(shí)間運(yùn)行的格式化文本文件的進(jìn)程。為了不使整個(gè)shell在格式化過(guò)程中都處于"癱瘓"狀態(tài),從后臺(tái)啟動(dòng)這個(gè)進(jìn)程是明智的選擇。
2、進(jìn)程調(diào)度
當(dāng)需要中斷一個(gè)前臺(tái)進(jìn)程的時(shí)候,通常是使用Ctrl+c組合鍵;但是對(duì)于一個(gè)后臺(tái)進(jìn)程就不是一個(gè)組合鍵所能解決的了,這時(shí)就必須使用kill命令.該命令可以終止后臺(tái)進(jìn)程.至于終止后臺(tái)進(jìn)程的原因很多,或許是該進(jìn)程占用的CPU時(shí)間過(guò)多;或許是該進(jìn)程已經(jīng)掛死.這種情況是經(jīng)常發(fā)生的。Kill命令的工作原理是:向Linux系統(tǒng)的內(nèi)核發(fā)送一個(gè)系統(tǒng)操作信號(hào)和某個(gè)程序的進(jìn)程標(biāo)識(shí)號(hào),然后系統(tǒng)內(nèi)核就可以對(duì)進(jìn)程標(biāo)識(shí)號(hào)指定的進(jìn)程進(jìn)行操作。
除了kill外Linux下面的進(jìn)程涉及到的命令還有:at :at命令在指定時(shí)刻執(zhí)行指定的命令序列;cron:cron命令用來(lái)完成重復(fù)的工作;crontab命令:crontab命令用于安裝、刪除或者列出用于驅(qū)動(dòng)cron后臺(tái)進(jìn)程的任務(wù)表。ps:ps命令主要查看系統(tǒng)中的進(jìn)程;top命令:top命令和ps命令的基本作用是相同的,顯示系統(tǒng)當(dāng)前的進(jìn)程和其他狀況;但是top是一個(gè)動(dòng)態(tài)顯示過(guò)程,即可以通過(guò)用戶(hù)按鍵來(lái)不斷刷新當(dāng)前狀態(tài)。nice:nice命令是進(jìn)程按用戶(hù)指定的優(yōu)先級(jí)運(yùn)行。renice: renice命令用來(lái)改變正在運(yùn)行進(jìn)程的優(yōu)先級(jí)
以上就是Linux進(jìn)程技術(shù)的介紹。
【編輯推薦】