一 進程、線程、程序概念
1、進程(Process)
什么是進程,簡單的說,進程是程序的執行實例,即運行中的程序,同時也是程序的一個副本;程序是放置于磁盤的,而運行中的程序是位于內存中的。
2、線程(Thread)
一個進程至少包括一個線程,通常將該線程稱為主線程,所以線程是比進程更小的單位,是系統分配處理器時間資源的基本單元。一個進程要想同時在多顆CPU上運行,必須得分成互不影響的多個執行流,而后每組單獨在各自所分配的CPU上運行,這種分化后的執行流且有著比進程更小資源分配單位稱之為線程。線程之間可以共享內存空間,當一個文件需要被打開多次時,線程模型可以節省很大的內存空間,但是得避免因資源征用造成死鎖問題。并且線程在運行過程當中,如果某一個線程崩潰或是出現意外情況,會影響同個進程內其它線程,比單進程模型穩定性差。
3、程序(Program)
程序由指令和數據組成。
程序是為了達到特定的目的,可以被計算機運行并且由命令代碼組成的語句序列。
程序只是一個普通文件,是一個機器代碼指令和數據的集合,這些指令和數據存儲在磁盤上的一個可執行映象(Executable Image)中,所以,程序是一個靜態的實體。
二 進程相關知識
1.虛擬地址空間
在內存中,每個程序的運行都是孤立的,每個程序只知道當前內存空間只運行了自己和內核,而看不到其它的進程。
2.內核模式與用戶模式
以32bit系統為例,Linux的虛擬地址空間為0~4G。Linux內核將這4G字節的空間分為兩部分。將最高的1G字節(從虛擬地址0xC0000000到0xFFFFFFFF),供內核使用,稱為“內核空間”。而將較低的3G字節(從虛擬地址0x00000000到0xBFFFFFFF),供各個進程使用,稱為“用戶空間)。Linux使用兩級保護機制:0級供內核使用,3級供用戶程序使用。
3.進程的狀態:
運行態:runnnig
睡眠態:sleeping
可中斷睡眠:interruptable,隨時來請求,隨時能喚醒,比如處理完當前請求后暫時還沒有更多請求下,這種sleep就是可 中斷
不可中斷睡眠:uninterruptable,等待外部條件滿足之前無法繼續運行。
停止態:stopped,不會再被內核調度并運行。
僵死態:zombie,父進程先于子進程結束了,子進程再也不能被停掉的進程。
4.進程的優先級
CPU挑選進程是根據進程的優先級進行的,進程優先級的取值范圍為0-139。
實時優先級:0-99,數字越大,優先級越高;(內核控制)
靜態優先級:100-139,數字越小,優先級越高。(用戶可控制的優先級)
用戶可以通過調整nice值來改變進程的優先級。
nice值:-20-19 調整靜態優先級
進程啟動時,默認nice值為0,優先級對應為120。
動態優先級:由內核維護,動態調整。
Linux使用搶占式多任務:當時鐘信號到達時,高優先級進程可以搶占CPU。
5.進程間通信方式(IPC: Inter Process Communication)
同一主機:
singnal:信號。
shm:共享內存。
semerphor:旗語。
不同主機:
rpc:remote procedure calling,遠程過程調用。
socket:IP:port,套接字。
6.進程的分類:
CPU-Bound(CPU密集型):對于CPU占用率高的進程。
I/O-Bound(I/O密集型):等待I/O時間長的進程
7.子進程
進程運行是單線運行的,進程中的指令必須順序執行。
子進程:父進程有無法完成的任務時,啟用子進程來執行,此時父進程進入睡眠,子進程執行完成后,返回父進程繼續執行。
進程創建機制:每一個進程都是由其父進程fork()自身而來。
8.線程
線程是比進程更小的可以被單獨調度的單位。
線程將進程的任務指令拆分,分配到不同的CPU上同時運行。
不過Linux中的進程都是輕量級進程,已經相當于線程的級別了。
三 進程管理相關命令
1.pstree # 顯示進程樹
pstree -p
2.ps:process state,查看當前進程狀態
備注:實際上是查看/proc/ *目錄下內核中的狀態信息
SYNOPSIS
ps [options]
a:顯示所有與終端有關的進程
x:顯示所有與終端無關的進程
u:顯示運行進程的用戶
-e:顯示所有進程
-f:顯示完整格式的進程信息
o field1, field2,…:自定義要顯示的字段列表,以逗號分隔
常用組合:aux、ef、axo
ps -aux
USER:運行該進程的用戶
PID:進程的ID號碼
%CPU:CPU的占用百分比
%MEM:內存空間占用比率,占用整個內存空間的比例
VSZ:虛擬內存集;占用的虛擬內存大小,真正用來占用的內存
每個內存占用的內存有兩種:線性內存空間、物理內存空間
線性內存:會映射到物理內存,在線性內存空間角度看是連續的內存占用
物理內存:實際上是以內存頁框保存,可能一個進程占用的不連續的頁框
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:使用進程、線程
ps -ef
UID:啟動進程用戶
PID:運行進程號
PPID:父進程的進程號,0在內核啟動init之前存在,init啟動后終止,存在過渡,一般為swap的進程
C:cpu utilization,CPU的占用百分比
STIME:啟動時間
TTY:與其終端相關
TIME:累計運行CPU時間
CMD:啟動此進程的命令
ps axo 顯示自定義字段列表
o field1, field2,…:自定義要顯示的字段列表,以逗號分隔,o要寫在后面,因為要帶參數
常用的field:pid,ni, pri, psr, pcpu, stat, comm, tty, ppid, rtprio
ni:nice值;
priority:priority,優先級;
rtprio:realtime priority,實時優先級;
3.pgrep,pkill:基于進程名字或者其他屬性對相關進程發起查詢、發送信號
SYNOPSIS
pgrep [options] [pattern]
-o:僅顯示找到的最?。ㄆ鹗迹┻M程號
-n:僅顯示找到的最大(結束)進程號
-l:顯示進程名稱
-P:指定父進程號
-g:指定進程組
-t:指定開啟進程的終端
-u:指定進程的有效用戶ID
4.pidof:根據進程名獲取取其pid;
SYNOPSIS
pidof [-s] [-c] [-x] [-o omitpid] [-o omitpid..] program [program..]
-s:僅顯示一個
5.top:- display Linuxprocesses,動態顯示進程信息
SYNOPSIS
top [OPTION]
(1)選項:
-d #:指定刷新時間間隔,默認為3秒;
-b:以批次方式顯示;
-n #:顯示多少批次;
(2)在top顯示過程中通過交互式命令指定排序(默認CPU):
P:以占據CPU百分比排序;
M:以占據內存百分比排序;
T:累積占用CPU時間排序;
(3)首部信息關閉
uptime信息:l命令
tasks及cpu信息:t命令
內存信息:m命令
(4)退出命令:q
(5)修改刷新時間間隔:s
(6)終止指定的進程:k
top
這一行的內容表示:
23:11:04:當前系統時間;
up 1:00:服務器連續運行的時長為1小時;
2 users:當前登錄系統的用戶數;
load average:過去1分鐘、5分鐘、15分鐘的平均負載
1:數字,分別顯示各CPU的相關信息;
使用數字1可以查看不同的CPU的信息,下面說明各字段具體的含義:
us:user space,用戶運行程序時間百分比;
sy:system,用于運行內核所占用CPU的百分比;
ni:nice,用戶進程空間內改變過優先級的進程占用CPU百分比;
id:idle,空閑CPU百分比;
wa:wait io,等待IO花費的時間;
hi:hardware interrupt,硬中斷占用CPU的百分比;
si:software interrupt,軟中斷占用CPU的百分比;
st:stolen,偷走的時間百分比。
各字段含義如下:
Mem:物理內存;
Swap:交換分區;
buffers:緩沖區,用于減少進程之間的等待時間;
cache:CPU與內存之間的高速緩存,用于減少CPU的等時間。
top -p 1727
6.uptime命令:顯示系統時間、運行時長及平均負載
去1分鐘、5分鐘和15分鐘的平均負載;等待運行的進程隊列的長度;
7.htop命令
這個工具默認沒有安裝 需要第三方源才可以安裝
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install htop
(1)選項:
-d#:指定延遲時間間隔;
-uUserName:僅顯示指定用戶的進程;
-sCOLUME:以指定字段進行排序;
(2)子命令:
l:顯示選定的進程打開的文件列表;
s:跟蹤選定的進程的系統調用;
t:以層級關系顯示各進程狀態;
a:將選定的進程綁定至某指定的CPU核心;
(3) 顯示敘述
左上方數據:表示每顆CPU、內存、交換內存的使用率
右上方數據:
Tasks當前的任務數量,用戶空間進程
thr:線程數量
running:運行的數量
Load average :過去一分鐘、五分鐘、十五分鐘的平均負載
8.vmstat命令 # 顯示虛擬內存統計信息
vmstat
procs:
r:等待運行的進程的個數;CPU上等待運行的任務的隊列長度;
b:處于不可中斷睡眠態的進程個數;被阻塞的任務隊列的長度;
memory:
swpd:交換內存使用總量;
free:空閑的物理內存總量;
buffer:緩沖,與寫相關,加速寫操作;
cache:緩存,與讀相關,加速讀操作。
swap
si:數據進入swap中的數據速率(kb/s)
so:數據離開swap的速率(kb/s)
io
bi:從塊設備讀入數據到系統的速度(kb/s)
bo:保存數據至塊設備的速率(kb/s)
system
in:interrupts,中斷速率;
cs:contextswitch, 上下文 切換的速率;
cpu
us:user space
sy:system
id:idle
wa:wait
st:stolen
9.dstat命令 #系統資源統計工具
SYNOPSIS
dstat [-afv][options..] [delay [count]]
常用選項:
-c,–cpu:顯示cpu相關信息;
-C #,#,…,total 顯示第幾顆CPU,total總共的
-d,–disk:顯示磁盤的相關信息
-D sda,sdb,…,tobal 指明具體的磁盤信息
-g:顯示page相關的速率數據;
-m:Memory的相關統計數據
-n:Interface的相關統計數據;
-p:顯示process的相關統計數據;
-r:顯示io請求的相關的統計數據;
-s:顯示swapped的相關統計數據;
–tcp、–udp、–raw 、–socket 網絡連接相關
–ipc 進程相關
–top-cpu:顯示最占用CPU的進程;
–top-io:最占用io的進程;
–top-mem:最占用內存的進程;
–top-lantency:延遲最大的進程;
dstat
10.kill命令:
kill [-s signal|-SIGNAL] pid… 向進程發信號
kill -l [signal]:顯示當前系統可用信號:
常用信號:
1) SIGHUP: 無須關閉進程而讓其重讀配置文件;
2) SIGINT: 中止正在運行的進程;相當于Ctrl+c;
9) SIGKILL: 殺死正在運行的進程;
15) SIGTERM:終止正在運行的進程;
18) SIGCONT:繼續
19) SIGSTOP:停止,將進程送后臺,停止狀態
指定信號的方法:
(1) 信號的數字標識;1, 2, 9
(2) 信號完整名稱;SIGHUP
(3) 信號的簡寫名稱;HUP
11.killall
killall [-SIGNAL] program 對所有與program相關的進程發信號
四 系統作業控制命令
1.系統作業job
(1)job種類:
前臺作業(foregroud):通過終端啟動,且啟動后會一直占據終端;
后臺作業(backgroud):可以通過終端啟動,但啟動后即轉入后臺運行(釋放終端);
(2)讓作業運行于后臺
1) 運行中的作業:Ctrl+z
送往后臺后,作業會轉為停止態;相當于發送kill -19 信號
2) 尚未啟動的作業: # COMMAND &
此類作業雖然被送往后臺,但其依然與終端相關;如果希望把送往后臺的作業剝離與終端的關系:
# nohup COMMAND &
(3)查看所有的作業:#jobs命令
+/- 表示優先級;當調用時不加作業號會默認調用+的命令
(4)可實現作業控制的常用命令:
#fg [[%]JOB_NUM]:把指定的作業調回前臺;
#bg [[%]JOB_NUM]:讓送往后臺的作業在后臺繼續運行;
#kill %JOB_NUM:終止指定的作業;
2.調整進程優先級:
可通過nice值調整的優先級范圍:100-139;分別對應于:-20, 19。進程啟動時,其nice值默認為0,其優先級是120;
注意:僅管理員可調低nice值;
(1)nice命令:
以指定的nice值啟動并運行命令:# nice [OPTION] [COMMAND [ARGU]…]
選項:-nNICE
nice -n -5 echo "hello world"
(2)renice命令:
#renice [-n] NICE PID…
renice -10 1589
(3)查看Nice值和優先級:ps axo pid, ni, priority, comm
ps axo pid,ni,command | grep "bash"
原創文章,作者:liangkai,如若轉載,請注明出處:http://www.www58058.com/11493