一:進程的概念
1)進程:process,運行中的程序的一個副本的某部分,之所以說是副本的一部分是因為一個程序可以多個用戶同時以不同格式運行,如兩個用戶都在運行ls,一個運行的是ls -h ,另一個運行的是ls -l,那么這兩個用戶運行的程序代碼肯定是不一樣的而且不是程序的所有代碼;進程有生命周期;
2)進程管理:主要為進程調度;內核為了管理進程需要存儲正在運行中的進程的元數據,存儲在內核的鏈表中,
其固定格式 為tast struct;多個進程的stask struct組成鏈表,task list
3)進程的創建:進程創建:內核初始化完成后創建第一個進程init(也叫初始化進程),init進程創建完成意味著用戶空間和內核空間也就創建好了,后續用戶空間進程的所有管理工作就都由init來完成,但是init不能代替內核執行特權指令;當需要創建一個進程時它就照著自己的樣子創建一個子進程或者它的子進程照著子進程自己的樣子創建一個子進程,這樣“子又生孫,孫又生子”創建進程;進程有父子關系,進程都由其父進程fork()并clone()自身而來,當父進程要創建子進程時就向核發起fork()系統調用,并把自身的數據clone()給子進程;
4)進程銷毀:父進程創建子進程只是為了讓子進程在某一時刻幫助它完成某些任務,當子進程執行完任務并把執行結果返回給父進程后,子進程的使命就結束了,此時父進程還要負責銷毀子進程;
5)進程優先級:由于事件的緊急程度不同,進程是有優先級的;優先級有nice值;內核將待運行的
的進程根據優先級分為140個隊列,然后每次挑選優先級最高的隊列的首個進程運行;
優先級從0-139,
0一般很少用,在內核啟動init之前會啟動0號進程,一旦init啟動起來后0號進程就被終止了;
1-99:實時優先級;數字越大優先級越高,很少需要手動調整;
100-139:靜態優先級;數字越小優先級越高,用戶可調度的優先級;
nice值:nice值從-20到19對應靜態優先級100到139;用戶可以通過調整nice值來調整靜態優先級;普通用戶只能調高nice值來調低優先級,但是管理員通過調整nice既可以調低優先級也可以調高優先級;
6)進程的內存:為了完成現代操作系統多任務的管理內核把除了自身占用的內存外的剩余內存分為多個片段,一個片段大概4K大小,然后把這些片段分配給多個進程使用;每個進程分配到的片段實際上不一定都是連續的內存,但是內核通過一個中間層把這些不連續的片段虛擬成連續的內存再分配給進程,讓每個進程以為自己都是在一段連續的內存上運行的;而且內核會讓每個進程以為在內存上運行的只有內核和它自己以及它可以用的內存為除了內核自身占用的內存外的剩余內存,這就叫線性管理機制,進程以為可以用的內存即為進程的線性地址空間,進程實際使用的內存即為進程的物理地址空間,線性地址空間和物理地址空間有可能是離散對應的;每個進程把線性地址空間的低地址空間用于存放程序代碼,再向上是初始化的變量和未被初始化的變量(在C語言中這些變量被自動賦值為0),再向上的一段離散空間是堆內存(用于存放數據),另一頭高地址空間是棧內存(用于存放數據),隨著進程的運行堆內存和棧內存是會不斷朝著彼此的方向變大的直到兩者碰頭占滿內存,此時內存空間就會出現不夠用的情況;當內存不夠用時內核就會根據LRU(最近最少使用算法)把某個時間段不運行部分進程的數據而非代碼調到交換分區,當這些進程又需要運行時再把它們調回去;
Page Frame: 一個頁框,也即一個片段,用于存儲頁面數據;
MMU:memory management unit,內存管理單元
7)進程間通信機制:IPC,Inter Process Communication,
同一主機上進程間通信機制:
signal:常見的
shm: shared memory
semerphor
不同主機上進程間通信機制:
rpc: remote procecure call,遠程過程調用,基于socket的更高級機制;
socket:任何兩個進程間通信前都要各自打開一個socket的文件,一方不斷的往文件中寫數據,然后通過TCP連接傳輸到另一方的socket文件中,另一方不斷的從文件中讀數據,從而實現通信;通信結束后雙方都要關閉socket文件;
8)搶占式多任務:Linux內核的多任務工作模式,任何一個進程當它要啟動時發現別的進程在運行而自己的優先級更高,該進程不是上來直接搶占當前進程的運行時間而是內核會指定可搶占的時間點,到達搶占時間點時高優先級進程才可以搶占優先級的運行時間;
9)進程的類型:
守護進程: 在系統引導過程中啟動的進程,跟終端無關的進程;
前臺進程:也叫用戶進程或交互式進程;通過終端啟動的進程,跟終端相關的進程;
注意:也可把在前臺啟動的進程送往后臺,以守護模式運行;
10)進程狀態:
運行態:running,內存有數據且被cpu調度運行的
就緒態:ready,內存有數據但未被cpu調度運行的;就緒態也叫睡眠態;
睡眠態:
淺度睡眠態:interruptable,也叫可中斷睡眠態,因進程時間片耗盡而進入睡眠態;
深度睡眠態:uninterruptable,也叫不可中斷睡眠態,因進程需要通過磁盤I/O加載數據而進入睡眠態;此處的磁盤I/O分為兩段,第一段從磁盤加載數據到內核內存,第二段從內核內存復制到進程內存;
暫停態:stopped,暫停于內存中,但不會被調度,除非手動啟動之;
僵死態:zombie,也叫退出態,形象的說就是一個進程使命結束自殺后至父進程來收尸之間的狀態;
11)進程分類:
CPU-Bound:cpu密集型進程,非交互式進程多是cpu密集型進程;
IO-Bound:IO密集型進程,交互式進程多是IO密集型進程;
二 進程常見的基本命令
1)pstree命令
作用:display a tree of processes;
注意:CentOS 5和6看到的頂級進程為init,而CentOS 7看到的頂級進程為systemd
2)ps命令
作用:ps – report a snapshot of the current processes.即查看在ps命令執行這一刻所有進程的狀態;
/proc/:內核參數(即內核所管理的進程的狀態信息)存放位置;內核參數也被模擬成文件,非參數本身被模擬成目錄,參數本身被模擬成文件;每個進程在/proc/目錄下都有一個進程號命名的目錄/proc/PID,該目錄中存放了當前進程的各種狀態信息
啟動進程的方式:
系統啟動過程中自動啟動:與終端無關的進程;
用戶通過終端啟動:與終端相關的進程;
ps選項有三種風格:
UNIX:選項前必須由“-”引導;
BSD:選項前必須不由“-”引導;
GNU:選項前必須由“–”引導;
用法:ps [options]
options:
a:所有與終端相關的進程;
x:所有與終端無關的進程;
u:以用戶為中心組織進程狀態信息顯示;
aux:常用組合之一;顯示結果中相關字段的含義,如下;
VSZ:虛擬內存集,即進程占用的虛擬內存(即線性地址空間)大小;因為多個進程會共享庫,因此進程占用的線性地址空間和物理地址空間大小不一定一致,一般前者大于后者;
RSS:常駐內存集;即進程中關鍵的、不能調到交換分區上的數據占用的內存集
STAT:基于BSD風格進行描述的
R:running,運行態
S:interruptable sleeping,可中斷睡眠
D:uninterruptable sleeping,不可中斷睡眠
T:stopped,暫停態
Z:zombie,僵死態
+:前臺進程
l:多線程進程
N:低優先級進程
<:高優先級進程
s:session leader ,會話主導者,例如shell進程會啟動諸多子進程,此時shell進程就是會話主導者,shell進程掛了之后其子進程也隨之不復存在;
-e:顯示所有進程,相當于ax
-f:顯示完整格式的進程信息
-ef:常用組合之二;
PPID:父進程的進程號
C:cpu占用百分比
STIME:啟動的時間
TTY:與哪個終端相關;
-F:顯示更詳細的完整格式的進程信息;
PSR:運行于哪顆CPU之上,從0開始編號;
-H:以層級結構顯示進程的相關信息;
-eFH:常用組合之三;
-eo,axo:常用組合之四;o一定要寫在后面,因為它是要帶參數的;
o field1, field2,…:自定義要顯示的字段列表,以逗號分隔;
常用的field:pid, ni, priority(不可簡寫為pri), psr, pcpu, stat, comm, tty, ppid, rtprio
ni:nice值;
priority:優先級;
pcpu:cpu利用率
rtprio:real time priority,實時優先級;
3)pgrep和pkill命令
作用:look up or signal processes based on name and other attributes
,過濾和關閉進程
用法:pgrep [options] [pattern];pkill命令使用與pgrep類似;
選項:
-u uid:effective user,即以哪兒用戶的身份運行的
-U uid:read user,即以哪個用戶的身份啟動的
-t TERMINAL:與指定的終端相關的進程;
-l:顯示進程名;
-a:顯示完整格式的進程名,即顯示進程名和它啟動時的參數;
-P pid:顯示此進程的子進程的進程號,不包括其子進程的子進程;
4)pidof命令
作用:根據進程名取其pid;有的進程可能不只一個;
5)top命令
作用:display Linux processes,即動態的不斷刷新的逆序的查看當前系統上所有進程的狀態信息,類似于Windows中的任務管理器;top命令有很多交互式內建命令;
選項:
-d #:指定刷新時間間隔,默認為3秒;
-b:以批次方式顯示;
-n #:顯示多少批次;
內建命令:
排序:
P命令:以占據CPU百分比排序;默認
M命令:以占據內存百分比排序;
T命令:累積占用CPU時間排序;
首部信息:
第一行:uptime信息,鍵入l(L的小寫)命令可關閉,再鍵入l(L的小寫)命令可開啟;
第二、三行:tasks及cpu信息,鍵入t命令可關閉,再鍵入t命令可開啟; 鍵入1(數字)命令分散顯示每顆cpu的使用比率, 再鍵入1(數字)命令匯總顯示cpu的使用比率;
第四、五行:內存和交換內存信息,鍵入m命令可關閉,再鍵入m命令可開啟;
退出命令:q或Ctrl+c
修改刷新時間間隔:s
終止指定的進程:k
11:25:55-當前時間,3:26-總運行時長,31users-登錄到當前系統的總用戶數,load average:0.00 0.01 0.05-平均負載:過去1分鐘、5分鐘、15分鐘的平均等待運行的隊列長度,通常隊列長度的總數量不能大于cpu的數量;
us-用戶空間的進程占用cpu的百分比,sy-內核空間的內核占用的cpu的百分比,us和sy的比率一般7:3比較合理;ni-調整完nice值以后額外多占用的cpu百分比,id-idle,cpu空閑百分比,wa-等待I/O完成占用的cpu百分比,hi-處理硬件中斷占用的cpu百分比,si-處理軟件中斷占用的cpu百分比,st-被虛擬化程序偷走的cpu百分比;
buff/cache-緩沖和緩存占用的內存,但是這些內存是可以回收的,不算真正占用;
PID-進程id,USER-啟動進程的用戶,PR-進程優先級,NI-進程nice值,VIRT-進程虛擬內存集,RES-進程常駐內存集,SHR-進程共享內存空間,S-進程狀態,%CPU-占用cpu百分比,%MEM-占用內存百分比,TIME+-累積時長,COMMAND-進程啟動命令;在該頁面鍵入大寫P、M或T可調整排序關鍵字;
6)update命令
作用:顯示系統時間、運行時長及平均負載
7)vmstat命令
作用:report virtual memory statistics
用法:vmstat [options] [delay [count]]
選項:
-s:顯示內存統計數據;
備注:上圖參數詳解,如下:
procs:進程
r:等待運行的進程的個數,即CPU上等待運行的任務的隊列長度;
b:處于不可中斷睡眠態的進程個數,即被阻塞的任務隊列的長度;
memory:內存
swpd:交換內存使用總量;對于服務器而言能不用交換內存就不要用,因為交換內存性能跟內存的性能差的太多了;
free:空閑的物理內存總量;
buffer:用于buffer的內存總量;
cache:用于cache的內存總量;
swap:交換內存,如果si和so活動頻繁就說明物理內存不足;
si:換進,即數據進入swap的數據速率(kb/s)
so:換出,即數據離開swap的數據速率 (kb/s)
io:
bi:從塊設備讀入數據到系統的速率(kb/s)
bo:從系統保存數據至塊設備的速率(kb/s)
system:
in:interrupts,中斷速率;一般網絡服務器的中斷速率很頻繁,網絡數據到達、磁盤IO(硬中斷)、用戶模式轉為內核模式(軟中斷)等等都會導致中斷發生
cs:context switch, 上下文切換(也叫任務切換或進程切換)的速率;
cpu :
us:用戶空間的進程占用cpu的百分比;
sy:內核空間的內核占用的cpu的百分比,us和sy的比率一般7:3比較合理;
id:idle,cpu空閑百分比;
wa:等待I/O完成占用的cpu百分比;
st:被虛擬化程序偷走的cpu百分比;
8)kill命令
作用:terminate a process,實際是用于向進程發送信號,以實現對進程的管理;一般只有管理員能kill任何進程;
用法:
顯示當前系統可用信號:kill -l [signal]
向進程發信號: kill [-s signal|-SIGNAL] pid…
每個信號的標識方法有三種:
信號的數字標識;例如,1;
信號的完整名稱;例如,SIGHUP;
信號的簡寫名稱;例如,HUP
常用信號:
1)SIGHUP:無須關閉進程而讓其重讀配置文件,但是是向啟動用戶為root的主進程發送該信號才能生效;
2)SIGINT:終止正在運行的進程,相當于Ctrl+c
9)SIGKILL:殺死運行中的進程,殘忍殺死進程,會有損壞未正常關閉的文件等等各種問題,不建議使用;
15)SIGTERM:終止運行中的進程,人道殺死進程;默認信號;
18)SIGCONT:將f 19)SIGSTOP:將進程送往后臺并停止進程;
9)killall命令
作用:kill processes by name,根據進程名殺死與進程名相關的所有進程;
用法:killall [-SIGNAL] program;因為殺死信號時默認信號,因此該信號可??;
原創文章,作者:xiangx,如若轉載,請注明出處:http://www.www58058.com/71707
總結的很細致啊,贊