linux基础篇-系统中进程相关概念
進程概念
? 內核的功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能等
? Process: 運行中的程序的一個副本,是被載入內存的一個指令集合進程ID(Process ID,PID)號碼被用來標記各個進程
UID、GID、和SELinux語境決定對文件系統的存取和訪問權限通常從執行進程的用戶來繼承存在生命周期
? task struct:Linux內核存儲進程信息的數據結構格式
? task list:多個任務的的task struct組成的鏈表
? 進程創建:
init:第一個進程
進程:都由其父進程創建,父子關系,CoW(寫時復制copy on write)? ,fork(), clone()
進程的基本狀態和轉換
進程的基本狀態
??創建狀態:進程在創建時需要申請一個空白PCB(process control block進程控制塊),向其中填寫控制和管理進程的信息,完? ?成資源分配。如果創建工作無法完成,比如資源無法滿足,就無法被調度運行,把此時進程所處狀態稱為創建狀態
??就緒狀態:進程已準備好,已分配到所需資源,只要分配到CPU就能夠立即運行
??執行狀態:進程處于就緒狀態被調度后,進程進入執行狀態
??阻塞狀態:正在執行的進程由于某些事件(I/O請求,申請緩存區失敗)而暫時無法運行,進程受到阻塞。在滿足請求時進入? ?就緒狀態等待系統調用
??終止狀態:進程結束,或出現錯誤,或被系統終止,進入終止狀態。無法再執行狀態之間轉換六種情況
??運行——>就緒:1,主要是進程占用CPU的時間過長,而系統分配給該進程占用CPU的時間是有限的;2,在采用搶先式優先級調度算法的系統中,當有更高優先級的進程要運行時,該進程就被迫讓出CPU,該進程便由執行狀態轉變為就緒狀態
??就緒——>運行:運行的進程的時間片用完,調度就轉到就緒隊列中選擇合適的進程分配CPU
??運行——>阻塞:正在執行的進程因發生某等待事件而無法執行,則進程由執行狀態變為阻塞狀態,如發生了I/O請求
??阻塞——>就緒:進程所等待的事件已經發生,就進入就緒隊列
??以下兩種狀態是不可能發生的:
??阻塞——>運行:即使給阻塞進程分配CPU,也無法執行,操作系統在進行調度時不會從阻塞隊列進行挑選,而是從就緒隊列中選取
??就緒——>阻塞:就緒態根本就沒有執行,談不上進入阻塞態
進程優先級
?進程優先級:
系統優先級:數字越小,優先級越高0-139(CentOS4,5)
各有140個運行隊列和過期隊列
0-98,99(CentOS6)
實時優先級: 99-0 值最大優先級最高
nice值:-20到19,對應系統優先級100-139或99
?Big O:時間復雜度,用時和規模的關系
O(1):恒定, O(logn), O(n)線性, O(n^2)拋物線, O(2^n)
?
? 進程內存:
Page Frame: 頁框,用存儲頁面數據,存儲Page 4k
LRU:Least Recently Used 近期最少使用算法,釋放內存物理地址空間和線性地址空間
MMU:Memory Management Unit負責轉換線性和物理地址
TLB:Translation Lookaside Buffer翻譯后備緩沖器,用于保存虛擬地址和物理地址映射關系的緩存
? IPC: Inter Process Communication
同一主機:signal:信號
shm: shared memory
semaphore:信號量,一種計數器
不同主機:socket: IP和端口號
?RPC: remote procedure call
?MQ:消息隊列,Kafka,ActiveMQ
LRU算法
進程狀態
? Linux內核:搶占式多任務
? 進程類型:
? 守護進程: daemon,在系統引導過程中啟動的進程,和終端無關進程
? 前臺進程:跟終端相關,通過終端啟動的進程
? 注意:兩者可相互轉化
? 進程狀態:
? 運行態:running
? 就緒態:ready
? 睡眠態:
? 可中斷:interruptable
? 不可中斷:uninterruptable
? 停止態:stopped,暫停于內存,但不會被調度,除非手動啟動
? 僵死態:zombie,結束進程,父進程結束前,子進程不關閉
系統管理工具
?進程的分類:
CPU-Bound:CPU密集型,非交互
IO-Bound:IO密集型,交互
?Linux系統狀態的查看及管理工具:pstree, ps, pidof, pgrep, top, htop,
glance, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup
?pstree命令:
pstree - display a tree of processes
?ps: process state
ps - report a snapshot of the current processes
Linux系統各進程的相關信息均保存在/proc/PID目錄下的各文件中,每個進程都有一個PID號
ps:查看系統進程
? ps [OPTION]...
? 支持三種選項:
UNIX選項風格 如-A -e??
BSD選項風格? 如a
GNU選項風格? 如--help
BSD風格如下:
?? 選項:默認顯示當前終端中的進程
?? a 選項包括所有終端中的進程
?? x 選項包括不鏈接終端的進程
?? u 選項顯示進程所有者的信息
?? f 選項顯示進程樹,相當于 --forest
?? k| --sort 屬性 對屬性 排序,屬性前加- 表示倒序
?? o 屬性… 選項顯示定制的信息 pid、cmd、%cpu、%mem
?? L 顯示支持的屬性列表
UNIX風格如下:
??-C cmdlist 指定命令,多個命令用,分隔
??-L 顯示線程
??-e: 顯示所有進程,相當于-A
??-f: 顯示完整格式程序信息
??-F: 顯示更完整格式的進程信息
??-H: 以進程層級格式顯示進程相關信息
??-u userlist 指定有效的用戶ID或名稱
??-U userlist 指定真正的用戶ID或名稱
??-g gid或groupname 指定有效的gid或組名稱
??-G gid或groupname 指定真正的gid或組名稱
??-p pid 顯示指pid的進程
??--ppid pid 顯示屬于pid的子進程
??-M 顯示SELinux信息,相當于Z
例子:ps axO??pid,%CPU,cmd??k pid? 顯示相關信息并按pid排序
ps輸出屬性
? VSZ: Virtual memory SiZe,虛擬內存集,線性內存
? RSS: ReSident Size, 常駐內存集
? STAT:進程狀態
R:running
S: interruptable sleeping
D: uninterruptable sleeping
T: stopped
Z: zombie
+: 前臺進程
l: 多線程進程
L:內存分頁并帶鎖
N:低優先級進程
<: 高優先級進程
s: session leader,會話(子進程)發起者
ps
?ni: nice值
?pri: priority 優先級
?psr: processor CPU編號
?rtprio: 實時優先級
?示例:
ps axo pid,cmd,psr,ni,pri,rtprio
?常用組合:
aux
-ef
-eFH
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
ps示例
?查詢你擁有的所有進程:
ps -x
?顯示指定用戶名(RUID)或用戶ID的進程:
ps -fU apache
ps -fu 48
?顯示指定用戶名(EUID)或用戶ID的進程:
ps -fu wang
ps -fu 1000
?查看以root用戶權限(實際和有效ID)運行的每個進程:
ps -U root -u root
?列出某個組擁有的所有進程(實際組ID:RGID或名稱):
ps -fG nginx
ps示例
?列出有效組名稱(或會話)所擁有的所有進程:
ps -fg mysql
ps -fG 27
?通過進程ID來顯示所屬的進程:
ps -fp 1234
?以父進程ID來顯示其下所有的進程,如顯示父進程為1154的所有進程:ps -f --ppid 1234
?顯示指定PID的多個進程:ps -fp 1204,1239,1263
?要按tty顯示所屬進程:ps -ft pst/0
?以進程樹顯示系統中的進程如何相互鏈接:ps -e --forest
?以進程樹顯示指定的進程
ps -f --forest -C sshd
ps -ef --forest | grep -v grep | grep sshd
?要顯示一個進程的所有線程,將顯示LWP(輕量級進程)以及NLWP(輕量級進程數)列:ps -fL -C nginx
?要列出所有格式說明符:ps L
?查看進程的PID,PPID,用戶名和命令:ps -eo pid,ppid,user,cmd
?自定義格式顯示文件系統組,ni值開始時間和進程的時間:ps -p 1234 -o pid,ppid,fgroup,ni,lstart,etime
?使用其PID查找進程名稱:ps -p 1244 -o comm=
?要以其名稱選擇特定進程,顯示其所有子進程:ps -C sshd,bash
?查找指定進程名所有的所屬PID,在編寫需要從std輸出或文件讀取PID的腳本時這個參數很有用:ps -C httpd,sshd -o pid=
?檢查一個進程的執行時間:ps -eo comm,etime,user | grep nginx
?查找占用最多內存和CPU的進程:
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head
?顯示安全信息:
ps -eM
ps --context
?使用以下命令以用戶定義的格式顯示安全信息。
ps -eo euser,ruser,suser,fuser,f,comm,label
?使用watch實用程序執行重復的輸出以實現對就程進行實時的監視,如下面的命令顯示每秒鐘的監視:
watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head'
進程優先級
?進程優先級調整:
靜態優先級:100-139
進程默認啟動時的nice值為0,優先級為120
只有根用戶才能降低nice值(提高優先性)
?nice命令:
nice [OPTION] [COMMAND [ARG]...]
?renice命令:
renice [-n] priority pid...
?查看:
ps axo pid,comm,ni
搜索進程
??最靈活:ps 選項 | 其它命令
??按預定義的模式:pgrep
? pgrep [options] pattern
? -u uid: effective user,生效者
? -U uid: real user,真正發起運行命令者
? -t terminal: 與指定終端相關的進程
? -l: 顯示進程名
? -a: 顯示完整格式的進程名
? -P pid: 顯示指定進程的子進程
?按確切的程序名稱:/sbin/pidof
? pidof bash? 顯示進程的關閉還是打開狀態,可以用echo $? 返回執行結果
系統工具
?uptime:
顯示當前時間,系統已啟動的時間、當前上線人數,系統平均負載(1、5、10分鐘的平均負載,一般不會超過1)
?系統平均負載:指在特定時間間隔內運行隊列中的平均進程數
?通常每個CPU內核的當前活動進程數不大于3,那么系統的性能良好。如果每個CPU內核的任務數大于5,那么此主機的性能有嚴重問題
?如果linux主機是1個雙核CPU,當Load Average 為6的時候說明機器已經被充分使用
top進程管理工具
?? top:有許多內置命令
? 排序:
? P:以占據的CPU百分比,%CPU
? M:占據內存百分比,%MEM
? T:累積占據CPU時長,TIME+
?首部信息顯示:
? uptime信息:l命令
? tasks及cpu信息:t命令
? cpu分別顯示:1 (數字)
? memory信息:m命令
? 退出命令:q
? 修改刷新時間間隔:s
? 終止指定進程:k
? 保存文件:W
? 選項:
-d #??指定刷新時間間隔,默認為3秒
-b??全部顯示所有進程
-n #??刷新多少次后退出
-H 線程模式,示例:top -H -p `pidof mysqld`
??欄位信息簡介
?us:用戶空間
?sy:內核空間?
?ni:調整nice時間
?id:空閑
?wa:等待IO時間
?hi:硬中斷
?si:軟中斷(模式切換)
?st:虛擬機偷走的時間
? htop命令:此命令需用EPEL源進行YUM安裝之后才有
?選項:
?-d #: 指定延遲時間;
?-u UserName: 僅顯示指定用戶的進程
?-s COLUME: 以指定字段進行排序
子命令:
?s:跟蹤選定進程的系統調用
?l:顯示選定進程打開的文件列表
?a:將選定的進程綁定至某指定CPU核心
?t:顯示進程樹
free :命令顯示內存空間
??內存空間使用狀態:
? free [OPTION]
? ?-b 以字節為單位
? ?-m 以MB為單位
? ?-g 以GB為單位
? ?-h 易讀格式
? ?-o 不顯示-/+buffers/cache行
? ?-t 顯示RAM + swap的總和
? ?-s n 刷新間隔為n秒
? ?-c n 刷新n次后即退出
vmstat內存工具
?? vmstat命令:虛擬內存信息
? vmstat [options] [delay [count]]
? vmstat 2 5
? procs:
? r:可運行(正運行或等待運行)進程的個數,和核心數有關
? b:處于不可中斷睡眠態的進程個數(被阻塞的隊列的長度)
? memory:
? swpd: 交換內存的使用總量
? free:空閑物理內存總量
? buffer:用于buffer的內存總量
? cache:用于cache的內存總量
? swap:
? si:從磁盤交換進內存的數據速率(kb/s)
? so:從內存交換至磁盤的數據速率(kb/s)
? io:
? bi:從塊設備讀入數據到系統的速率(kb/s)
? bo: 保存數據至塊設備的速率
? system:
? in: interrupts 中斷速率,包括時鐘
? cs: context switch 進程切換速率
? cpu:
? us:Time spent running non-kernel code
? sy: Time spent running kernel code
? id: Time spent idle. Linux 2.5.41前,包括IO-wait time.
? wa: Time spent waiting for IO. 2.5.41前,包括in idle.
? st: Time stolen from a virtual machine. 2.6.11前, unknown.
? 選項:
? -s: 顯示內存的統計數據
iostat:統計CPU和設備IO信息
?示例:iostat 1 10
pmap命令:進程對應的內存映射
??pmap [options] pid [...]
? -x: 顯示詳細格式的信息
? 示例:pmap 1
??另外一種實現:
? cat /proc/PID/maps
glances系統監控工具
?? glances命令:需要EPEL源安裝
?? 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}:輸出格式
? -m: 禁用mount模塊
? -n: 禁用網絡模塊
? -t #: 延遲時間間隔
? -1:每個CPU的相關數據單獨顯示
dstat系統監控工具
??dstat命令:系統資源統計,代替vmstat,iostat
??dstat [-afv] [options..] [delay [count]]
? -c??顯示cpu相關信息
? -C #,#,...,total
? -d??顯示disk相關信息
? -D total,sda,sdb,...
? -g??顯示page相關統計數據
? -m??顯示memory相關統計數據
? -n??顯示network相關統計數據
? -p??顯示process相關統計數據
? -r??顯示io請求相關的統計數據
? -s??顯示swapped相關的統計數據
??--tcp
??--udp
??--unix
??--raw
??--socket
??--ipc
??--top-cpu:顯示最占用CPU的進程
??--top-io: 顯示最占用io的進程
??--top-mem: 顯示最占用內存的進程
??--top-latency: 顯示延遲最大的進程
iotop監視磁盤狀況
?? iotop命令是一個用來監視磁盤I/O使用狀況的top類工具iotop具有與top相似的UI,其中包括PID、用戶、I/O、進程等相關信息,可查看每個進程是如何使用IO
?? iotop輸出
? 第一行:Read和Write速率總計
? 第二行:實際的Read和Write速率
? 第三行:參數如下:
? 線程ID(按p切換為進程ID)
? 優先級
? 用戶
? 磁盤讀速率
? 磁盤寫速率
? swap交換百分比
? IO等待所占的百分比
? 線程/進程命令
??-o, --only只顯示正在產生I/O的進程或線程,除了傳參,可以在運行過程中按o生效
??-b, --batch非交互模式,一般用來記錄日志
??-n NUM, --iter=NUM設置監測的次數,默認無限。在非交互模式下很有用
??-d SEC, --delay=SEC設置每次監測的間隔,默認1秒,接受非×××數據例如1.1
??-p PID, --pid=PID指定監測的進程/線程
??-u USER, --user=USER指定監測某個用戶產生的I/O
??-P, --processes僅顯示進程,默認iotop顯示所有線程
??-a, --accumulated顯示累積的I/O,而不是帶寬
??-k, --kilobytes使用kB單位,而不是對人友好的單位。在非交互模式下,腳本編程有用
iotop常用參數和快捷鍵
??-t, --time 加上時間戳,非交互非模式
??-q, --quiet 禁止頭幾行,非交互模式,有三種指定方式
?? -q 只在第一次監測時顯示列名
?? -qq 永遠不顯示列名
?? -qqq 永遠不顯示I/O匯總
??交互按鍵
left和right方向鍵:改變排序
?r:反向排序
?o:切換至選項--only
?p:切換至--processes選項
?a:切換至--accumulated選項
?q:退出
?i:改變線程的優先級
Lsof
?? Lsof:list open files查看當前系統文件的工具。在linux環境下,一切皆文件,用戶通過文件不僅可以訪問常規數據,還可以訪問網 絡連接和硬件如傳輸控制協議 (TCP) 和用戶數據報協議 (UDP)套接字等,系統在后臺都為該應用程序分配了一個文件描述符
?? 命令參數
?? -a:列出打開文件存在的進程
?? -c<進程名>:列出指定進程所打開的文件
?? -g:列出GID號進程詳情
?? -d<文件號>:列出占用該文件號的進程
?? +d<目錄>:列出目錄下被打開的文件
?? +D<目錄>:遞歸列出目錄下被打開的文件
?? -n<目錄>:列出使用NFS的文件
?? -i<條件>:列出符合條件的進程(4、6、協議、:端口、 @ip )
?? -p<進程號>:列出指定進程號所打開的文件
?? -u:列出UID號進程詳情
?? -h:顯示幫助信息
?? -v:顯示版本信息。
?? -n: 不反向解析網絡名字
?? 進程管理
?? 查看由登陸用戶啟動而非系統啟動的進程:lsof /dev/pts1
?? 指定進程號,可以查看該進程打開的文件:lsof -p 9527
?? 文件管理
?? 查看指定程序打開的文件:lsof -c httpd
?? 查看指定用戶打開的文件:lsof -u root | more
?? 查看指定目錄下被打開的文件
? lsof +D /var/log/
? lsof +d /var/log/
? 參數+D為遞歸列出目錄下被打開的文件,參數+d為列出目錄下被打開的文件
?? 網絡管理?
?? 查看所有網絡連接:lsof -i –n lsof -i@127.0.0.1
?通過參數-i查看網絡連接的情況,包括連接的ip、端口等以及一些服務的連接情況,例如:
?sshd等。也可以通過指定ip查看該ip的網絡連接情況
?? 查看端口連接情況:lsof -i :80 -n
?通過參數-i:端口可以查看端口的占用情況,-i參數還有查看協議,ip的連接情況等
?? 查看指定進程打開的網絡連接:lsof -i –n -a -p 9527
? 參數-i、-a、-p等,-i查看網絡連接情況,-a查看存在的進程,-p指定進程
?? 查看指定狀態的網絡連接
? lsof -n -P -i TCP -s TCP:ESTABLISHED
? -n:no host names, -P:no port names,-i TCP指定協議,-s指定協議狀態通過多個參數可以
? 清晰的查看網絡連接情況、協議連接情況等
?恢復刪除文件(前提是使用此文件的程序未關閉)
? lsof |grep /var/log/messages
? rm -f /var/log/messages
? lsof |grep /var/log/messages
? cat /proc/653/fd/6
? cat /proc/653/fd/6 > /var/log/messages
進程管理工具
? kill命令:
向進程發送控制信號,以實現對進程管理,每個信號對應一個數字,信號名稱以SIG開頭(可省略),不區分大小寫
?顯示當前系統可用信號: kill –l,trap -l
?常用信號:man 7 signal
?1) SIGHUP: 無須關閉進程而讓其重讀配置文件
?2) SIGINT: 中止正在運行的進程;相當于Ctrl+c
?3) SIGQUIT:相當于ctrl+\
?9) SIGKILL: 強制殺死正在運行的進程
?15) SIGTERM:終止正在運行的進程
?18) SIGCONT:繼續運行
?19) SIGSTOP:后臺休眠
?指定信號的方法:
?(1) 信號的數字標識:1, 2, 9
?(2) 信號完整名稱:SIGHUP?
?(3) 信號的簡寫名稱:HUP
?按PID:kill [-SIGNAL] pid …:? kill –n SIGNAL pid;kill –s SIGNAL pid
?按名稱:killall [-SIGNAL] comm…
?按模式:pkill [options] pattern? 可以跟模式進行匹配
-SIGNAL
-u uid: effective user,生效者
-U uid: real user,真正發起運行命令者
-t terminal: 與指定終端相關的進程
-l: 顯示進程名(pgrep可用)
-a: 顯示完整格式的進程名(pgrep可用)
-P pid: 顯示指定進程的子進程
轉載于:https://blog.51cto.com/13498416/2169220
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的linux基础篇-系统中进程相关概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【重磅】央行发大招!最全面的支付安全风险
- 下一篇: 日期型转json格式(springboo