Linux基礎之進程及進程管理

進程

進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。

Linux進程

Linux系統會在進程之間共享程序代碼和系統函數庫,所以在任何時刻內存中都只有代碼的一份拷貝。Linux會爲程序創建一個特殊的環境,該環境包含程序運行需要的所有資源,以保證程序能夠獨立運行,不受其他程序的干擾。這個特殊的環境就稱爲進程。每個 Linux 命令都與系統中的程序對應,輸入命令,Linux 就會創建一個新的進程。系統通過一個五位數字跟蹤程序的運行狀態,這個數字稱爲 pid 或進程ID。每個進程都擁有唯一的 pid。理論上,五位數字是有限的,當數字被用完時,下一個 pid 就會重新開始,所以 pid 最終會重複。但是,兩個 pid 一樣的進程不能同時存在,因爲Linux會使用 pid 來跟蹤程序的運行狀態。

 

前臺進程

默認情況下,用戶創建的進程都是前臺進程;前臺進程從鍵盤讀取數據,並把處理結果輸出到顯示器。我們可以看到前臺進程的運行過程。例如,使用 ls -l 命令來遍歷當前目錄下的文件:


後臺進程

後臺進程與鍵盤沒有必然的關係。當然,後臺進程也可能會等待鍵盤輸入。後臺進程的優點是不必等待程序運行結束就可以輸入其他命令。創建後臺進程最簡單的方式就是在命令的末尾加 &,例如:

前臺任務和後臺任務的切換

fg 命令可以將後臺任務調到前臺,語法爲:fg jobnumber

jobnumber 是通過 jobs 命令獲取的後臺任務的的序號,注意不是pid。如果後臺只有一個任務,可以不指定 jobnumber。

bg 命令可以將後臺暫停的任務,調到前臺繼續運行,語法爲:bg jobnumber

jobnumber 同樣是通過 jobs 命令獲取的後臺任務的的序號,注意不是pid。如果前臺只有一個任務,可以不指定 jobnumber。

如果希望將當前任務轉移到後臺,可以先 Ctrl+z 暫停任務,再使用 bg 命令。任務轉移到後臺可以空出終端,繼續輸入其他命令。

任務和進程

任務(task)是最抽象的,是一個一般性的術語,指由軟件完成的一個活動。一個任務既可以是一個進程,也可以是多個進程。簡而言之,它指的是一系列共同達到某一目的的操作。例如,讀取數據並將數據放入內存中。這個任務可以由一個進程來實現,也可以由多個進程來實現。  每個任務都有一個數字表示的任務號。進程(process)常常被定義爲程序的執行。可以把一個進程看成是一個獨立的程序,在內存中有其完備的數據空間和代碼空間。一個進程所擁有的數據和變量只屬於它自己。

jobs 命令可以用來查看系統中正在運行的任務,包括後臺運行的任務。該命令可以顯示任務號及其對應的進程ID。一個任務可以對應於一個或者多個進程號。

jobs 命令的 -l 選項可以查看當前任務包含的進程ID

其中,第一列表示任務號,第二列表示任務對應的進程ID,第三列表示任務的運行狀態,第四列表示啓動任務的命令。

 

查看正在運行的進程

可以使用 ps 命令查看進程的運行狀態,包括後臺進程,例如:

還可以結合 -f 選項查看更多信息,f 是 full 的縮寫.

每列的含義如下:

描述
UID 進程所屬用戶的ID,即哪個用戶創建了該進程。
PID 進程ID。
PPID 父進程ID,創建該進程的進程稱爲父進程。
C CPU使用率。
STIME 進程被創建的時間。
TTY 與進程有關的終端類型。
TIME 進程所使用的CPU時間。
CMD 創建該進程的命令。


ps 命令還有其他一些選項:

選項 說明
-a 顯示所有用戶的所有進程。
-x 顯示無終端的進程。
-u 顯示更多信息,類似於 -f 選項。
-e 顯示所有進程。

Centos5/6: init

Centos7: systemd

終止進程

當進程運行在前臺時,可以通過 kill 命令或 Ctrl+C 組合鍵來結束進程。

如果進程運行在後臺,那麼首先要通過 ps 命令來獲取進程ID,然後使用 kill 命令“殺死”進程,例如:

如上所示,kill 命令終結了 autofs 進程。

可以使用 pgrep 命令來進行進程過濾:

顯示某一用戶運行的所有進程:

 

父進程和子進程

每個 Linux 進程會包含兩個進程ID:當前進程ID(pid)和父進程ID(ppid)。可以暫時認爲所有的進程都有父進程。

由用戶運行的大部分命令都將 Shell 作爲父進程,使用 ps -f 命令可以查看當前進程ID和父進程ID。

使用 pstree 命令查看進程樹:

殭屍進程和孤兒進程

正常情況下,子進程被終止時會通過 SIGCHLD 信號通知父進程,父進程可以做一些清理工作或者重新啓動一個新的進程。但在某些情況下,父進程會在子進程之前被終止,那麼這些子進程就沒有了“父親”,被稱爲孤兒進程

init 進程會成爲所有孤兒進程的父進程。init 的 pid 爲1,是Linux系統的第一個進程,也是所有進程的父進程。

