歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> 簡要剖析Linux系統的進程管理機制

簡要剖析Linux系統的進程管理機制

日期:2017/3/1 17:30:50   编辑:Linux技術

一 、進程的概念和分類
1.進程的概念
Linux是一個多用戶多任務的操作系統。
多用戶是指多個用戶可以在同一時間使用同一個linux系統;
多任務是指在Linux下可以同時執行多個任務,更詳細的說,linux采用了分時管理的方法,所有的任務都放在一個隊列中,操作系統根據每個任務的優先級為每個任務分配合適的時間片,每個時間片很短,用戶根本感覺不到是多個任務在運行,從而使所有的任務共同分享系統資源,這就是多任務的概念。
上面說的是單CPU多任務操作系統的情形,在這種環境下,雖然系統可以運行多個任務,但是在某一個時間點,CPU只能執行一個進程,而在多CPU多任務的操作系統下,由於有多個CPU,所以在某個時間點上,可以有多個進程同時運行。
進程的的基本定義是:在自身的虛擬地址空間運行的一個獨立的程序,從操作系統的角度來看,所有在系統上運行的東西,都可以稱為一個進程。
需要注意的是:程序和進程的關系可以是多對多關系!

2.進程的分類
按照進程的功能和運行的程序分類,進程可劃分為兩大類:
l) 系統進程:可以執行內存資源分配和進程切換等管理工作;而且,該進程的運行不受用戶的干預,即使是root用戶也不能干預系統進程的運行。
2) 用戶進程:通過執行用戶程序、應用程序或內核之外的系統程序而產生的進程,此類進程可以在用戶的控制下運行或關閉。
針對用戶進程,又可以分為交互進程、批處理進程和守護進程三類。
3) 交互進程:由一個shell終端啟動的進程,在執行過程中,需要與用戶進行交互操作,可以運行於前台,也可以運行在後台。
4) 批處理進程:該進程是一個進程集合,負責按順序啟動其他的進程。
5) 守護進程:守護進程是一直運行的一種進程,經常在linux系統啟動時啟動,在系統關閉時終止。它們獨立於控制終端並且周期性的執行某種任務或等待處理某些發生的事件。例如httpd進程,一直處於運行狀態,等待用戶的訪問。還有經常用的crond進程,這個進程類似與windows的計劃任務,可以周期性的執行用戶設定的某些任務。
3.進程的屬性
(1)進程的幾種狀態
2016216113133071.png (630×402)

(2)進程之間的關系
在linux系統中,進程ID(用PID表示)是區分不同進程的唯一標識,它們的大小是有限制的,最大ID為32768,用UID和GID分別表示啟動這個進程的用戶和用戶組。所有的進程都是PID為1的init進程的後代,內核在系統啟動的最後階段啟動init進程,因而,這個進程是linux下所有進程的父進程,用PPID表示父進程。所以如果init進程被kill,則意味著所有進程就kill,那系統會重啟或關閉

舉例:ps命令輸出的httpd進程信息:
2016216113246935.png (603×177)

相對於父進程,就存在子進程,一般每個進程都必須有一個父進程,父進程與子進程之間是管理與被管理的關系,當父進程停止時,子進程也隨之消失,但是子進程關閉,父進程不一定終止。
如果父進程在子進程退出之前就退出,那麼所有子進程就變成的一個孤兒進程,如果沒有相應的處理機制的話,這些孤兒進程就會一直處於僵死狀態,資源無法釋放,此時系統默認將init進程作為它們的父進程。

二、 進程管理命令
Linux下,監控和管理進程的命令有很多,下面我們以ps、top、pstree、lsof四個最常用的指令介紹如果有效的監控和管理linux下的各種進程。
(1)利用ps命令監控系統進程
ps是linux下最常用的進程監控命令,重點講述如何利用ps指令監控和管理系統進程。
舉例:
下面是apache進程的輸出信息
2016216113322165.png (520×255)

其中,UID是用戶的ID標識號,PID是進程的標識號,PPID表示父進程,STIME表示進程的啟動時間,TTY表示進程所屬的終端控制台,TIME表示進程啟動後累計使用的CPU總時間,CMD表示正在執行的命令。並且root的PPID為1,即為Init的ID.

另一種指令方式查看子進程與父進程的對應關系:
2016216113342162.png (683×282)

