學(xué)習(xí)Unix操作系統(tǒng)進(jìn)程
Unix操作系統(tǒng)中的進(jìn)程指的是一個(gè)具有特定功能的程序,它可以和其他程序共享對(duì)某個(gè)數(shù)據(jù)集合的操作。進(jìn)程被應(yīng)用程序創(chuàng)建之后,在獲得資源時(shí)運(yùn)行。如果得不到資源,就暫時(shí)停止直到獲得其所需要的資源。
Unix操作系統(tǒng)進(jìn)程完成后消忙。故進(jìn)程與普通程序仍然有所差別。因?yàn)檫M(jìn)程是動(dòng)態(tài)的,而程序是靜態(tài)的概念。不過筆者覺得這些描述都不怎么直觀。筆者平時(shí)在跟大家交流過程中,都把Unxi進(jìn)程比喻為系統(tǒng)的守護(hù)神。他負(fù)責(zé)與系統(tǒng)CPU之間進(jìn)行通信并保障系統(tǒng)的正常運(yùn)行。
雖然進(jìn)程是應(yīng)用軟件自動(dòng)產(chǎn)生的。但是系統(tǒng)工程師在必要的時(shí)候仍然要學(xué)會(huì)對(duì)系統(tǒng)進(jìn)程進(jìn)行調(diào)整。如把某些運(yùn)行時(shí)間比較久的進(jìn)程放入到后臺(tái)運(yùn)行等等。筆者這里就進(jìn)程管理這個(gè)話題,跟大家分享一下自己在這方面的管理經(jīng)驗(yàn)。
一、如何查看進(jìn)程標(biāo)識(shí)?
進(jìn)程創(chuàng)建之后,系統(tǒng)就會(huì)為其分配一個(gè)***的標(biāo)識(shí)。進(jìn)程表示的允許范圍是從0到65535的十進(jìn)制數(shù)字。通常情況下,進(jìn)程標(biāo)識(shí)是循環(huán)使用的。如果進(jìn)程標(biāo)識(shí)達(dá)到上界的話,將重新使用比較小的進(jìn)程號(hào)。Unix操作系統(tǒng)進(jìn)程號(hào)在系統(tǒng)中的分配原則是必須***。
所以即使是同一個(gè)應(yīng)用程序發(fā)起的進(jìn)程,發(fā)起時(shí)間不同其進(jìn)程號(hào)也不同。但是關(guān)于進(jìn)程的很多操作,都是針對(duì)進(jìn)程號(hào)來進(jìn)行的。如要把后臺(tái)的進(jìn)程調(diào)到前臺(tái)來或者人工殺死一個(gè)不用的進(jìn)程,都需要知道進(jìn)程標(biāo)識(shí)。故在進(jìn)程管理中,系統(tǒng)工程師首先要掌握的一個(gè)內(nèi)容就是如何查看系統(tǒng)的進(jìn)程號(hào)。
在Unix操作系統(tǒng)中,可以使用ps –ef命令來查看系統(tǒng)中的所有進(jìn)程。輸入這個(gè)命令后,系統(tǒng)會(huì)顯示當(dāng)前系統(tǒng)中進(jìn)程的詳細(xì)信息。具體來說,會(huì)包括如下內(nèi)容。如UID表示這個(gè)進(jìn)程的所有者;PID表示進(jìn)程的標(biāo)識(shí);PPID表示父進(jìn)程的標(biāo)識(shí);TTY表示運(yùn)行進(jìn)程的終端;COMMMAND表示創(chuàng)建進(jìn)程的系統(tǒng)命令。
作為一個(gè)合格的Unix操作系統(tǒng)工程師,要能夠從這些信息中得到以下有用的結(jié)論。
一是子進(jìn)程與父進(jìn)程的關(guān)系。每個(gè)進(jìn)程都只有一個(gè)父進(jìn)程,但是可以有多個(gè)子進(jìn)程。創(chuàng)建其他進(jìn)程的進(jìn)程被稱為父進(jìn)程;而這個(gè)被創(chuàng)建的進(jìn)程就是子進(jìn)程。為什么要區(qū)分父子進(jìn)程呢?如現(xiàn)在系統(tǒng)有三個(gè)進(jìn)程,進(jìn)程號(hào)分別為1001,1002,1003。而進(jìn)程1003是有進(jìn)程1001創(chuàng)建的。也就是說進(jìn)程1001是進(jìn)程1003所創(chuàng)建的。此時(shí)如果由于某種原因手工殺死父進(jìn)程1001的話,那么它的子進(jìn)程也會(huì)被同時(shí)殺死或者說成為“孤兒進(jìn)程”。
為此Unix操作系統(tǒng)工程師在手工殺死進(jìn)程的時(shí)候,需要先判斷一下這個(gè)進(jìn)程是否還創(chuàng)建了其他子進(jìn)程。只有在確定這些子進(jìn)程的手工關(guān)閉不會(huì)對(duì)系統(tǒng)產(chǎn)生不利影響之后,系統(tǒng)工程師才能夠殺死父進(jìn)程。而父進(jìn)程與子進(jìn)程的明顯區(qū)別就在于進(jìn)程標(biāo)示號(hào)(PID)與父進(jìn)程標(biāo)識(shí)號(hào)(PPID)。
如果子進(jìn)程創(chuàng)建成功,則系統(tǒng)fork進(jìn)程會(huì)將子進(jìn)程的PID傳給父進(jìn)程。故系統(tǒng)工程師要能夠根據(jù)進(jìn)程標(biāo)識(shí)號(hào)與父進(jìn)程標(biāo)識(shí)號(hào)來判斷誰是誰的父進(jìn)程;在手工關(guān)閉父進(jìn)程時(shí)要注意其創(chuàng)建的子進(jìn)程對(duì)系統(tǒng)是否會(huì)產(chǎn)生不利影響。
二是系統(tǒng)創(chuàng)建的進(jìn)程不能夠被手工關(guān)閉。在Unix操作系統(tǒng)啟動(dòng)的時(shí)候,系統(tǒng)核心將創(chuàng)建sched進(jìn)程。然后這個(gè)進(jìn)程又會(huì)產(chǎn)生三個(gè)子進(jìn)程,分別為init進(jìn)程、vhard進(jìn)程和bdflush進(jìn)程。這個(gè)四個(gè)進(jìn)程的進(jìn)程標(biāo)示好分別為0、1、2、3。在核心調(diào)度程序?yàn)樗麄兎峙銫PU時(shí)間之前,shced把其他程序調(diào)度內(nèi)存。這里Unix操作系統(tǒng)工程師需要注意的是,不要去嘗試著維護(hù)這四個(gè)進(jìn)程,如不要想把這個(gè)四個(gè)進(jìn)程強(qiáng)制關(guān)閉掉。否則的話,工程師會(huì)吃不了兜著走。
這就是我們對(duì)Unix操作系統(tǒng)的進(jìn)程的知識(shí)的介紹,希望對(duì)一些Unix操作系統(tǒng)新手來說有很好的幫助!
【編輯推薦】