進程及進程的管理

  首先得理解進程的含義,進程不同於程序,進程是程序的一次運行實例,當一個程序運行時,就會產生相應的進程,因此,程序是死的,而進程是活的。一個進程可以包含若干線程,線程可以幫助應用程序同時做幾件事(比如一個線程向磁盤寫入文件,另一個則接收用戶的按鍵操作並及時做出反應,互相不干擾),在程序被運行後中,系統首先要做的就是爲該程序進程建立一個默認線程,然後程序可以根據需要自行添加或刪除相關的線程。

  進程是由內核進行管理的,內核在正常啓動並且全面接管硬件資源之後,會創建一個Init的進程;而這個名叫init的進程負責用戶空間的進程管理;此外,每個進程的組織結構是一致的。

  CentOS5及以前:SysV Init,Classic Init,這種方式有缺陷:在啓動系統時,Init通過寫腳本的方式來創建各個子進程;利用shell來實現,因此其執行速度非常慢;導致系統的啓動速度和進程的創建速度都非常慢;

CentOS6:upstart,有Ubuntu研發的新型的Init進程;可以並行的啓動某些有關聯的服務進程,在創建進程的時候,可以多線創建進程;如果有多個CPU或這有多顆CPU核心的話,其進程的創建速度會有比較明顯的變化;第一個進程名稱仍然是init;

CentOS7:Systemd,參考了MAC OS的啓動邏輯開發一款新版的init程序;其可以以其自身獨立完成整個操作系統的啓動工作;也就是說,在開機並加載內核之後,只需要啓動一個systemd進程就可以將其他各服務進程啓動起來,從而引導整個系統啓動;

  由此可以看出,centos7創建進程的方式是最快的,也就是爲什麼centos7開機速度快的根本原因。

  除了init進程之外,其他的各個進程都是由其父進程創建的;任何的進程的父子關係都保存在task struct中,每個子進程的生命週期也由父進程決定,於是會出現一種特殊情況,就是當父進程“死亡”之後,其子進程會一直存在於內存中,成爲“殭屍”,這對系統來說必定是有害的。

  每個父進程通過fork()系統調用,複製自身的數據給子進程使用;這種複製方式不是立即複製,而是寫時複製(CoW);所謂寫時複製,就是隻有進程空間的各段內容要發生改變時,纔會將父進程的內容複製給子進程

   進程的優先級爲0-139中的140個整數,其中1-99爲實時優先級,數字越大優先級越高;在系統啓動時啓動的進程;而100-139爲靜態優先級,數字越小優先級越高;在用戶執行某些應用程序的時候啓動的進程;

  更改優先級的方法爲使用nice值,nice值的範圍爲-20-19,默認的nice值爲0,只有管理員才能使用負整數的nice值,以提升進程的優先級;而普通用戶只能使用正整數的nice值,以降低進程的優先級;

  進程的類型有以下幾種分類:

               按照進程的啓動方式:

守護進程:

Daemon,通常是在系統引導的過程被啓動的,與任何的終端無關;也可以通過終端啓動;

用戶進程:

用戶登錄到系統之後,通過終端啓動的進程;


按照進程的運行位置:

前臺進程:

在進程啓動之後,進程一直佔用標準輸出或者標準輸入或者同時佔用標準輸出和標準輸入;

後臺進程:

在進程啓動之後,進程不佔用標準輸出和標準輸入;


按照進程對於資源消耗:

CPU-Bond:非交互式的進程;

IO-Bond:編輯器等各種交互式進程;



  Linux系統上進程管理的相關命令:

    1,pstree,顧名思義,就是將子父進程以樹的方式顯式出來

    2,ps,報告一個當前進程的快照,其後接的選項有三種風格,UNIX,BSD,和GNU,以下是各選項的意義:

       

     BSD風格的選項:

a:顯示所有與終端相關的進程;

x;顯示所有與終端無關的進程;

u:顯示發起進程的用戶的賬戶名稱;


常用的選項組合之一:aux


ps aux命令顯示的結果中各字段的含義:

USER:進程的所有者

PID:進程標識符

%CPU:進程佔用的CPU處理時間的百分比;

%MEM:進程佔用的物理內存的百分比;

VSZ:虛擬內存集(可交換內存集)

RSS:常駐內存集

TTY:進程與哪個終端相關;?表示與終端無關;

STAT:

R:running,正在運行的進程;

S:interuptible sleeping,可中斷的睡眠狀態;

D:uninteruptible sleeping,不可中斷的睡眠狀態;Disk Block;

T:Trace/STOPPED,被跟蹤/已停止;

Z:Zombie,僵死態;

+:前臺進程

l:包含多線程的進程

<:高優先級進程

N:低優先級進程

s:session leader,有子進程的父進程;

START:進程開始執行的時候時間戳

TIME:進程累計的CPU佔用時間;

COMMAND:啓動進程的命令行參數;


UNIX風格的選項:

-e:顯示所有進程

-f:顯示完整格式的進程信息

-F:顯示完整格式的進程信息,與-f幾乎相同;


常用的選項組合之二:-ef

PPID:父進程PID

C:表示進程佔用的CPU時間的百分比


常用的選項組合之三:-eF

SZ:虛擬內存集

RSS:常駐內存集

PSR:表示此進程在哪個CPU核心上運行;


-H:以層級機構顯示進程的父子關係;

常用的選項組合之四:-eFH


o|-o field1,field2,...:以自定義字段的方式顯示進程相關信息;

field:pid, ppid, ni, rtprio, psr, pcpu, stat, comm, user, tty, vsz, rss,...


常用的選項組合之五:-eo | axo field1,field2,...


  3,pgrep,pkill,根據進程名稱或其他屬性查看進行或向進程發送信號;

    

        pgrep [options] pattern

pkill [options] pattern


常用選項:

-u uid:顯示進程的有效用戶

-U uid:顯示進程的真實用戶

-t TERM:顯示與指定的終端相關的進程

-l:顯示進程名稱

-a:顯示進程的完整的命令行參數

  4,pidof,示指定進程名稱對應的進程ID

  5,top:

    

  剩下的命令待續!

   

       


   

  



  

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