linux进程属主6,20150917 Linux进程查看与管理以及作业管理
第一、基礎知識
MBR引導--內核--內核程序--》協調其它程序
一般內核運行在硬件之上,各應用也在硬件之前
1)OS的基本功能:文件系統、網絡功能、進程管理、內存管理、驅動程序、安全功能
以上為通用目的設置的程序。,
程序=指令+數據,
程序運行在內存當中。這個內存由物理內存映射邏輯空間
左則表示二個框分別表示指令和數據。物理內存劃分固定大小的頁框稱為pageframe。
右則下面的方框表示物理內存。每個進程在右則上面的方框中,這部分為假的內存
空間稱為線性地址空間。
2)CPU指令:? 四個級別ring0,ring1,ring2,ring3
ring0特權敏感指使,ring3環境中為普通指令加減乘除等
控制內存及磁盤數據讀取的為特權指令。
特權指令? :
普通指令
3)程序執行環境:
內核模式:運行內核級指令
用戶模式:運行普通指令
4)應用程序:
運行在內核代碼或應用程序代碼
運行普通指令:直接運行于CPU
運行特權指令:通過system call
5)內存:8bits, 1byte
32bit巡址空間s, 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
32位 4G: 1G, kernel ,每個應用程序假設自己擁有線性地址空間為4G地址空間
可用,包括自己以及系統內核。1G內核使用,3G為線性地址空間使用。
3G, app
6)ROM+RAM
ROM, RAM
7)地址空間:
物理地址空間
線性地址空間
8)IPC: Inter Process Communication
同一主機:
signal
semerphor
shm (shared memory)
不同主機:
rpc: remote procedure call
socket:
9) 進程調度:
進程運行程序,是程序的一部分
多任務:多進程同時運行
搶占式多任務
10)進程分類:
CPU bound: CPU密集型? (類似高清視頻)
I/O bound: IO密集型(編輯器等,頻繁IO操作)
11)進程優先級:
140:0-139
1-99:實時優先級,數字越大優先級越高
100-139:數字越小,優先級越高;
靜態優先級 (進程運行時默認自己擁有優先級)
動態優先級(進程運行時平衡優先級)
Linux準備140隊列,0優先級在0隊列中,1優先級在1隊列中
以此類推。當運行時從隊列首部開始,選擇優先級高的運行。如下圖:
每個進程運行的時間不同。Linux支持搶占式多任務,當一個
低先級的程序在運行,這時有一個高優先級的運行。過一段時間后
這里高優先級優先,提前運行。
算法時間復雜度:Big O (衡量標準算法)
O(1)??? 恒定的,無論優先級,消耗時間相同;(最好的)
O(logn)? 每次調度,調度程序需要從樹中找出優先級最高的進程
O(n)? 線性的
O(n^2)? 拋物線機制
O(2^n)? 隨隊列深度增長
12)進程創建:
請求發出者:進程? (由fork進行創建,為系統調用)
任何子進程parent—>為子進行發起一個fork調用—>child
這里child(task struct)與父進行相同。包括進程ID,父進程ID
進程:fork(), clone()
兩者的虛擬空間不同,但其對應的物理空間是同一個
示例:父進程P1創建P2子程序,
復制P1的正文段,數據段,堆,棧這四個部分讓P2的正文段指向P1的正文
段塊,數據段->P2自己的數據段塊(為其分配對應的塊),堆->P2自己
的堆塊,棧->P2自己的棧塊。如下圖所示:同左到右大的方向箭頭表示
復制內容
COW: Copy On Writing?? 寫時復制
內核只為新生成的子進程創建虛擬空間結構,它們來復制于父進程的虛擬
究竟結構,但是不為這些段分配物理內存,它們共享父進程的物理空間,
當父子進程中有更改相應段的行為發生時,再為子進程相應的段分配物理空間。
關閉進行調用destroy(銷毀某個進行
13)進程的狀態:
運行態:running
睡眠態:sleeping
可中斷睡眠:interruptible? (中斷過程中時可隨時喚醒)
不可中斷睡眠: uninterruptible? (被IO阻塞的進程)
就緒態:runnable
停止態:stopped,不可被調度為運行狀態;
僵死態:zombie
(父進程處理子進程關閉后的狀態,如父進程意外關閉后,子進程
處于孤立的狀態。這時當子進程停止后為僵死進程)。當父進程關閉
前后利用init ,systemd(centos 7)進程指定為子進程新的父進程。
14)進程管理:
task struct: 用于保存每個進程元數據信息
例如:pid, ppid, memory, thread, files
task list: 用一種稱作“鏈表”的數據結構來保存每個進程的task struct.
進程退出前會將其狀態和結果保存到自己的自己的task struct中,下次運行中
直接從tasks struct,這種稱為掛起狀態
進程切換:context switch
保存現場:
恢復現場:
OS: 提供虛擬的計算機,進而能夠將有限資源借助于“保護”機制分配多個
同時運行的程序,即“進程”使用,從而實現了所謂的多任務;
15) 并行處理機制
現代編程采用多線程模型,每個線程單獨的功能。單獨的執行流
進程: 方塊中代表4個內核,4條線條件4個單獨線程。并行執行。
該種方式運行在程序獨立、相互干擾少的情況下。
? ?
線程:tread
共享進程的資源,如父進程、打開文件等;
更輕量的、可被單獨調度的運行單元;
LWP:Light Weight Process(Linux是輕量級處理過程,
Linux是線程即進程,進程即線程)
第二、進程命令
Linux進程查看及管理工具:top, pstree, ps, pidof, pgrep, pkill, htop,
glances, pmap, vmstat, dstat, iostat, sar, kill, job, bg, fg
Linux系統上除init以外的所有子進程,都是由其父進程fork()自身而來,
遵循COW機制;進程展現為“進程樹”;
1) pstree命令:
進程樹查看;
-p: 顯示各進程的PID;
centps 7父為systemd ? ? ? ? ? ?centos 6為init
?
pstree –p 顯示進程及id
2)ps: process state
顯示的是ps命令執行時,系統上當前進程狀態信息的快照 為靜態結果;
Linux運行中的內核的相關信息是通過/proc偽文件系統輸出的;各進程
都有一個以其PID命名的子目錄,每個子目錄中有許多文件存儲了進程的
相關狀態信息;
proc目錄下包括進程ID的目錄(為正在運行的進程創建該目錄)說其
是偽文件系統是因為它是一個映射。每個目錄下都包括相應的文件。
?
ps相關命令都是調用該目錄下的相關文件。
支持眾多選項:
BSD風格? (不需要減號???? -
SysV風格 (需要都減號? - 引用)
根據進程啟動時是否是通過終端上的用戶接×××互式啟動的,進程可分為兩類:
與終端相關的進程: a
與終端無關的進程: x
以用戶為中心組織進程狀態信息顯示:u
AA:常用選項組合1:axu? (在centos 7中可用-aux或aux 結果相同)
命令解釋:與用戶終端相關或無關的進程。
USER?????? PID %CPU %MEM??? VSZ?? RSS TTY ?STAT START?? TIME COMMAND
USER表示進程的屬主,那個身份在運行。
pid為進程號
%CPU CPU比例
%MEM? 內存百分比
VSZ: Virtual memory Size? 線性地址空間占用的空間大小;
RSS:常用駐內存集;指不可以被交換至swap空間的數據占據空間大小;
tty 終端:那個終端啟動的此進程 ?表示不知道那個
STAT:進程狀態
R: running,運行狀態;
S:interruptible sleeping,可中斷睡眠
D:uniterruptible sleeping, 不可中斷睡眠
T: stopped
Z: zombie
s: session leader (一般為執行命令的bash)
+: 前臺進程,占據著某終端
l: 多線程進程
<:>
N: 低優先級進程
START: 啟動時間
TIME: 占據CPU累積時長
COMMAND: 啟動當前進程或線程的命令行程序,[]表示為內核線程;
BB:常用選項組合2: -ef???????? -e: 顯示所有進程;? (相當前aux)
-f: 顯示豐富格式信息fullformat
CC:常用選項組合3:-eFH
-F: 顯示額外信息
-H: 以層級形式顯示進程間關系;
DD:自定義需要顯示的信息:
axo (a代表與終端相關 ,x與終端無關,o可選項)
ps axo pid,command,psr,pri,ni
psr: 當前進程運行的CPU編號;
pri: 當前進程的優先級;
ni: 當前進程的nice值(與進程調整相關)
-20, 19
ppid代表父進程
3)pgrep:? 用于過程進程
語法格式:pgrep [OPTIONS] "PATTERN"
-U UID:僅顯示以指定用戶身份運行的進程;
-G GID
-l: 顯示PID和進程名;
示例:顯示postfix的用戶進程號和名稱
4)pidof:
pidof PROGRAM
PROGRAM: 給定命令行程序
顯示與程序sshd相關進程id信息
5)top命令:
第1)-4)為靜態狀態命令,后為動態命令(定時刷新)
有許多交互式的子命令;
第一行top:顯示當前系統負載信息。與uptime執行結果相同
說明:啟動時間?? 運行時長? 當前登陸用戶數量? 過去負載狀態
0.00,0.001,0.05 代表過1分鐘、5分鐘、15分鐘的負載)
(以上并不是CPU資源的百分比,是隊列的長度:多個隊列等
待運行)
第二行:tasks:
說明:多個個進程? 運行數量??? sleeping數量?? stop數量?? 僵死態數量
第三行: 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? 等待IO的百分比
hi: hardware interrupt
si: software interrupt
st: stolen, 被虛擬機“偷走”的百分比
1:平均或單獨顯示CPU的負載狀態;
第四行:內存
KiB Mem :? 1877664 total,? 1150304 free,?? 351380 used,?? 375980 buff/cache
總物理內存????? 剩余內存??? 使用的????? buffer內存
第五行:交換swap
KiB Swap:? 5242876 total,? 5242876 free,??????? 0 used.? 1337264 avail Mem
交換內存所有空間?? 空閑空間?? 已用空間?? 可用空間
第五行:
pid?? 用戶?? 優先級? nice值?? 虛擬內存級? 常駐內存級?? 共享內存? 狀態
占CPU百分比,占內存百分比 ,累計運行時間,啟動運行的命令
顯示排序黑CPU百分比進行(默認)
P:以占據的CPU百分比大小排序;
M:以占據Memory空間大小排序;
T:CPU累積占用時間排序;
l: 是否顯示系統負載行;(第一行)
隊列長度的合理區間:CPU顆數*0.7
t: 是否顯示進程摘要信息及CPU負載狀態;
m: 是否顯示內存相關的狀態信息;
s: 修改延遲時長
k: 終止指定進程
q: 退出命令
s: 修改延遲時長
? ?
k: 終止指定進程
top命令的選項:
-b: batch,批次顯示
-n #: 顯示的批次數量
示例:top –b –n 2 顯示二批
-d #: 指明延遲時長
示例:top –d 1?? 表示1秒刷新一次
6)uptime命令: 顯示當前系統時間,運行時長,登錄用戶數及系統平均負載;
命令總結:pstree, ps, pgrep, top, uptime, pidof
7)htop:
需要在epel源當中安裝
在/etc/yum.repos.d目錄下創建epel.repo文件
內容如下:
利用yum install htop進行安裝
? ?
交互式命令:
u: 過濾僅顯示選定用戶的進程;(先U再選擇用戶)
?
s: 跟蹤選定的進程所發起的系統調用;
l: 顯示選定進程所打開的文件;
t: 顯示進程的層次結構;
a: 設定進程的cpu親緣性;(將選定的進程綁定在指定的CPU上)
選項:
-d #: 延遲時長
-u USERNAME: 僅顯示指定用戶的進程;
-s COLUMN: 根據指定的字段進行排序;
8)vmstat命令: 狀態查看
用法:vmsate [delay [count]]?? 每隔2秒,顯示6次退出
? ?
procs: 進程相關狀態
r: 運行隊列的長度:有數字時等待運行的進程的個數;(隊列長度)
b:阻塞隊列長度:有數字是表示處理不可中斷睡眠狀態的進程的個數;
(即IO阻塞隊列長度) 單個CPU core 不能大于3基本正常
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:??? eser space
sy:??? system? sy高說明程序有問題,太多系統調用
id:??? idle
wa:?? waitting?? wait過高表示磁盤速率慢
st:?? steal
選項:
-s:顯示內存的狀態統計數據
? ?
9)/proc/#接口: (針對proc目錄相應進程號下面的文件)
10)pmap: 查看指定進程的內存映射關系;
pmap [OPTIONS] pid...
-x: 顯示擴展信息
也可通過cat /proc/#/maps 查看
? ?
11)glances: (需要epel源)
使用python開發
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: 用于連入的服務器的地址;
12)dstat: 整合了vmstat, iostat, netstat and ifstat四款工具的功能;
? ?
dstat [-afv] [options..] [delay [count]]
示例?? dstat 2 5? #每2秒刷新?? 顯示5次,第6次退出
sysmte下面的 int 是中斷?? csw指切換上下文
-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:
-a: -cdngy
IPC: 進程間通信
常見形式:
msg( message queue)?? (消息隊列)
sem( semerphore) (旗語,很短小的消息)
shm(shared memory)? (共享內存)
signal (標簽)
13) 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, 繼續運行指定進程
kill相似的一組進程:
killall [-SIGNAL] PROGRAM
示例:啟用httpd?? service httpd start
查看http的進程號,kill默認是15(安裝終止正在運行的進程)
示例:利用數字 kill –9 進程號
示例:kill httpd
? ?
命令總結:htop, vmstat, glances, dstat, kill, killall
第三、作業管理:
1)定義
作業是定義的一組具有相同功能的一組進程或程序,稱為作業。
通過是否通過終端啟動分為
前臺作業:通過終端啟動,并且在停止之前也會一直占據終端;
后臺作業:作業啟動之時與終端無關,或者是在前臺啟動,但啟動后轉為
與終端無關模式運行; (不是所有命令適合在終端上運行)
如何讓作業運行于后臺?
1、對于已經啟動并處于運行中的作業:
Ctrl+z
Note: 作業被送往后臺后,默認處于stopped狀態;
示例:運行后使用htop命令,control+z后為stop狀態
? ?
2、對于尚未啟動的作業:
COMMAND &
示例:? vmstat 1 &??? 將送到后臺
注意: 此兩類方式相關作業,仍然與終端相關;這意味著,終端終止,將會導
致與此終端相關的所有作業被終止; 與session leader分離
剝離進程與終端的關系:
# nohup COMMAND &
3、守護進程:自動運行在后臺
作業查看:
jobs命令
作業號、作業狀態、啟動命令行程序
? ?
作業控制命令:
fg [[%]job_num]:把指定的作業調回前臺; 示例:fg %2 表示調后2號作業。或%百分號也可
? ?
bg [[%]job_num]:把調往后臺的指定的作業啟動起來,讓其后臺默默運行;
但此作業必須支持運行于后臺;
kill [%job_num]:終止指定的作業; kill的作業號的百分號%i不能夠省略。
4、 進程優先級調整:
AA定義:
優先級級別從0-139? 1-99為實時優先級??? 數字越大優先級越高。
100-139為靜態優先級:數字越小優先級越高
內核針對靜態優先級進行調整
動態優先級:動態調整
靜態優先級:
BB:手動調整優先級,利用nice值
調整時只能夠調大nice值
通過指定進程的nice值來調整其優先級;用戶 空間運行的進程一般都有其nice值;
nice值: -20, 19
優先級:? 100, 139
默認啟動進程時,其nice值為0, 其優先級為120;
(1) 對于尚未啟動的進程:
# nice -n N COMMAND
(2) 對于已經啟動并處于運行中的進程:
# renice -n N PID
示例:ps axo pid,command,pri,ni(查看進程號、名稱、nice、優先級)
nice -n -5 httpd? 調整nice值為-5,輸出為
針對已運行的使用renice
?
注意:普通用戶僅能夠調大nice,調低優先級;
第四:其它命令整理
1)sar :收集、報告用戶信息
sar [ options ] [ [ ] ]
Options:
-B 所有page信息
-A? 所有信息相當于
-b io速率
示例: sar -u 2 5? CPU利用率
sar -r -n DEV -f /var/log/sa/sa16
顯示內存及網絡并保存到/var/log/sa/sa16目錄
? ?
2) iostat,
顯示CPU、device及分區信息
iostat [ options ] [ [ ] ]
Options:
-c 顯示 CPU????? -d 顯示設備
示例:iostat 2 5
示例:iostat –c??? /? iostat –d
3)ifstat
顯示網絡接口信息
ifstat [OPTION] [ PATTERN [ PATTERN ] ]
-e erros錯誤信息
-r reset
示例:
4) tsar;
作業:
命令總結:jobs, fg, bg, nice, renice
博客作業:進程管理工具htop/glances/dstat的使用;
總結
以上是生活随笔為你收集整理的linux进程属主6,20150917 Linux进程查看与管理以及作业管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 查看文件哈希码,使用linu
- 下一篇: linux运行python脚本语句,如何