Linux 進程及作業管理
進程簡介:
內核的功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能
進程(Process):什麽是進程,進程是程序的執行實例,即運行中的程序,同時也是程序的一個副本;程序是放置於磁盤的,而運行中的程序是位於內存中的;從內核的觀點看,進程的目的就是擔當分配系統資源(CPU時間、內存等)的基本單位
線程(Thread):一個進程至少包括一個線程,通常將該線程稱為主線程,所以線程是比進程更小的單位,是系統分配處理器時間資源的基本單元。一個進程要想同時在多顆CPU上運行,必須得分成互不影響的多個執行流,而後每組單獨在各自所分配的CPU上運行,這種分化後的執行流且有著比進程更小資源分配單位稱之為線程。線程之間可以共享內存空間,當一個文件需要被打開多次時,線程模型可以節省很大的內存空間,但是得避免因資源征用造成死鎖問題。並且線程在運行過程當中,如果某一個線程崩潰或是出現意外情況,會影響同個進程內其它線程,比單進程模型穩定性差。
線程是進程的一個執行流,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。一個進程由幾個線程組成(擁有很多相對獨立的執行流的用戶程序共享應用程序的大部分數據結構),線程與同屬一個進程的其他的線程共享進程所擁有的全部資源
進程和線程的區別:
進程——資源分配的最小單位
線程——程序執行的最小單位
從函數調用上來說,進程創建使用fork()操作;線程創建使用clone()操作
程序(Program):程序由指令和數據組成。程序是為了達到特定的目的,可以被計算機運行並且由命令代碼組成的語句序列。程序只是一個普通文件,是一個機器代碼指令和數據的集合,這些指令和數據存儲在磁盤上的一個可執行映象(Executable Image)中,所以程序是一個靜態的實體。
虛擬地址空間:在內存中,每個程序的運行都是孤立的,每個程序只知道當前內存空間只運行了自己和內核,而看不到其它的進程。
內核模式與用戶模式:
以32bit系統為例,Linux的虛擬地址空間為0~4G。Linux內核將這4G字節的空間分為兩部分。將最高位的1G字節(從虛擬地址0xC0000000到0xFFFFFFFF)供內核使用,稱為"內核空間"。而將較低的3G字節(從虛擬地址0x00000000到0xBFFFFFFF)供各個進程使用,稱為"用戶空間"。Linux使用兩級保護機制:0級供內核使用,3級供用戶程序使用。
進程在Linux不同模式下運行分為:
核心態:這類進程運行在內核模式下,執行一些內核指令(Ring 0)
用戶態:這類進程工作在用戶模式下,執行用戶指令(Ring 3)
如果用戶態的進程要執行一些核心態的指令,此時就會產生系統調用,系統調用會請求內核指令完成相關的請求,就執行的結果返回給用戶態進程。
進程的分類:
CPU-Bound(CPU密集型):對於CPU占用率高的進程(交互式不強的進程,如視頻播放)。
I/O-Bound(I/O密集型):等待I/O時間長的進程(交互式強的進程,如文本編輯需要不斷的IO操作)
進程的狀態:
運行態:runnnig
就緒態:ready
睡眠態:sleeping
可中斷睡眠(interruptable):隨時來請求,隨時能喚醒,比如處理完當前請求後暫時還沒有更多請求下,這種sleep就是可中斷
不可中斷睡眠(uninterruptable):等待外部條件滿足之前無法繼續運行(例如進程需要讀取磁盤信息到內存中才能繼續運行,但是還沒讀取完成)。通常是指被IO阻塞的過程,等待IO滿足之前無法繼續運行
停止態:stopped,暫停於內存中,不會被內核調度運行,除非手動啟動
僵死態:zombie,父進程先於子進程結束了,子進程再也不能被停掉的進程。
進程的優先級:
CPU挑選進程是根據進程的優先級進行的,進程優先級的取值範圍為0-139。
????實時優先級:0-99,數字越大,優先級越高(內核控制,動態調整)
????靜態優先級:100-139,數字越小,優先級越高(用戶可控制的優先級)
用戶可以通過調整nice值來調整靜態優先級。nice值為-20-19(對應優先級100-139),進程啟動時默認nice值為0,優先級對應為120。
Linux使用搶占式多任務:當時鐘信號到達時,高優先級進程可以搶占CPU。
進程間通信方式IPC(Inter Process Communication)
主機內部:singnal(信號指令)、shm(共享內存空間)、semerphor(旗語,信號量一種計數器)
不同主機:rpc(remote procedure calling遠程過程調用)、socket(IP:Port,套接字)
子進程:進程運行是單線運行的,進程中的指令必須順序執行;父進程有無法完成的任務時,啟用子進程來執行,此時父進程進入睡眠,子進程執行完成後,返回父進程繼續執行。
進程創建機制:每一個進程都是由其父進程fork(),clone()自身而來。
進程創建過程:系統首先以fock的方式復制(cow)一個與父進程相同的進程,這個進程與父進程唯一的差別就是PID不同,但是這個進程還會多一個PPID的參數,PPID就是父進程的程序識別碼PID;然後新產生的進程開始加載實際要運行的程序進行執行。
線程:線程是比進程更小的可以被單獨調度的單位。線程將進程的任務指令拆分,分配到不同的CPU上同時運行。不過Linux中的進程都是輕量級進程,已經相當於線程的級別了。
進程監控工具:
pstree?display a tree of processes?顯示進程樹
-p?顯示進程號(可以指定進程號查看指定進程的信息)
ps?process state查看當前進程狀態
ps命令顯示的是ps命令執行時系統上進程信息的快照,是靜態的結果。Linux運行中內核的相關信息是通過/proc偽文件系統輸出的;各進程都有一個其PID命名的子目錄,每個子目錄中許多文件存儲了進程的相關信息。實際是查看/proc/PID/目錄下內核中的狀態信息
Linux 內核提供了一種通過 /proc 文件系統,在運行時訪問內核內部數據結構、改變內核設置的機制。proc文件系統是一個偽文件系統,它只存在內存當中,而不占用外存空間。它以文件系統的方式為訪問系統內核數據的操作提供接口。
內核參數:可設置其值從而調整內核運行特性的參數,在/proc/sys/下
狀態變量:其用於輸出內核中統計信息或狀態信息,僅用於查看
ps選項有三種風格:
UNIX options, which maybe grouped and must be preceded by a dash
BSD options, which maybe grouped and must not be used with a dash
GNU long options, which arepreceded by two dashes
進程啟動方式:
系統啟動過程中自動啟動:與終端無關的進程;
通過用戶終端啟動:與終端相關的進程;ps命令默認顯示是本次登陸bash相關的進程(可以加個-l顯示詳細信息)
選項:
a? 顯示所有與終端有關的進程
x? 顯示所有與終端無關的進程
u? 顯示運行進程的用戶
-e?顯示所有進程(同ax)
-f?顯示完整格式的進程信息
-H?以進程層級格式顯示進程相關信息
o field1,field2,… 自定義要顯示的字段列表,以逗號分隔
??常用組合:aux、-ef、-eFH、-eo、axo
ps aux?輸出信息描述
USER?運行該進程的用戶
PID? 進程的ID號碼
%CPU?CPU的占用百分比
%MEM?內存空間占用比率,占用整個內存空間的比例
VSZ? Virtual memory SiZe虛擬內存集;占用的虛擬內存大小,真正用來占用的內存
每個內存占用的內存有兩種:線性內存空間、物理內存空間
????線性內存:會映射到物理內存,在線性內存空間角度看是連續的內存占用
????物理內存:實際上是以內存頁框保存,可能一個進程占用的不連續的頁框
RSS? ResidentSize,常駐內存集,當前進程常駐內存的大小,即不能被交換出去的空間大小(如程序的指令信息)
TTY? 運行終端(如果是"?"表示非終端進程)
STAT?當前進程的運行狀態,BSD樣式
R:running,運行態
S:interruptable sleeping,可中斷睡眠
D:uninterruptable sleeping,不可中斷睡眠
T:Stopped,停止狀態
Z:zombie,僵死狀態,進程結束後,在被回收之前狀態
+:表示是一個前臺進程,占據命令提示符
l:多線程進程
N:低優先級進程
<:高優先級進程
s:session leader ,會話主導進程,如shell主導其下的進程
START??進程啟動時間
TIME?? 累計運行占用CPU時間
COMMAND?啟動此進程的程序(有中括號的是kernel進程)
ps -ef?輸出信息描述
UID??啟動該進程的用戶名
PID??進程號
PPID? 父進程的進程號,如果是0表示在內核啟動init之前該進程存在,init啟動後被終止了(過渡作用,一般為swap的進程)
C?? cpu utilization,CPU的占用百分比
STIME?進程的啟動時間
TTY??運行進程的終端
TIME? 累計運行占用CPU時間
CMD??啟動此進程的程序
ps axo 顯示自定義字段列表
ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
o field1,field2,… 自定義要顯示的字段列表,以逗號分隔,o要寫在後面,因為要帶參數
常用的field:pid,ni, pri, psr, pcpu, stat, comm, tty, ppid, rtprio
ni?? nice值
????pri?? priority,優先級
????rtprio?realtime priority,實時優先級
pgrep、pkill?基於進程名字或者其他屬性對相關進程發起查詢、發送信號
pgrep [options] [pattern]
-o??僅顯示找到的最小(起始)進程號
-n??僅顯示找到的最大(結束)進程號
-l??顯示指定進程名的信息
-P #?指定父進程號下的進程列表
-g??指定進程組的信息
-t??指定開啟進程的終端
-u??指定進程的有效用戶ID
pidof?根據進程名獲取其pid
top?display Linux processes?動態顯示進程信息
選項:
-d #??指定刷新時間間隔,默認為3秒
-b?? 以批次方式顯示
-n #??顯示多少批次
-p PID?指定PID來進行觀察監測特定進程
top顯示過程中通過交互式命令指定排序(默認CPU):
P?以占據CPU百分比排序
M?以占據內存百分比排序
T?以累積占用CPU時間排序
N?以PID來排序
首部信息關閉
uptime信息?? l
tasks及cpu信息?t
內存信息?? m
退出命令?? q
修改刷新時間間隔?? s
終止指定的進程?? k
給某個PID設置nice值?r
top顯示信息描述:
第一行:
20:17:21??當前系統時間
up 1 day??系統連續運行的時長為1天
3 users?? 當前登錄系統的用戶數為3個
load average?過去1分鐘、5分鐘、15分鐘的平均負載(CPU進程運行隊列中等待運行進程的個數占整個隊列的百分比);值越小表示系統越空閑,如果高於1,就需要註意當前系統負載過高
第二行:
顯示的是目前進程的總量,不同程序狀態(running、sleeping、stopped、zombie)個數,需要註意的是最後的zmobie值,如果不是0就要查看下哪個進程處於僵死狀態
第三行:使用數字1可以查看不同的CPU的信息(多CPU的情況下),下面說明各字段具體的含義:
us:user space,用戶空間進程運行占用CPU百分比
sy:system,內核空間進程運行占用CPU的百分比
ni:nice,用戶進程空間內改變過優先級的進程占用CPU百分比
id:idle,空閑CPU百分比
wa:wait io,等待IO花費的時間
hi:hardware interrupt,硬中斷占用CPU的百分比
si:software interrupt,軟中斷占用CPU的百分比
st:stolen,偷走的時間百分比(虛擬化)
第四行:表示物理內存的使用情況
第五行:表示交換分區的使用情況
第六行:
PID:進程ID
USER:進程所屬的使用者
PR:Priority的簡寫,進程的優先級,越小優先級越高
NI:Nice的簡寫,與Priority有關,也是越小越早被運行
VIRT:進程需要的虛擬內存大小,而非使用的虛擬內存大小
RES:進程當前使用的內存大小,不包括swap
SHR:進程與其他進程共享的內存大小,可通過RES-SHR來計算進程所占用的物理內存
S: 進程狀態
%CPU:CPU的使用率
%MEM:物理內存使用率
TIME+:累計運行占用CPU時間
uptime?顯示系統時間、運行時長及平均負載
選項:
-a?顯示所有系統相關的信息
-s?顯示內核名稱
-r?顯示內核版本
-m?顯示系統硬件名稱,例如 i686 或 x86_64 等
-p?顯示CPU類型,與 -m 類似,只是顯示的是 CPU 的類型
-i?硬件平臺 (ix86)
htop
這個工具默認沒有安裝 需要第三方源才可以安裝
阿裏雲EPEL源baseurl=https://mirrors.aliyun.com/epel/6/x86_64/
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install htop
選項:
-d # 指定延遲時間間隔
-u UserName 僅顯示指定用戶的進程
-s COLUME 以指定字段進行排序
子命令:
l 顯示選定的進程打開的文件列表
s 跟蹤選定的進程的系統調用
t 以層級關系顯示各進程狀態
a 將選定的進程綁定至某指定的CPU核心
資源監控工具
動態顯示系統資源的使用情況,這些資源包括:內存、磁盤、網絡、cpu等
vmstat命令:
vmstat [options] [delay [count]]
選項:
-s: 顯示內存的統計數據
vmstat 1 3?每1秒統計一次,共統計3次(第一個參數是間隔多少秒統計一次,第二個參數是統計多少次,如果沒指定就一直統計)
顯示信息描述:
procs:
r:隊列中等待運行的進程的個數
b:處於不可中斷睡眠態的進程個數(被阻塞的隊列的長度)
memory:
swpd: 交換內存的使用總量
free:空閑物理內存總量
buffer:用於buffer的內存總量
cache:用於cache的內存總量
swap:
si:數據進入swap中的數據速率(kb/s)
so:數據離開swap中的數據速率(kb/s)
io:
bi:從塊設備讀數據到系統的速率(kb/s)
bo: 系統保存數據至塊設備的速率(kb/s)
system:
in: interrupts, 中斷速率,每秒被中斷的次數
cs: context switch, 進程上下文切換速率
cpu:
us: user space,用戶空間進程運行占用CPU百分比
sy: system,內核空間進程運行占用CPU的百分比
id: idle,空閑CPU百分比
wa: wait io,等待I/O花費的時間
st: stolen,偷走的時間百分比(被虛擬機偷走的CPU)
pmap命令:pmap - report memory map of a process?查看進程到物理內存的映射信息
pmap [options] pid [...]
-x??顯示詳細格式的信息
另外一種實現:
# cat /proc/PID/maps
glances命令:精細化的系統信息監控工具
glances是一款用於Linux、BSD的開源命令行系統監控工具。能夠監視CPU、負載、內存、磁盤I/O、網絡流量、文件系統、系統溫度等信息
這個工具默認沒有安裝 需要第三方源才可以安裝
阿裏雲EPEL源baseurl=https://mirrors.aliyun.com/epel/6/x86_64/
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output]
內建命令:
a Sort processes automatically l Show/hide logs
c Sort processes by CPU% b Bytes or bits for network I/O
m Sort processes by MEM% w Delete warning logs
p Sort processes by name x Delete warning and critical logs
i Sort processes by I/O rate 1 Global CPU or per-CPU stats
d Show/hide disk I/O stats h Show/hide this help screen
f Show/hide file system stats t View network I/O as combination
n Show/hide network stats u View cumulative network I/O
s Show/hide sensors stats q Quit (Esc and Ctrl-C also work)
y Show/hide hddtemp stats
常用選項:
-b 以Byte為單位顯示網卡數據速率
-d 關閉磁盤I/O模塊
-f /path/to/somefile 設定輸出文件位置
-o {HTML|CSV} 與-f一起指定輸出文件格式
-m 禁用mount模塊
-n 禁用網絡模塊
-t # 延遲時間間隔
-1 每個CPU的相關數據單獨顯示
C/S模式下運行glances命令:用於監控遠端服務器
服務模式:
glances -s -B IPADDR
IPADDR: 指明監聽於本機哪個地址
客戶端模式:
glances -c IPADDR
IPADDR:要連入的服務器端地址
dstat命令:系統資源統計的通用工具
dstat [-afv] [options..] [delay [count]]
常用選項:
-c?顯示cpu相關信息
-C #,#,...,total?多顆CPU時顯示指定CPU相關信息
-d??顯示disk相關信息
-D total,sda,sdb,...?顯示指定塊設備相關信息
-g?顯示page相關統計數據
-m?顯示memory相關統計數據
-n?顯示network相關統計數據
-p?顯示process相關統計數據
-r?顯示io請求相關的統計數據
-s?顯示swapped相關的統計數據
--tcp? 顯示TCP相關統計
--udp? 顯示UDP相關統計
--unix? 顯示unix
--raw? 顯示裸socket統計
--socket? 顯示socket統計
--ipc?? 顯示內部進程間通信統計
--top-cpu?顯示最占用CPU的進程
--top-io? 顯示最占用io的進程
--top-mem?顯示最占用內存的進程
--top-latency?顯示延遲最大的進程
進程管理工具
kill命令:向進程發送控制信號,以實現對進程管理
顯示當前系統可用信號:
kill -l
man 7 signal
常用信號:
1) SIGHUP??無須重啟進程而讓其重讀配置文件
2) SIGINT??中斷正在運行的進程;相當於Ctrl+c
9) SIGKILL? 強制殺死正在運行的進程(直接關閉進程)
15) SIGTERM?正常方式終止正在運行的進程(會關閉進程打開的文件等再終止進程)
18) SIGCONT?讓後臺停止的進程繼續在後臺運行,相當於bg命令
19) SIGSTOP?將前臺進程轉入後臺並停止運行,相當於Ctrl+Z
指定信號的方法:
信號的數字標識:1、2、9
信號完整名稱:SIGHUP
信號的簡寫名稱:HUP
向進程發信號:後面也可以是PID,也可以是作業號(%Job_Number)
kill [-SIGNAL] PID...
終止"進程名稱"下的所有進程:
killall [-SIGNAL] Program
Linux的作業控制
前臺作業:通過終端啟動,且啟動後一直占據終端
後臺作業:可以通過終端啟動,但啟動後即轉入後臺運行(釋放終端)
註意:一個進程通過終端啟動,如果終端結束,通過該終端啟動的所有進程都被終止
如何讓作業運行於後臺
運行中的作業:Ctrl+Z
尚未啟動的作業:COMMAND &
此類作業雖然被送往後臺運行,但其依然與終端相關;如果希望送往後臺後,剝離與終端的關系:nohup COMMAND &
nohup不支持bash內建的指令
查看所有作業:jobs
-l?除了列出 job number 與指令串之外,同時列出 PID 的號碼
-r?僅列出正在背景run的作業
-s?僅列出正在背景當中暫停 (stop) 的作業
作業控制:
fg [[%]JOB_NUM]:把指定的後臺作業調回前臺運行(可以省略%),
如果沒指定作業號,默認調回帶+(最近被放到後臺的作業)號的作業,下一個是帶-(倒數第二個被放到後臺的作業)號的
bg [[%]JOB_NUM]:讓送往後臺的作業在後臺繼續運行(可以省略%)
kill [%JOB_NUM]:終止指定的作業(作業號前必須加%,因為要與進程號區分);
進程優先級調整:
靜態優先級:100-139對應nice值-20-19;進程默認啟動時的nice值為0,優先級為120;
nice值可以父進程傳遞給子進程
nice命令:啟動進程時指定nice值
nice [OPTION] [COMMAND [ARG]...]
nice -n 5 htop
renice命令:修改已啟動進程的nice值
renice [-n] priority pid...
renice -n 3 htop
查看進程的nice值:
ps axo pid,comm,ni,priority
其它監控命令:sar, tsar, iostat, iftop
Linux 進程及作業管理