Linux进程 管理,Linux进程查看与管理以及作业控制
Linux進程查看與管理
靜態結構:重底層開始往上
底層:硬件
kernel(OS):各硬件接口封裝成簡潔的接口
庫:將內核功能封裝成功能模塊,供程序員研發使用
OS的基本功能:文件系統、網絡功能、進程管理、內存管理、驅動程序、安全功能
動態結構:重底層開始往上
底層:bios,
內核:通過BTR啟動內核程序
程序:程序=指令+數據;
CPU:特權指令(系統調用);普通指令
程序執行環境:內核模式:運行內核級指令
用戶模式:運行普通指令
應用程序:運行普通指令:直接運行于CPU
運行特權指令:通過system call
進程:運行中的程序,運行在自己專有的內存空間
內存:cpu在內存中取數據;存指令;存數據;程序運行于內存空間;
內存空間:物理內存映射到邏輯內存,編程中在邏輯內存做個假設,在映射到物理內存來。在邏輯內存中的連續數據可能到物理內存頁框中可能就不連續存儲。
地址空間:物理地址空間;線性地址空間
線性地址空間:每一個內存都運行在自己的邏輯空間,然后要映射到物理內存空間。每一個進程的線性地址空間,都遵循一定的規范;在最底端是指令且是只讀的,接著初始值為零和不為零的數據;接著是堆和棧,對內存的實時調取。
32bits: 2^32, 0-2^32-1, 2^10*2^10*2^10*2^2 bytes = 2^10*2^10*2^2 kilo bytes = 2^10*2^2 MB = 4GB
64bits: 2^64, 4billions 4G
4G空間分配: 1G, kernel;3G(2.7G), app
進程創建:每一進程是有他的父進程fork()創建而來;
parent(進程)-----> fork()----->child;子進程發起fork調用,創建復制fork的子進程,且共同使用同一個內存地址空間。
COW: Copy On Writing寫時復制;當子進程要修改進程的數據時,新建一個復制fork的進程,使用自己的地址空間。
進程:fork(), clone()
COW: Copy On Writing
寫時復制
進程回收:銷毀進程使用destroy
進程追蹤:內核內存空間中,創建task struct(任務結構)。
task struct: 用于保存每個進程元數據信息。
例如:pid, ppid, memory, thread, files
進程調度:cpu通常只能跑一個進程,其他進程等待。
進程的上下文切換:進程按照固定時間輪詢,中間結果如何都會存入自己內核的task struct(任務結構)中。下次運行時,直接從自己內核的task struct(任務結構)中上次暫停的地方調用(相當于掛起,重新載入)。
進程優先級:140個,0-139
1-99:實時優先級,數字越大優先級越高
100-139:數字越小,優先級越高; ? ?靜態優先級;動態優先級;
多任務:多進程同時運行;搶占式多任務
算法時間復雜度:Big O衡量
O(1)
O(logn)
O(n)
O(n^2)
O(2^n)
進程分類:
CPU bound: CPU密集型
I/O bound: IO密集型
進程的狀態:
運行態:running
睡眠態:sleeping
可中斷睡眠:interruptible,隨時喚醒到cpu
不可中斷睡眠: uninterruptible,被IO阻塞的進程,等待磁盤調用完畢才能執行
就緒態:runnable
停止態:stopped,不可被調度為運行狀態;
僵死態:zombie,父進程意外中止,子進程還運行,一般會指定init或systemctl
線程:tread,并行編程模式。一個進程內部自我管理執行的多個執行流。將多個執行流運行在一個CPU上的多個內核上。
LWP:Light Weight Process;對于linux,線程就是進程,進程也是線程。
Linux進程查看及管理工具:top, pstree, ps, pidof, pgrep, pkill, htop, glances, pmap, vmstat, dstat, iostat, sar, kill, job, bg, fg
命令:
pstree:進程樹查看;
-p: 顯示各進程的PID;
ps:process state
Linux運行中的內核的相關信息是通過/proc偽文件系統輸出的;各進程都有一個以其PID命名的子目錄,每個子目錄中有許多文件存儲了進程的相關狀態信息;
顯示的是ps命令執行時,系統上當前進程狀態信息的快照;所以,為靜態結果;
根據進程啟動時是否是通過終端上的用戶接口交互式啟動的,進程可分為兩類:
與終端相關的進程: a
與終端無關的進程: x
以用戶為中心組織進程狀態信息顯示:u
支持眾多選項:BSD風格;SysV風格,-引導
常用選項組合1:axu
USER ? ? ? PID %CPU %MEM ? ?VSZ ? RSS TTY ? ? ?STAT START ? TIME COMMAND
VSZ: Virtual memory Size;線性地址空間占用的空間大小;
RSS:常用駐內存集;指不可以被交換至swap空間的數據占據空間大小;
STAT:進程狀態
R: running,運行狀態;
S:interruptible sleeping,可中斷睡眠
D:uniterruptible sleeping, 不可中斷睡眠
T: stopped
Z: zombie
s: session leader;
+: 前臺進程,占據著某終端
l: 多線程進程
<:>
N: 低優先級進程
START: 啟動時間
TIME: 占據CPU累積時長
COMMAND: 啟動當前進程或線程的命令行程序,[]表示為內核線程;
常用選項組合2:-ef
-e: 顯示所有進程;
-f: 顯示豐富格式信息
常用選項組合3:-eFH
-F: 顯示額外信息
-H: 以層級形式顯示進程間關系;
自定義需要顯示的信息:axo
ps axo pid,command,psr,pri,ni
psr: 當前進程運行的CPU編號;
pri: 當前進程的優先級;
ni: 當前進程的nice值;
-20, 19
pgrep:
語法格式:pgrep [OPTIONS] "PATTERN"
-U UID:僅顯示以指定用戶身份運行的進程;
-G GID
-l: 顯示PID和進程名;
pidof:
pidof PROGRAM
PROGRAM: 給定命令行程序
top命令:
有許多交互式的子命令;
P:以占據的CPU百分比大小排序;
M:以占據Memory空間大小排序;
T:CPU累積占用時間排序;
l: 是否顯示系統負載行;
隊列長度的合理區間:CPU顆數*0.7
t: 是否顯示進程摘要信息及CPU負載狀態;
Cpu(s): ?0.0%us, ?0.0%sy, ?0.0%ni,100.0%id, ?0.0%wa, ?0.0%hi, ?0.0%si, ?0.0%st
us: user space
sy: system (kernel space)
ni: nice
id: idle
wa: wait io
hi: hardware interrupt
si: software interrupt
st: stolen, 被虛擬機“偷走”的百分比
1:平均或單獨顯示CPU的負載狀態;
m: 是否顯示內存相關的狀態信息;
q: 退出命令
s: 修改延遲時長
k: 終止指定進程
top命令的選項:
-b: batch,批次顯示
-n #: 顯示的批次數量
-d #: 指明延遲時長
uptime命令:顯示當前系統時間,運行時長,登錄用戶數及系統平均負載;
htop:
u: 過濾僅顯示選定用戶的進程;
s: 跟蹤選定的進程所發起的系統調用;
l: 顯示選定進程所打開的文件;
t: 顯示進程的層次結構;
a: 設定進程的cpu親緣性;(將選定的進程綁定在指定的CPU上)
選項:
-d #: 延遲時長
-u USERNAME: 僅顯示指定用戶的進程;
-s COLUMN: 根據指定的字段進行排序;
vmstat命令:
用法:vmsate [delay [count]]
? ? ??procs:
r: 等待運行的進程的個數;(隊列長度,每顆CPU的每個核心2-3個以內)
b:處理不可中斷睡眠狀態的進程的個數;(即IO阻塞隊列長度)
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: 中斷速率
cs: 進程切換的速率
cpu
us: userd
sy:system
id:idel
wa:wait
st:stop
注意:wait過高,因為io速度不好,磁盤速率太慢;system過高,程序寫的有問題。
選項:
-s:顯示內存的狀態統計數據
/proc/#接口:
pmap:查看指定進程的內存映射關系;
pmap [OPTIONS] pid...
glances:
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output]
常用選項:
-b: 以Byte/s為單位顯示網卡設備數據交換速率;
-d: 關閉磁盤I/O功能模塊;
-f /PATH/TO/SOMEFILE:設置輸出文件的位置及格式;
-o {HTML|CSV}:
-m: 關閉mount功能模塊
-n: 關閉網絡功能模塊
-r: 關閉進程列表功能模塊
-t #: 指定延遲時長,默認為3秒;
-1:單獨顯示每顆CPU相關負載數據信息;
glances支持遠程模式:
即可以以C/S模式工作:
Server: 以監聽模式啟動glances;
Client: 以遠程模式啟動glances,遠程連入指定服務器,并Server上的相關性能數據;
服務模式:
glances -s -B IPADDR
-B: 用于指明監聽的本地地址;
客戶端模式:
glances -c IPADDR
-c: 用于連入的服務器的地址;
dstat: 整合了vmstat, iostat, netstat and ifstat四款工具的功能;
dstat [-afv] [options..] [delay [count]]
? ? ? ? ??-a: -cdngy
-c: 顯示cpu性能指標相關的統計數據;
-d: 顯示disk相關的速率數據;
-g: 顯示page相關的速率數據;
-i: 顯示interrupt相關的速率數據;
-l: 顯示load average相關的統計數據;
-m: 顯示memory相關的統計數據;
-n: 顯示網絡收發數據的速率;
-p: 顯示進程相關的統計數據,
-r: io請求的速率;
-s: 顯示swap的相關數據
-y: 顯示系統相關的數據,包括中斷和進程切換;
--top-cpu:顯示最占用CPU的進程;
--top-bio:顯示最消耗block io的進程;
--top-io:最占用io的進程;
--top-mem:顯示最占用內存的進程;
--ipc: 顯示進程間通信相關的速率數據;
--raw: 顯示raw套接的相關的數據;
--tcp: 顯示tcp套接字的相關數據;
--udp: 顯示udp套接字的相關數據;
--unix: 顯示unix sock接口相關的統計數據;
--socket:
signal:傳遞給進程的短小信息
Linux主機支持的進程間可用到的信息:
(1) kill -l
(2) man 7 signal
向進程發信號:
kill [-SIGNAL] PID
默認的信號為SIGTERM;
信號表示方式:
(1) 完整名稱,例如SIGINT
(2) 簡寫名稱,例如INT
(3) 數據代稱,例如2
常用信號:
SIGHUP: 1, 通知進程重讀其配置文件以讓新的配置生效,但不用重新啟動進程;
SIGINT:2, 打斷正在運行中的進程,相當于鍵盤組合鍵Ctrl+c
SIGKILL:9, 強行中止正在運行中的進程
SIGTERM: 15, 安全中止正在運行中的進程
SIGSTOP: 19, 暫停進程
SIGCONT: 18, 繼續運行指定進程
killall相似的一組進程:
killall [-SIGNAL] PROGRAM
作業管理:
前臺作業:通過終端啟動,并且在停止之前也會一直占據終端;
后臺作業:作業啟動之時與終端無關,或者是在前臺啟動,但啟動后轉為與終端無關模式運行;
如何讓作業運行于后臺?
1、對于已經啟動并處于運行中的作業:
Ctrl+z
注意:作業被送往后臺后,默認處于stopped狀態;
2、對于尚未啟動的作業:
COMMAND &
注意:此兩類方式相關作業,仍然與終端相關;這意味著,終端終止,將會導致與此終端相關的所有作業被終止;
3、剝離進程與終端的關系:
# nohup COMMAND &
作業查看:
jobs命令
作業號、作業狀態、啟動命令行程序
作業控制命令:
fg [[%]job_num]:把指定的作業調回前臺;
bg [[%]job_num]:把調往后臺的指定的作業啟動起來,讓其后臺默默運行;但此作業必須支持運行于后臺;
kill [%job_num]:終止指定的作業;
進程優先級調整:
靜態優先級:
通過指定進程的nice值來調整其優先級;用戶 空間運行的進程一般都有其nice值;
nice值: -20, 19
優先級: ?100, 139
默認啟動進程時,其nice值為0, 其優先級為120;
(1) 對于尚未啟動的進程:
# nice -n N COMMAND
(2) 對于已經啟動并處于運行中的進程:
# renice -n N PID
注意:普通用戶僅能夠調大nice,調低優先級;
總結
以上是生活随笔為你收集整理的Linux进程 管理,Linux进程查看与管理以及作业控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php求数组的长度的函数,php如何计算
- 下一篇: 如何查看linux系统的密码是多少,如何