本章學習內容
——進程概念
——進程創建、切換和撤銷
——進程調度
——進程分類
——進程狀態
——進程管理工具
引言
在linux系統中,內核的功用有:進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能等,在這眾多的模塊中,進程管理是相對重要的一環,即使不像文件系統和網絡功能那么復雜。在進程管理中,內核對進程的創建、切換、撤銷和調度都有很詳細的定義。
1、進程及相關概念
<1>進程:進程可以理解為程序執行的一個有生命周期的實例,有唯一的PID來標識,它包括可執行程序以及與其相關的系統資源,比如打開的文件、掛起的信號、內核內部數據、處理器狀態、內存地址空間及包含全局變量的數據段等。從內核的角度看,進程也可以稱為任務。
<2>進程描述符:與進程相關的事情非常多,比如進程的PID、狀態、進程的優先級、進程的地址空間、允許該進程訪問的文件等等,Linux內核為此專門設計了一個類型為task_struct的結構體,稱之為進程描述符。進程描述符中包含了內核管理進程的所有信息,可以說,只要得到一個進程的進程描述符,就可以知道一個進程的所有信息。
2、進程的創建、切換和撤銷
<1>進程創建:在系統啟動時,會先在CPU上加載內核,之后內核創建第一個進程init(centos7上是systemd),init通過系統調fork()創建各種各樣的子進程,各進程之間遵循Cow機制(即修改數據才分配內存)。
<2>進程切換:進程切換又稱為任務切換、上下文切換。它是這樣一種行為,為了控制進程的執行,內核掛起當前在CPU上運行的進程,并恢復以前掛起的某個進程的執行。
<3>撤銷進程:進程終止后,需要通知內核以便內核釋放進程所擁有的資源,包括內存、打開文件以及其他資源,如信號量
3、進程調度
<1>調度策略:調度策略就是這樣一組規則:決定什么時候以怎樣的方式選擇一個新進程運行。所以定義一個進程的優先級來滿足這樣一種策略。這個策略以0-139的優先級來表示。
實時優先級:1-99
無需調整,數字越大,優先級越高
靜態優先級:100-139
可調整,數字越小,優先級越高
優先級以Nice值調整
Nice:-20—-19 ,存在于task_struct結構體中
公式如下:
pri(new)=nice+pri(old)
<2>調度算法:早起的Linux中,調度算法是根據進程的優先級選擇“最佳”進程來執行,它的缺點是時間開銷與“可運行進程數量”有關。某種調度算法一定滿足一種函數關系,業界稱為Big O
Big O:時間復雜度,用時和規模的關系。有:
O(1), O(logn), O(n)線性, O(n^2)拋物線, O(2^n)
4、進程類型
<1>進程的分類標準一:
守護進程: 監控非獨立服務的進程
普通進程:只負責自己本身服務的提供
注意:兩者可相互轉化
<2>進程的分類標準二:
CPU-Bound:CPU密集型,非交互(圖形)
IO-Bound:IO密集型,交互(操作)
5、進程狀態
在內存中運行的進程也有著各種各樣的狀態
運行態R:running
就緒態:ready
睡眠態
可中斷S:interruptable
不可中斷D:uninterruptable
停止態T:stopped,暫停于內存中,但不會被調度,除非手動啟動
僵死態Z:zombie,結束進程,父進程結束前,子進程不關閉
6、進程作業
進程在運行時,我們可以稱其為作業,根據其運行的環境,可分為前臺作業和后臺作業
注:ctrl+z、ctrl+c只對前臺運行的進程有效,jobs查看作業。
后臺運行的程序如果有標注輸出,比如ping,ctrl+z,ctrl+c無法生效。要殺死進程才可以。
也可以使用kill向進程發信號
<1>常用信號:man 7 signal
1) SIGHUP: 無須關閉進程而讓其重讀配置文件
2) SIGINT: 中止正在運行的進程;相當于Ctrl+c
9) SIGKILL: 殺死正在運行的進程
15) SIGTERM:終止正在運行的進程
18) SIGCONT:繼續運行
19) SIGSTOP:后臺休眠
<2>指定信號的方法:
(1) 信號的數字標識;1, 2, 9
(2) 信號完整名稱;SIGHUP
(3) 信號的簡寫名稱;HUP
補充:killall COMMAND:殺死所有COMMAND進程
pkill -u USER:殺死所有以USER身份運行的進程
pkill -u root:危險操作,切勿模仿
既然進程可以運行在后臺,提供一種方法將多個進程同時運行在后臺,增強效率。
(f1.sh&);(f2.sh&);(f3.sh&)
{ f1.sh& f2.sh& f3.sh& }
或者寫在一個腳本中。
vi all.sh
f1.sh&
f2.sh&
f3.sh&
7、進程管理工具
<1>ps axu
USER | 運行進程的用戶 |
PID | 進程ID |
%CPU | 占用CPU |
%MEM | 占用內存 |
VSZ | 虛擬內存集 |
RSS | 實際內存集 |
TTY | 終端信息 |
STAT | 進程狀態 |
START | 進程狀態 |
TIME | 運行時間 |
COMMAND | 進程名稱 |
也可以通過特定的選項來顯示信息
ps -axo pid、comm、%cpu、%mem、state、tty、euser、ruser
以上也證明了passwd適用于suid權限的,雖然運行用戶是user,但其真正有效的是root
<2>uptime
開機時間
運行時間
登陸用戶數目
平均負載:指在特定時間間隔內運行隊列中的平均進程數
第一分鐘負載
第五分鐘負載
第十分鐘負載
注意:1、5、10分鐘的平均負載,一般不會超過1
參考值:如果每個CPU內核的當前活動進程數不大于3的話,那么系統的性能良好。如果每個CPU內核的任務數大于5,那么這臺機器的性能有嚴重問題。
如果linux主機是1個雙核CPU的話,當Load Average為6的時候說明機器已經被充分使用。
<3>top
Tasks
total | 進程總數 |
running | 運行進程數 |
sleeping | 休眠態進程數 |
stopped | 停止態進程數 |
zobie | 僵死態進程數 |
%Cpu(s)
us(user space) | 用戶空間占用CPU百分比 |
sy(system) | 內核空間占用CPU百分比 注:高負載時:us:sy=7:3 |
ni(nice) | 修改nice值占用的CPU百分比 |
id(idle) | 空閑的CPU百分比 |
wa(wait) | 等待IO完成占用的CPU百分比 |
hi(hardware interrupt) | 硬中斷占用CPU百分比 |
si(software interrupt) | 軟中斷占用CPU百分比 |
st(stole) | 被偷走的CPU,比如VMware |
buffer(緩沖) | 元數據 |
cache(緩存) | 數據 |
PID | 進程號 |
USER | 進程發起者 |
PR(priority) | 優先級 |
NI(Nice) | nice值 |
VIRT | 虛擬內存集 |
RES | 常駐內存集 |
SHR | 共享內存集 |
S(status) | 狀態 |
%CPU | CPU占用比 |
%MEM | 內存占用比 |
TIME+ | 運行時長 |
COMMAND | 啟動進程 |
對顯示排序的方法:
P | 占據的CPU百分比 |
M | 占據內存百分比 |
T | 累積占據CPU時長 |
首部信息顯示:
l | uptime信息 |
t | tasks及cpu信息 |
#數字 | cpu分別顯示 |
m | memory信息 |
s | 修改刷新時間間隔 |
Esc | 退出 |
k | 終止指定進程 |
W | 保存文件 |
q | 退出命令 |
注:
直接查看進程編號 pidof COMMAND 或者 ps aux | grep **—–>kill
<4>htop
比top更加高級的進程管理軟件
f1幫助
f2切換CPU、mem、swap顯示方式
f10退出
選中進程執行k
<5>vmstat:查看磁盤吞吐量
vmstat -s: 內存的匯總信息
r | 等待運行的進程的個數,和核心數有關 |
b | 處于不可中斷睡眠態的進程個數(被阻塞的隊列的長度) |
swap:
si | 從磁盤交換進內存的數據速率(kb/s) |
so | 從內存交換至磁盤的數據速率(kb/s) |
io:
bi | 從塊設備讀入數據到內存的速率(kb/s) 讀 |
bo | 從內存寫入磁盤的速率(kb/s) 寫 |
分別使用 dd if=/dev/sda of=/dev/null
dd if=/dev/sda of=/tmp/f1 可做測試
Server端:glances -s -B IP
Client端:glances -c IP <7>dstat
磁盤的讀寫可通過dd if=/dev/sdb of=/dev/zero 測試
網絡監控可通過ping -f IP -s 65507測試。
原創文章,作者:mfwing,如若轉載,請注明出處:http://www.www58058.com/46016
總結的很棒,對進程管理基礎與命令介紹的很詳細哦。贊一個