如果一個進程被終止了,但是使用 ps 命令仍然可以查看該進程,並且狀態爲 Z,那麼這就是一個殭屍進程。殭屍進程雖然被終止了,但是仍然存在於進程列表中。一般殭屍進程很難殺掉,你可以先殺死他們的父進程,讓他們變成孤兒進程,init 進程會自動清理殭屍進程。

常駐進程

常駐進程一般是系統級進程,以 root 權限運行在後臺,可以處理其他進程的請求。

常駐進程沒有終端,不能訪問 /dev/tty 文件,如果使用 ps -ef 查看該進程,tty 這一列會顯示問號(?)。

更確切地說,常駐進程通常運行在後臺,等待指定事件發生,例如打印進程是一個常駐進程,它會等待用戶輸入打印相關的命令並進行處理。

top命令

top 命令是一個很有用的工具,它可以動態顯示正在運行的進程,還可以按照指定條件對進程進行排序,與Windows的任務管理器類似。

top 命令可以顯示進程的很多信息,包括物理內存、虛擬內存、CPU使用率、平均負載以及繁忙的進程等。例如:

htop 是一個 Linux 下的交互式的進程瀏覽器,可以用來替換 Linux 下的 top 命令:

vmstat是Virtual Meomory Statistics(虛擬內存統計)的縮寫,可對操作系統的虛擬內存、進程、CPU活動進行監控,對系統的整體情況進行統計。

字段說明:

Procs(進程):

  r: 運行隊列中進程數量

  b: 等待IO的進程數量

Memory(內存):

  swpd: 使用虛擬內存大小

  free: 可用內存大小

  buff: 用作緩衝的內存大小

  cache: 用作緩存的內存大小

Swap:

  si: 每秒從交換區寫到內存的大小

  so: 每秒寫入交換區的內存大小

IO:(現在的Linux版本塊的大小爲1024bytes)

  bi: 每秒讀取的塊數

  bo: 每秒寫入的塊數

系統:

in: 每秒中斷數,包括時鐘中斷。【interrupt】

cs: 每秒上下文切換數。        【count/second】

CPU(以百分比表示):

  us: 用戶進程執行時間(user time)

  sy: 系統進程執行時間(system time)

  id: 空閒時間(包括IO等待時間),中央處理器的空閒時間 。以百分比表示。

  wa: 等待IO時間

備註:

如果r經常大於4,id經常少於40,表示cpu的負荷很重。

如果bi,bo長期不等於0,表示內存不足。

如果disk經常不等於0,且在b中的隊列大於3,表示io性能不好。

Linux在具有高穩定性、可靠性的同時,具有很好的可伸縮性和擴展性,能夠針對不同的應用和硬件環境調整,優化出滿足當前應用需要的最佳性能。因此企業在維護Linux系統、進行系統調優時,瞭解系統性能分析工具是至關重要的。

強大的性能監測工具 dstat

dstat命令是一個用來替換vmstat、iostat、netstat、nfsstat和ifstat這些命令的工具,是一個全能系統信息統計工具

dstat使用說明: 
直接使用 dstat,默認使用的是 -cdngy 參數,分別顯示 cpu、disk、net、page、system 信息

CPU狀態:CPU的使用率。顯示了用戶,系統和空閒部分,這更好地分析了CPU當前的使用狀況。如果你看到"wait"一欄中,CPU的狀態是一個高使用率值,那說明系統存在一些其它問題。當CPU的狀態處在"waits"時,那是因爲它正在等待I/O設備(例如內存,磁盤或者網絡)的響應而且還沒有收到。

磁盤統計(dsk):磁盤的讀寫操作,這一欄顯示磁盤的讀、寫總數。

網絡統計(net):網絡設備發送和接受的數據,這一欄顯示的網絡收、發數據總數。

分頁統計(paging):系統的分頁活動。分頁指的是一種內存管理技術用於查找系統場景,一個較大的分頁表明系統正在使用大量的交換空間,或者說內存非常分散,大多數情況下你都希望看到page in(換入)和page out(換出)的值是0 0。

系統統計(system):這一項顯示的是中斷(int)和上下文切換(csw)。這項統計僅在有比較基線時纔有意義。這一欄中較高的統計值通常表示大量的進程造成擁塞,需要對CPU進行關注。你的服務器一般情況下都會運行運行一些程序,所以這項總是顯示一些數值。

 

默認情況下,dstat每秒都會刷新數據。如果想退出dstat,你可以按"CTRL+C"鍵。

需要注意的是報告的第一行,通常這裏所有的統計都不顯示數值的。

 

dstat的參數詳情

  • -c:顯示cpu當前狀態
  • -C:加cpu號分別顯示cpu
  • -l:顯示負載統計量
  • -m:顯示內存狀態包括used,buffer,cache,free
  • -n:顯示網卡總狀態
  • -nf:分頁顯示網卡裝填
  • -r:顯示i/o統計
  • -s:顯示交換分區的狀態
  • -t:顯示時間
  • -fs:顯示文件系統統計數據,包括文件總數和innodes值
  • -nocolor:輸出不現實顏色
  • -socket:統計網絡數據
  • -tcp:顯示tcp統計
  • -udp:顯示udp統計

 

定製時間和輸出間隔,比如 dstat -nf 2 5 表示輸出網絡設備 2秒一次 一共輸出5次

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章