Linux進程管理原理
Linux的進程管理,就是對硬件各資源進行分配、調度、銷毀等工作,其主要部件的管理為:CPU、內存、IO的分配和調度工作。其CPU的指令執行又分為特權指令、普通指令級別,而在linux系統層面將其對應為內核空間、用戶空間。系統運行之上的程序通常只能執行普通指令,如果需要管理硬件,與硬件相關的讀、寫、刪除操作(即面向硬件層面的請求),需要向init進程提交請求,再由Init進程發送給內核,由內核調用CPU完成其指令,這個過程被稱作為系統調用,也被稱為軟中斷。而系統調用在用戶空間的表現形式為各種函數,即程序內部代碼調用了其對應的函數模塊。從用戶模式切換到內核模式,或者從內核模式到用戶模式,這個過程就稱之為模式切換。當發起一個系統調用,通常被稱之為一個軟中斷
. 當IO或者其他的硬件完成操作,需要將其結果發送給CPU處理時,CPU此時將暫停其他工作,接手其IO的中斷請求,這過程被稱之為硬中斷
.
CPU是將其計算能力劃分為以時間為單位的時間片,再將時間片發配給進程使用,以此來完成程序的響應。由于各進程會搶用時間片,以造成其他進程不能正常工作的情況,此時將由內核管理進程的運行狀態、優先級、進程的生命周期等工作,此過程被稱之為進程調度
。當計算機只有一顆物理CPU時,意味著正在運行的情況只能有一個,多任務處理的情況會面臨搶占資源。故需要將多個等待處理的進程狀態保存至內存中,Linux內核存儲進程的結構體被稱之為task struct
,每個task struct都保存了其進程名,存儲位置,進程的優先級等信息,多任務的task struct存儲被稱之為鏈表結構(task list),即內核把物理內存分成大小為4k的頁框,再將頁框分配給進程的虛擬內存(vritual size,虛擬內存集)
,讓每個進程都工作在虛擬內存集中,從虛擬層面感知自己可用空間為系統的剩余空間。當系統啟用時會加載很多的基本庫glic或者其他的程序所共同依賴的庫文件,都會一次性加載到內存中,這部分被稱之為共享內存集(shared size)
,如果每個內存將使用共享內存中的庫文件,會在自己的虛擬內存中添加其所需的文件內存地址指針
.而不是把所需要的文件都加載到其進程空間中。
共享內存集又被分為常駐內存和不常駐內存,常駐內存一般是系統調用所需要的庫文件,故是不能被交換到交換分區的。當內存負荷比較大的情況下,內核會通過LRU
算法將不常用的內存空間交換到交換分區,如果需要重新使用此進程時,內核又會將其調入到內存中加載被使用。
內存管理中,每個進程又被分優先級。內核將進程劃分為280個隊列,其中140個隊列存放過期隊列(被調度過的進程),140個隊列存放運行的進程,當下次調用進程的時候,只需要掃描140個運行的進程隊列首部即可,以此完成快速調用。其每個隊列有其對應的優先級,表示范圍為『0-139』。「0-99」是實時優先級,數值越大,優先級越大。「100-139」是靜態優先級,其中可通過管理命令調整,使用nice值表示為-20,19,并對應100-139的優先級。其nice值越小表示優先級越高。越高優先級的進程會被優先調用執行。當一個進程正在運行時,此時一個高的優先級進程需要先執行,CPU將暫停正在運行的進程,將CPU的運行狀態保存至寄存器,這個過程稱之為保存現場。這種進程與進程之間的切換,也被稱之為上下文切換。
內存存放數據格式
- 堆(heap)
- 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收
- 棧(stack)
- 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等
- 代碼段
- 數據段
進程間通信機制IPC (inter process communication):
- socket
- D-bus(用于桌面程序和OS通信)
- Dcop(輕量級的,功能較少,一般用于K桌面環境)
- SOAP(用于web服務,使用http其傳輸協議)
- XML-RPC(用于web服務,使用http其傳輸協議)
- CORBA(面積對象編程中復雜的IPC解決方案)
進程的類型
- 守護進程:daemon(服務類),在系統引導過程中啟動的進程,跟終端無關
- 前臺進程:跟終端相關,通過終端啟動的進程
進程的狀態及其就對的代碼
- 運行態:running,正在運行的
-
R
:running
-
- 就緒態:ready,等待運行的
- 睡眠態:
- 可中斷的睡眠:interruptable
-
S
: interruptable-sleeping
-
- 不可中斷的睡眠 :uninterruptable(其有IO等待)
-
D
:uninterruptable-sleeping
-
- 可中斷的睡眠:interruptable
- 停止態:stopped,暫停于內存中,但不會被調度執行,除非手動啟動
-
T
: stopped
-
- 僵死態:zombile,僵尸進程
-
Z
: 僵死態
-
進程標識符代碼:
-
+
: 前臺進程,運行在終端之上,需占用prompt -
l
: 多線程進程 -
N
: 低優先級 -
<
: 高優先級 -
s
: session leader, 可以理解為會話的父進程
查看內核中進程的相關信息
- /proc/PID
- /proc/PID/maps : 進程存放內存映射的位置
進程IO調用的過程:
- 先將數據由內核加載到內核空間,
- 再將內核空間的數據復制一份到進程空間
Centos各版本的守護進程
- Centos 5
- Sys init --> 依賴腳本串行啟動,比較慢
- Centos 6
- Sys init --> upstart啟動程序,依賴于ubus機制通信,并行啟動各進程
- Centos 7
- Systemd --> systemd啟動程序,只需要一個init進程,就可以把各服務啟動起來,啟動速度快
=========
Linux下進程管理各工具
ps命令
工作原理:
- 通過/proc輸出狀態信息。/proc/PID的目錄下,存放了當前進程的各種信息
ps命令
ps
- ps - report a snapshot of the current processes.
- synopsis: ps [options]
- [options]
- 其有三種風格使用方法:
- [options]
1 UNIX options, which may be grouped and must be preceded by a dash.
2 BSD options, which may be grouped and must not be used with a dash.
3 GNU long options, which are preceded by two dashes.
* `a` : 所有與終端相關的進程
* `x` : 所有與終端無關的進程
* `u` : 以用戶為中心來組織狀態信息顯示,其是以PID進行排序
* `-e` : 顯示所有進程
* `-f` : 顯示完整格式的進程信息
* `-F` : 顯示完整格式
* `-H` : 以層級結構顯示進程的相關信息
* `o` : 自定義要顯示的字段列表,以逗號分隔
* ps axo pid,cmommand
常用組合:
-
ps aux
[root@zhenping 1]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.7 59632 7676 ? Ss 21:06 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 24
-
ps -ef
[root@zhenping 1]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 21:06 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 24
-
ps -eFH
root@zhenping 1]# ps -eFH UID PID PPID C SZ RSS PSR STIME TTY TIME CMD root 2 0 0 0 0 0 21:06 ? 00:00:00 [kthreadd]
-
ps -eo
[root@zhenping 1]# ps -eo pid,command,user PID COMMAND USER
-
ps axo
root@zhenping 1]# ps axo pid,command,user,nice PID COMMAND USER NI
ps中常用的命令字段
- pid
- nice
- pri:優先級
- psr:進程當前分配的處理器
- pcup:占用CPU百分比
- stat:進程狀態
- command:運行的程序
- tty:終端
- ppid:父進程
- rtprio :realtime priority,實時優先級
ps命令顯示中的字段名稱含義
- %CPU : 占用CPU的百分比
- %MEM : 占用內存的百分比
- VSZ : virtual size,虛擬內存集(線性內存空間存數據占用的大小)
- RSS : resident size,常駐內存集,不能放到交換內存上,有的時候也會顯示為RSZ(rsszie.resident set size)
- STAT : 進程的運行狀態
- time : 進程占用CPU的累計時間
- USER : 用戶
pgrep命令
功能
- 進程過濾,以實現快遞查找進程
pgrep
- pgrep, pkill - look up or signal processes based on name and other attributes
synopsis: pgrep [options] pattern
-
[options]
-u UID
: 顯示指定用戶的進程-U UID
: read user,由誰啟動的進程-t Terminal
: 與指定的終端相關的進程-l
: 顯示進程名-a
: 顯示完整格式的進程名,進程名和啟動的參數-
-p PIDNUM
: 顯示此進程的子進程pgerp ssh : 查看進程中有ssh的字符串的進程 pgrep sshd | xargs -i kill -9 {} #將所有sshd進程退出 pgrep sshd | xargs kill -9 #同上
pkill命令
- 用法與pgerp相同
pidof命令
-
取指定進程的進程號
pidof sshd # 顯示sshd的進程號 2215 1041
top命令
top - display Linux processes
top中顯示名稱含義解釋
-
第一行(uptime信息,可以使用
l
命令關閉或顯示)系統的當前時間、運行時長、登錄用戶、平均負載(過去1分鐘、5分鐘、15分鐘的平均負載,指每邏輯CPU進程隊列長度)
第二行(進程任務)
-
第三行 : (CPU使用情況,可以使用
t
命令關閉或顯示)-
us
: 用戶空間 -
sy
: 內核空間(一般負載的CPU,us與sy所點的比例為7:3
) -
ni
: nice -
id
: 空閑百分比 -
wa
: 等待IO完成的時間 -
hi
: 硬件中斷消耗CPU百分比 -
si
: 軟件中斷消耗CPU百分比 -
st
: 被偷走的百分比,一般指虛擬機 -
cs
: 上下文切換
-
-
第四行(內存使用信息,可以使用
m
命令關閉或顯示)- 總空間
- 空閑空間
- 已使用空間
- 緩沖和緩存的空間(可以被回收再使用,不逄真的占用)
- 真正的系統空間應為:free + buff/cache
-
常用字段說明
VIRT : 虛擬內存集
RES : 常駐內存集
SHR : 共享內存集
-
常用命令
M
: 以內存占用率排序P
: 以CPU占用率排序T
: 以累計占用CPU時間排序q
: 退出top工具k
: 終端指定的進程s
: 更改top的刷新時間,默認為3秒u
: 只顯示指定用戶的進程-
top啟動參數
-d #
: 啟動時指定刷新時間間隔,默認為3秒-b
: 以批次方式顯示-n #
: 顯示多少批次
htop命令
-
[options]
-
-d #
: 指定刷新時間的時間間隔 -
-u USERNAME
:僅顯示指定用戶的進程 -
-s COLUME
: 以指定字段進程排序
-
-
內置命令
-
s
: 顯示進程的系統調用 -
l
: 顯示選定的進程打開的文件列表 -
t
: 以層級關系顯示各進程的狀態 -
a
: 選定進程綁定在指定的CPU上
-
=========
Linux性能查看工具
vmstat命令
vmstat - Report virtual memory statistics
-
synopsis: vmstat [options] [delay [count]]
vmstat 2 : 每兩秒鐘顯示一次 vmstat 2 3 : 每兩秒鐘顯示一次,顯示3次
-
[options]
-
-s
: 顯示內存各種統計數據
-
各種選項字段說明
-
procs
-
r
: 處于等待運行的進程個數,即每CPU上等待運行的任務長度,實時的,不是其平均值 -
b
: 阻塞的任務隊列長度,處于不可中斷睡眠態的進程個數,如果這個值太大,說明IO太大
-
-
memory
-
swpd
: 交換內存的使用問題,0表示沒有啟動交換內存,如果使用量太大,說明服務器內存太小了 -
free
: 空閑的物理內存總量 -
buff
: 用于buffer的內存總量 -
cache
: 用于cache的內存總量
-
-
swap
-
si
: 平均值,數據進入swap中的數據速率(kb/s) -
so
: 平均值,數據離開swap中的數據速率(kb/s)- 注意:si so的活動頻繁,速率大,交換內存也使用了,并且有增大的趨勢,說明物理機的內存太小了
-
-
io
-
bi
: 從塊設備讀入數據到內存的速率(kb/s) -
bo
: 從內存到塊設備的速率(kb/s)
-
-
system
-
in
: interrups(中斷),中斷速率,數值太大了,說明CPU太弱 -
cs
: context switch ,上下文切換速率,數值太大了,說明CPU太弱
-
-
CPU
-
us
:用戶空間占用的百分比 -
sy
:內核空間 -
id
: idle,空閑的 -
wa
: wait,等待IO完成的 -
st
: stolen,被偷走的時間
-
dstat命令:
dstat - versatile tool for generating system resource statistics
-
dstat [-afv] [options..] [delay [count]]
- [options]
-
-c
: 查看CPU -
-C #,#..,total
:查看指定CPU或總的CPU -
-d
:disk的相關信息 -
-D sda,sdb….total
:磁盤信息 -
-g
: 顯示Page相關的統計數率數據 -
-i
: 中斷 -
-m
: mem -
-n
;interface的相關統計數據 -
-p
: process的相關統計數據 -
-r
: IO請求相關統計數據 -
-s
: swapped相關統計數據 -
-t
: 輸出當前時間 -
—-aio
: 異步同步信息 —-rpc
-
—-lock
: 文件鎖的信息 -
—-raw
: 祼套接字的信息 -
-—tcp
:查看tcp連接信息 -
-—udp
: —-raw
—-socket
—-ipc
-
—-top-io
: 顯示最占用io的進程 -
—-top-cpu
: 最占用cpu的進程 -
—-top-int
:最大中斷的進程 -
—-top-mem
:最占用內存的進程 -
—-top-latency
: 延遲最大的進程
-
- [options]
iostat
iostat - Report Central Processing Unit (CPU) statistics and input/output statistics for devices and partitions
- [options]
-d : 顯示磁盤設備
-k : 以block為單位顯示的列強制使用K為單位
-
-x : 顯示其擴展信息
iostat -x 1 10 : 顯示擴展信息,以1秒刷新間隔,顯示10次 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.06 0.05 1.07 0.28 12.36 5.81 26.90 0.00 0.91 0.70 1.71 0.74 0.10 說明: rsec/s:每秒讀取的扇區數; wsec/:每秒寫入的扇區數。 avgqu-sz 是平均請求隊列的長度。毫無疑問,隊列長度越短越好 await: 每一個IO請求的處理的平均時間(單位是微秒毫秒)。這里可以理解為IO的響應時間,一般地 系統IO響應時間應該低于5ms,如果大于10ms就比較大了。這個時間包括了隊列時間和服務時 間,也就是說,一般情況下,await大于svctm,它們的差值越小,則說明隊列時間越短,反之 差值越大,隊列時間越長,說明系統出了問題。 svctm 表示平均每次設備I/O操作的服務時間(以毫秒為單位)。如果svctm的值與await很接近,表 示幾乎沒有I/O等待,磁盤性能很好,如果await的值遠高于svctm的值,則表示I/O隊列等待太 長,系統上運行的應用程序將變慢。 %util: 在統計時間內所有處理IO時間,除以總共統計時間。例如,如果統計間隔1秒,該設備有0.8秒在 處理IO,而0.2秒閑置,那么該設備的%util = 0.8/1 = 80%,所以該參數暗示了設備的繁忙 程度。一般地,如果該參數是100%表示設備已經接近滿負荷運行了(當然如果是多磁盤,即 使%util是100%,因為磁盤的并發能力,所以磁盤使用未必就到了瓶頸)。
pmap命令
功能:
- 查看進程內存映射表
synopsis: pmap [option] PID [...]
- [option]
-
-x
: 顯示詳細格式的信息pmap -x 1 #顯示Pid為1的內存映射表詳細信息 pma 1 #顯示PID為1的內存映射表信息
-
注意:可以 cat /proc/1/maps,也可以查看進程的內存使用情況
glances 命令
- 跨平臺的監控工具,其監控計算機的性能信息,可以理解為遠程版本的top工具
內建命令
b
: 以Byte為單位顯示網卡數據速率d
: 關閉磁盤IO模塊m
: 關閉mount模塊n
: 關閉network模塊t #
: 刷新時間間隔1
: 每個CPU的統計數據單獨顯示-o {html | csv}
: 以指定格式輸出-
-f /path/DIR
: 設定輸出文件的位置glances -o HTML -f /root/ : 指定以html格式輸出到root目錄下
glances的C/S模式
-
服務端:
glances -s -B IPADDR # ipaddr指本機的某地址,用于監聽,-s表示為服務端,-B表示指定哪個IP地址
-
客戶端:
glances -c IPADDR # -c表示為一個client,IPADDR為服務端的IP地址
kill命令
kill - kill - terminate a process
-
synosis: kill -l
- 信號標識方法有三種:
- 信號的數字標識
- 信號的完整名稱
- 信號的簡寫名稱
- 信號標識方法有三種:
-
synopsis: kill [-s signal|-p] [-q sigval] [-a] [--] pid...
常用信號
- SIGHUP:無須關閉進程而讓其重新讀取配置文件
- SIGINT: interrupts之義,終止正在運行的進程
9)SIGKILL : 殺死運行中的進程(直接退出)
15)SIGTERM : 終止正在運行的進程(讓其保存好數據再退出)
18)SIGCONT : 繼續
-
19)SIGTOP : 停止
kill -1 2219 # 讓此進程重讀配置文件 kill -sigkill 2219
調整進程優先級
- 可通過nice命令調整進程的優先級,優先級的范圍為100-139,分別對應 -20,19的閥值,進程啟動時nice值為0,其對應的優先級為120,nice數值越小優先級越高
nice命令
nice - run a program with modified scheduling priority
nice [option] [COMMAND][ARGU….]
- [options]
-
-n NICE
: 指定nice值nice -n -5 htop #為115優先級啟動htop 注意:nice值只有管理員可調
-
renic命令
renice - alter priority of running processes
renice [-n] NICE PID
- [options]
-
-n NICE
: 指定NICE值renice -n -3 5207 : 調整進程PID為5207的nice值為-3
-
================
Linux上的作業控制
作業的分類
-
前臺作業(foregroud)
- 通過終端啟動,且啟動后會一直占據終端
-
后臺作業(backgroud)
- 可以通過終端啟動,但啟動后立即轉入后臺運行
如果將作業運行于后臺
- ctrl + z
- 此方法會將作業轉為停止狀態
- COMMAND &
- 此類作業立即送到后臺,也會有終端相關,如果終端停止了,作業也會被停止
- nohup COMMAND &
- 此類作業立即送到后臺,脫離終端
顯示當前系統上的所有作業
jobs 命令
root@zhenping ~]# jobs
[1]- 已停止 vim a.sh
[2]+ 已停止 ping 202.96.209.5
將作業從后臺調回到前臺
- fg 命令
- fg [[%]] JOB_NUM]]
%
:表示這是一個作業號-
JOB_NUM : 作業號碼
fg 1 # 把1號作業調回到前臺
- fg [[%]] JOB_NUM]]
將后臺作業從停止狀態變成運行狀態
- bg命令
-
bg [[%]] JOB_NUM]]
[root@zhenping ~]# bg 3 #3號作業從停止轉運行狀態 [3]+ ping 202.69.209.5 &
-
結束作業
- kill命令
-
kill %job_NUM
[root@zhenping ~]# kill %2 #結束2號作業
-