其中,%CPU表示進程占用的CPU百分比,%MEM表示進程占用內存的百分比,VSZ表示進程虛擬大小,RSS表示進程的實際內存(駐留集)大小(單位是頁)。
STAT表示進程的狀態,進程的狀態有很多種:用“R”表示正在運行中的進程,用“S”表示處於休眠狀態的進程,用“Z”表示僵死進程,用“<”表示優先級高的進程,用“N”表示優先級較低的進程,用“s”表示父進程,用“+”表示位於後台的進程。START表示啟動進程的時間。
這個例子將進程之間的關系用樹形結構形象的表示出來,可以很清楚的看到,第一個進程為父進程,而其它進程均為子進程。同時從這個輸出還可以看到每個進程占用CPU、內存的百分比,還有進程所處的狀態等等。
(2)利用pstree監控系統進程
pstree命令以樹形結構顯示程序和進程之間的關系,使用格式如下:

復制代碼代碼如下:
pstree [-acnpu] [<PID>/<user>]

具體選項內容可用pstree --help來查看,由於顯示結果的樹形結構太長,就不再貼圖.
pstree清楚的顯示了程序和進程之間的關系,如果不指定進程的PID號,或者不指定用戶名稱,則將以init進程為根進程,顯示系統的所有程序和進程信息,若指定用戶或PID,則將以用戶或PID為根進程,顯示用戶或PID對應的所有程序和進程。
(3)利用top監控系統進程
top命令是監控系統進程必不可少的工具,與ps命令相比,top命令動態、實時的顯示進程狀態,而ps只能顯示進程某一時刻的信息,同時,top命令提供了一個交互界面,用戶可以根據需要,人性化的定制自己的輸出,更清楚的了解進程的實時狀態。
下面是top的顯示信息
2016216113400420.png (672×374)

通過動態信息可以看出一個進程從上次更新到現在占用cpu時間,占用物理內存(%MEM),從進程啟動到現在占用cpu總時間(TIME+)等。通過了解這些信息,可以使系統管理員掌握每個進程對系統CPU、物理內存的使用狀況。

(4)利用lsof監控系統進程與程序
lsof全名list opened files,也就是列舉系統中已經被打開的文件,通過lsof,我們就可以根據文件找到對應的進程信息,也可以根據進程信息找到進程打開的文件。
lsof指令功能強大,這裡介紹“-c,-g,-p,-i”這四個最常用參數的使用。更詳細的介紹請參看manlsof或者lsof --help。
1) lsoffilename:顯示使用filename文件的進程。
2)lsof -c abc:顯示abc進程現在打開的文件
3)lsof -g gid:顯示指定的進程組打開的文件情況,使用進程組ID即GID
4)lsof -p PID:PID是進程號,通過進程號顯示程序打開的所有文件及相關進程,例如,想知道init進程打開了哪些文件的話,可以執行“lsof-p 1”命令
5)lsof-i :通過監聽指定的協議、端口、主機等信息,顯示符合條件的進程信息。
例如:
顯示系統中tcp協議對應的25端口進程信息:

復制代碼代碼如下:
[root@localhost ~]# lsof-i tcp:25

顯示系統中80端口對應的進程信息:

復制代碼代碼如下:
[root@localhost ~]# lsof-i :80

(5) 計劃任務
計劃任務就是提前設定的一系列命名,來在特定時間裡自動完成,比如一些自動備份,自動關系,自動發郵件,廣播之類
計劃任務有三個比較重要的命令
1)at安排作業在某一時刻執行一次
2)Batch安排作業在系統負載不重時執行一次
3)Cron安排周期性運行的作業
(6)結束進程
Kill -1重啟進程
kill 進程號 結束進程
kill -9強制結束進程
(7) 設置程序的優先級
Niec :指定程序運行優先級別

復制代碼代碼如下:
Nice -n command

Renice:改變一個正在運行的進程的優先級別

復制代碼代碼如下:
Renice -n pid

優先級取值范圍為(-20,19)
(8)進程的掛起和恢復:
掛起:Ctrl+Z
終止:Ctrl+C
進程的恢復:
恢復到前台繼續運行:fg
恢復到後台繼續運行:bg
查看被掛起的進程:jobs

Copyright © Linux教程網 All Rights Reserved