一 、進程的概念和分類
1.進程的概念
Linux是一個多用戶多任務的操作系統.多用戶是指多個用戶可以在同一時間使用同一個linux系統;多任務是指在Linux下可以同時執行多個任務,更詳細的說,linux採用了分時管理的方法,所有的任務都放在一個隊列中,操作系統根據每個任務的優先順序為每個任務分配合適的時間片,每個時間片很短,用戶根本感覺不到是多個任務在運行,從而使所有的任務共同分享系統資源,因此linux可以在一個任務還未執行完時,暫時掛起此任務,又去執行另一個任務,過一段時間以後再回來處理這個任務,直到這個任務完成,才從任務隊列中去除.這就是多任務的概念.
上面說的是單CPU多任務操作系統的情形,在這種環境下,雖然系統可以運行多個任務,但是在某一個時間點,CPU只能執行一個進程,而在多CPU多任務的操作系統下,由於有多個CPU,在某個時間點上,可以有多個進程同時運行.
進程的的基本定義是:在自身的虛擬地址空間運行的一個獨立的程序,從操作系統的角度來看,所有在系統上運行的東西,都可以稱為一個進程.
需要注意的是:程序和進程是有區別的,進程雖然有程序產生,但是它並不是程序,程序是一個進程指令的集合,它可以啟用一個或多個進程,同時,程序只佔用磁碟空間,而不佔用系統運行資源,而進程僅僅佔用系統內存空間,是動態的、可變的,關閉進程,佔用的內存資源隨之釋放.
例如,用戶在linux上打開一個文件、就會產生一個打開文件的進程,關閉文件,進程也隨機關閉.如果在系統上啟動一個服務,例如啟動tomcat服務,就會產生一個對應的java的進程.而如果啟動apache服務,就會產生多個httpd進程.
2.進程的分類
按照進程的功能和運行的程序分類,進程可劃分為兩大類:
系統進程:可以執行內存資源分配和進程切換等管理工作;,該進程的運行不受用戶的干預,即使是root用戶也不能干預系統進程的運行.
用戶進程:通過執行用戶程序、應用程序或內核之外的系統程序而產生的進程,此類進程可以在用戶的控制下運行或關閉.
針對用戶進程,又可以分為交互進程、批處理進程和守護進程三類.
交互進程:由一個shell終端啟動的進程,在執行過程中,需要與用戶進行交互操作,可以運行於前台,也可以運行在後台.
批處理進程:該進程是一個進程集合,負責按順序啟動其他的進程.
守護進程:守護進程是一直運行的一種進程,經常在linux系統啟動時啟動,在系統關閉時終止.它們獨立於控制終端並且周期性的執行某種任務或等待處理某些發生的事件.例如httpd進程,一直處於運行狀態,等待用戶的訪問.還有經常用的crond進程,這個進程類似與windows的計劃任務,可以周期性的執行用戶設定的某些任務.
3.進程的屬性
(1)進程的幾種狀態
進程在啟動后,不一定馬上開始運行,因而進程存在很多種狀態.
可運行狀態:處於這種狀態的進程,要麼正在運行、要麼正準備運行.
可中斷的等待狀態:這類進程處於阻塞狀態,一旦達到某種條件,就會變為運行態.同時該狀態的進程也會由於接收到信號而被提前喚醒進入到運行態.
不中斷的等待狀態:與“可中斷的等待狀態”含義基本類似,唯一不同的是處於這個狀態的進程對信號不做響應.
二、 進程的監控與管理
Linux下,監控和管理進程的命令有很多,下面我們以ps、top、pstree、lsof四個最常用的指令介紹如果有效的監控和管理linux下的各種進程.
2.1 利用ps命令監控系統進程
2.2 利用pstree監控系統進程
pstree命令以樹形結構顯示程序和進程之間的關係,使用格式如下:
pstree [-acnpu] [<PID>/<user>]
選項含義如下:
-a 顯示啟動每個進程對應的完整指令,包含啟動進程的路徑、參數等等.
-c 不使用精簡法顯示進程信息,即顯示的進程中包含子進程和父進程.
-n 根據進程PID號來排序輸出,默認是以程序名稱排序輸出的.
-p 顯示進程的PID.
-u 顯示進程對應的用戶名稱.
PID:即進程對應的PID號,或者叫進程識別號.
user:系統用戶名.
pstree清楚的顯示了程序和進程之間的關係,如果不指定進程的PID號,或者不指定用戶名稱,則將以init進程為根進程,顯示系統的所有程序和進程信息,若指定用戶或PID,則將以用戶或PID為根進程,顯示用戶或PID對應的所有程序和進程.
舉例如下:
如果想知道某個用戶下都啟動了哪些進程的話,pstree指令可以很容易實現,下面顯示mysql用戶下對應的進程信息,執行如下命令:
[root@localhost ~]# pstree mysql
mysqld---6*[{mysqld}]
該輸出顯示了mysql用戶下對應的進程為mysqld,並且mysqld進程擁有5個子進程(5個子進程加一個父進程,共6個進程).
為了更詳細的了解每個進程的信息,例如每個子進程和父進程對應的PID,執行如下命令:
[root@localhost ~]# pstree -c -p mysql
mysqld(18785)- -{mysqld}(18787)
|-{mysqld}(18788)
|-{mysqld}(18789)
|-{mysqld}(18790)
|-{mysqld}(18791)
`-{mysqld}(29625)
通過“-p、-c”參數,清楚的顯示了父進程和子進程,以及它們各種的PID.
2.3 利用top監控系統進程
top命令是監控系統進程必不可少的工具,與ps命令相比,top命令動態、實時的顯示進程狀態,而ps只能顯示進程某一時刻的信息,同時,top命令提供了一個交互界面,用戶可以根據需要,人性化的定製自己的輸出,更清楚的了解進程的實時狀態.
關於top指令的用法,在第四章已經有了詳細的介紹,這裡通過幾個例子,闡述一下top命令在系統進程監控中的作用和優點.
下面這個例子是某系統在某時刻執行top命令后的輸出:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND
21115 root 23 0 1236m 360m 2384 S 6 4.4 382:24.14 java
30295 root 16 0 3552 984 760 R 1 0.0 0:00.09 top
30118 nobody 15 0 6904 3132 1676 S 0 0.0 0:00.47 httpd
30250 nobody 15 0 6900 3088 1660 S 0 0.0 0:00.06 httpd
1 root 16 0 1780 552 472 S 0 0.0 0:01.25 init
從top命令的輸出可知,此系統有java和httpd兩個用戶進程在運行.
進程PID為21115的java進程由root用戶啟動,優先順序(PR)為23,佔用的虛擬內存總量(VIRT)為1236M,未被換出的物理內存(RES)為360M,共享內存(SHR)為2384 kb.通過這幾個選項可以了解java進程對內存的使用量,有助於系統管理員對系統虛擬內存使用狀況的掌控.
此刻java進程處於休眠狀態(S),從上次更新到現在java佔用cpu時間(%CPU)為6%,佔用物理內存(%MEM)為4.4%,從進程啟動到現在java佔用cpu總時間(TIME )為“382:24.14”,單位是1/100秒.通過了解這些信息,可以使系統管理員掌握java進程對系統CPU、物理內存的使用狀況.
兩個httpd進程由nobody用戶啟動,優先順序都為15,同時都處於休眠狀態.
2.4 利用lsof監控系統進程與程序
lsof全名list opened files,也就是列舉系統中已經被打開的文件,通過lsof,我們就可以根據文件找到對應的進程信息,也可以根據進程信息找到進程打開的文件.
lsof指令功能強大,這裡介紹“-c,-g,-p,-i”這四個最常用參數的使用.更詳細的介紹請參看man lsof.
lsof filename:顯示使用filename文件的進程.
如果想知道某個特定的文件由哪個進程在使用,可以通過“lsof 文件名”方式得到,例如:
[root@localhost ~]# lsof /var/log/messages
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
syslogd 2027 root 1w REG 8,6 43167 31916 /var/log/messages
從這個輸出可知,/var/log/messages文件是由syslogd進程在使用.
lsof -c abc :顯示abc進程現在打開的文件,例如:
[root@localhost ~]# lsof -c nfs
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
nfsd4 2761 root cwd DIR 8,3 4096 2 /
nfsd4 2761 root rtd DIR 8,3 4096 2 /
nfsd4 2761 root txt unknown /proc/2761/exe
nfsd 2762 root cwd DIR 8,3 4096 2 /
nfsd 2762 root rtd DIR 8,3 4096 2 /
nfsd 2762 root txt unknown /proc/2762/exe
nfsd 2763 root cwd DIR 8,3 4096 2 /
nfsd 2763 root rtd DIR 8,3 4096 2 /
lsof -i 通過監聽指定的協議、埠、主機等信息,顯示符合條件的進程信息.
使用語法為:
lsof -i [46] [protocol][@hostname][:service|port]
46:4代表IPv4,6代表IPv6.
protocol:傳輸協議,可以是TCP或UDP.
hostname:主機名稱或者IP地址.
service:進程的服務名,例如nfs、ssh、ftp等.
port:系統中服務對應的埠號.例如http服務默認對應80,ssh服務默認對應22等等.
例如:
顯示系統中tcp協議對應的25埠進程信息:
[root@localhost ~]# lsof -i tcp:25
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sendmail 2252 root 4u IPv4 5874 TCP localhost:smtp (LISTEN)
顯示系統中80埠對應的進程信息:
[root@localhost ~]# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
httpd 16474 nobody 3u IPv6 7316069 TCP *:http (LISTEN)
httpd 16475 nobody 3u IPv6 7316069 TCP *:http (LISTEN)
httpd 16578 nobody 3u IPv6 7316069 TCP *:http (LISTEN)
顯示本機udp協議對應的53埠開啟的進程信息:
[root@localhost ~]# lsof -i udp@127.0.0.1:53
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
named 21322 named 20u IPv4 9130640 UDP localhost:domain
通過lsof命令能夠清楚的了解進程和文件以及程序之間的對應關係,熟練掌握lsof的使用,對linux的進程管理有很大幫助.
本文出自 「技術成就夢想」 博客,請務必保留此出處http://ixdba.blog.51cto.com/2895551/543737
[火星人 ] 初探Linux進程管理機制已經有653次圍觀