在啟用電腦時,你會發現必不可少的就是作業系統。作業系統中微軟占很大部分,不過這幾年Linux也趕上了微軟。Linux是一個多使用者多任務的作業系統。這裡介紹Linux的知識,讓你學好應用Linux系統。今天一講Linux進程技術,希望你記住Linux進程技術。
一、 進程的屬性
進程的定義:一個進程是一個程式的一次執行的過程,程式是靜態,它是一些儲存在磁碟上的可執行檔代碼和資料集合,進程是一個動態概念。它是Linux 系統的基本的調度單位,一個進程由如下元素組成:
1、 程式的讀取上下文,它表示程式讀取執行的狀態。
2、 程式當前執行目錄。
3、 程式服務的檔案和目錄
4、 程式的存取權限。
5、 記憶體和其他分配給進程的系統資源。
Linux進程中最知名的屬性就是它的進程號(Process Idenity Number,PID)和它的父進程號(parent process ID,PPID)。PID、PPID都是非零正整數。一個PID惟一地標識一個進程。一個進程建立新進程稱為建立了子進程(child process)。相反地,建立子進程的進程稱為父進程。所有進程追溯其祖先最終都會落到進程號為1的進程身上,這個進程叫做init進程。是核心自舉後第一個啟動的進程。init進程作用是扮演終結父進程的角色。因為init進程永遠不會被終止,所以系統總是可以確信它的存在,並在必要的時候以它為參照。如果某個進程在它衍生出來的全部子進程結束之前被終止,就會出現必須以init為參照的情況。此時那些失去了父進程的子進程就都會以init作為它們的父進程。如果你執行一下ps -af 命令,可以列出許多父進程IDParent Process ID,PPID)為1的進程來。Linux提供了一條pstree命令,允許使用者查看系統內正在啟動並執行各個進程之間的繼承關係。直接在命令列中輸入pstree即可,程式會以樹狀結構方式列出系統中正在啟動並執行各進程之間的繼承關係。
二、進程在運行中的三種狀態:
執行(Running)狀態:CPU正在執行,即進程正在佔用CPU。
就緒(Waiting)狀態:進程已經具備的執行的一切條件,正在等待分配CPU的處理時間片。
停止(Stoped)狀態:進程不能使用CPU。
核心使用進程來控制對CPU和其他系統資源的訪問,並且使用進程來決定在CPU上運行那個程式、運行多久以及採用什麼特性運行它。核心的調度器負責在所有的進程間分配CPU執行時間,稱為時間片(time slice),它輪流在每個進程分得的時間片用完後從進程那裡得到控制權。如果處理器比較快的話,你會覺得時間片非常小,彷彿是幾個進程在同時運行。在Linix作業系統啟動過程中,系統自動建立init等系統進程,用於管理記憶體資源以及對使用者進程進行調度等。進程是動態, 一個程式的可以有多個進程同時或不同時執行它。一次執行多進程的好處在於你可以一邊發郵件,一邊聽音樂。
三、 理解Linux下進程的結構
Linux中一個進程在記憶體裡有三部份的資料,就是"資料區段","堆棧段"和"程式碼片段",基於I386相容的中央處理器,都有上述三種段寄存器,以方便作業系統的運行。
程式碼片段,是存放了程式碼的資料,假如機器中有數個進程運行相同的一個程式,那麼它們就可以使用同一個程式碼片段。而資料區段則存放程式的全域變數,常數以及動態資料分配的資料空間。堆棧段存放的就是子程式的返回地址、子程式的參數以及程式的局部變數。堆棧段包括進程式控制制塊PCBProcess Control Block)中。PCB處於進程核心堆棧的底部,不需要額外分配空間。
四、 Linux進程的種類
Linux作業系統包括三種不同類型的進程,每種進程都有自己的特點和屬性。
a) 互動進程--由一個shell啟動的進程。互動進程既可以在前台運行,也可以在後台運行。
b) 批處理進程--這種進程和終端沒有聯絡,是一個進程式列。
c) 監控進程也稱守護進程)--Linux系統啟動時啟動的進程,並在後台運行。
五、 Linux進程的建立
在Linux下產生新的進程的系統調用就是fork函數,這個函數名是英文中"分叉"的意思。為什麼取這個名字呢?因為一個進程在運行中,如果使用了fork,就產生了另一個進程,於是進程就"分叉"了,所以這個名字取得很形象。fock的文法:
#include #include pid_t fork();
說明:本系統調用產生一個新的進程, 叫子進程, 調用進程叫父進程。
在Linux網路編程中經常用到fork()系統調用。例如一個客戶機/Web伺服器構建的網路環境中,Web伺服器往往可以滿足許多用戶端的請求。如果一個客戶機如果需要訪問Web伺服器需要發送一個請求,此時由伺服器產生一個父進程,然後父進程通過fork()系統調用產生一個子進程,此時客戶機的請求由子進程完成。父進程可以再度回到等待狀態不斷服務其他使用者端。
有一個更簡單的執行其它程式的函數system,參數string傳遞給一個命令直譯器(一般為sh)執行, 即string被解釋為一條命令, 由sh執行該命令.若參數string為一個null 指標則為檢查命令直譯器是否存在.該命令可以和同命令列下的命令形式相同, 但由於命令做為一個參數放在系統調用中, 應注意編譯時間對特殊意義字元的處理. 命令的尋找是按PATH環境變數的定義的. 命令所產生的後果一般不會對父進多進程編程造成影響. 傳回值:當參數為空白指標時, 只有當命令直譯器有效時傳回值為非零.若參數不為空白指標, 傳回值為該命令的返回狀態(同waitpid())的傳回值. 命令無效或語法錯誤則返回非零值,所執行的命令被終止. 其他情況則返回-1.它是一個較高層的函數,實際上相當於在Shell下執行一條命令,除了system之外,系統調用exec是用來執行一個可執行檔來代替當前進程的執行映像。系統調用exit的功能是終止發出調用的進程。sleep 函數調用用來指定進程掛起的秒數。wait函數族用來等待和控制進程。poppen函數和system函數類似,區別是用管道方式處理的輸出。
六、進程的管理
Linux管理進程最好方法就是使用命令列下的系統命令。
1、啟動進程
鍵入需要啟動並執行程式的程式名,執行一個程式,其實也就是啟動了一個進程。在Linux系統中每個進程都具有一個進程號PID),用於系統識別和調度進程。啟動一個進程有兩個主要途徑∶手工啟動和調度啟動,後者是事先進行設定,根據使用者要求自行啟動。由使用者輸入命令,直接啟動一個進程便是手工啟動進程。但手工啟動進程又可以分為很多種,根據啟動的進程類型不同、性質不同,實際結果也不一樣。
1) 前台啟動
是手工啟動一個進程的最常用的方式。一般地,使用者鍵入一個命令"df",這就已經啟動了一個進程,而且是一個前台的進程。這時候系統其實已經處於一個多進程狀態。有許多運行在背景、系統啟動時就已經自動啟動的進程正在悄悄運行著。有的使用者在鍵入"df"命令以後趕緊使用"ps -x"查看,卻沒有看到df進程,也覺得很奇怪。其實這是因為df這個進程結束太快,使用ps查看時該進程已經執行結束了。如果啟動一個比較耗時的進程,例如在根命令下運行: find , 然後使用ps aux查看,就會看到一個find進程在裡面。
2) 後台啟動
直接從後台手工啟動一個進程用得比較少一些,除非是該進程甚為耗時,且使用者也不急著需要結果的時候。假設使用者要啟動一個需要長時間啟動並執行格式化文字檔的進程。為了不使整個shell在格式化過程中都處於"癱瘓"狀態,從後台啟動這個進程是明智的選擇。
2、進程調度
當需要中斷一個前台進程的時候,通常是使用Ctrl+c按鍵組合;但是對於一個後台進程就不是一個按鍵組合所能解決的了,這時就必須使用kill命令.該命令可以終止後台進程.至於終止後台進程的原因很多,或許是該進程佔用的CPU時間過多;或許是該進程已經掛死.這種情況是經常發生的。Kill命令的工作原理是:向Linux系統的核心發送一個系統操作訊號和某個程式的進程標識號,然後系統核心就可以對進程標識號指定的進程進行操作。
除了kill外Linux下面的進程涉及到的命令還有:at :at命令在指定時刻執行指定的命令序列;cron:cron命令用來完成重複的工作;crontab命令:crontab命令用於安裝、刪除或者列出用於驅動cron後台進程的任務表。ps:ps命令主要查看系統中的進程;top命令:top命令和ps命令的基本作用是相同的,顯示系統當前的進程和其他狀況;但是top是一個動態顯示過程,即可以通過使用者按鍵來不斷重新整理目前狀態。nice:nice命令是進程按使用者指定的優先順序運行。renice: renice命令用來改變正在運行進程的優先順序
以上就是Linux進程技術的介紹。
- Linux上的虛擬化技術 Xen虛擬化初學指南
- 處理Linux核心安全詳解
- Linux的Shell編程 Shell基本文法
- Linux的Shell編程 運行Shell程式的方法
- Linux的Shell編程bash的內部命令