進程管理

1. 進程相關概念 a. 應用程序被用戶提請給內核,並得以執行便變成了進程,進程只是被調入內存的應用程序的一個副本。 b. 進程都具有統一的數據結構稱爲task struct用於存儲進程的元數據信息,如進程的名稱、PID、優先級等,也就是ps 命令看到的那些進程屬性字段,應用程序被提請給內核變爲進程後,該應用程序對應進程的父進程就會複製一份自己的task struct,給 2. 進程內存管理 a. CPU中指令分爲普通指令和特權指令,用戶空間的應用進程就都可以執行普通指令,特權指令只能被內核執行 b. 用戶空間 c. 內核空間 3. 進程優先級 Ø 對於進程數量來說CPU計算資源是有限的,如果沒有一套有效的資源分配機制進程就會出現爭搶資源的現象,爲了確保進程高效穩定有序的運行,操作系統設計了140個隊列並將進程分別放入這140個隊列之間,通通調度策略爲隊列中的進程分配CPU資源,使得所有進程能夠按系統規定的制度有序運行。這裏的資源分配機制有兩個重要的術語:隊列和調度策略 Ø 進程優先級 :Linux操作系統爲提供了140個隊列來調度進程使用CPU資源,隊列就是我們常說的進程優先級,進程優先級的取值範圍是0-139,值越小優先級越高,優先級按取值範圍還分爲實時優先級和非實時優先級 Ø 進程優先級調整 : ü 嚴格來講優先級對用戶來說是不可以修改的,用戶只能通過nice值來干預靜態優先級 ü 實時優先級:能過內核動太調整也稱爲動態優先級,取值範圍0-99,用戶不可以過通nice值調整,但可以通過其它命令調整。 ü 非實時優先級:用戶可以過程nice值來干預非實時優先級也稱爲靜態優先級,取值範圍100-139。 ü nice值:nice值的取值範圍是:-20到19,分別對應非實時優先級的100-139,因此nice越小優先級越高。僅管理員可以調低nice值,普通用戶不能調低nice值。 □ 調整原理:一個進程啓動默認nice值爲0,對應優先級爲120,調整後的優先級=當前優先級+nice值,因此用戶以指定nice值啓動進程就可以達到調整優先級的效果。 □ nice進程具備繼承性,子進程繼承父進程 ü 調整優先級: ü nice以指定nice值啓動進程:nice -n -5 ping 192.168.39.2 ü renice修改已運行進程的優先級:renice -n -5 `pidof ping` Ø 調度策略:操作系統如何爲隊列內的進程分配CPU資源,操作系統提供了5種調度策略來管理隊列內的進程,通過命令chrt可以查看和修改每個進程進的調度策略 ü 實時進程調度策略:SCHED_FIFO(先進先出調度算法)、SCHED_RR(默認策略,以時間片輪詢調度,一個時間片爲100ms) ü 非實時進程調度策略:SCHED_OTHER, SCHED_IDLE,SCHED_BATCH 4. 命令選項風格: Ø Unix/Posix風格 ü 命令後的選項,可以分組,便必須以連字符開頭,如ps -aux。 ü 選項無需加參數的,可以組合在一起,如:sed -n -r 可以寫成 sed -nr Ø BSD風格,即命令後的選項,不可以與連字符同用,多個選項可以分組輸寫 Ø GNU風格 ü 即長選項,命令後的參數,可以分組,但必須以雙橫線開頭,如:ps --help。 ü 命令行選項以兩個連字符'--'開頭,後跟選項名稱,選項後面使用空格或者等號 緊接着取值 5. 查看進程樹 a. pstree -p顯示進程名後附加PID b. pstree -u顯示進程名後附加用戶名 c. {}代表線程 6. 基於程序名查詢進程編號 a. pidof 進程名 7. 進程查詢工具ps命令 Ø BSD風格選項 ü ps 不加任何選項則僅顯示當前登錄會話shell環境下的進程列表 ü ps a 選項包括所有終端中的進程 ü ps x 選項包括不鏈接終端的進程(顯⽰當前⽤戶所運⾏的所有進程,包括前臺和後臺守護進程) ü ps u 選項顯示進程所有者的信息 ü f 選項顯示進程樹,相當於 --forest ü k|--sort 屬性 對屬性排序,屬性前加- 表示倒序 ü o 基於進程struck數據結構中的屬性字段 定製顯示的字段信息 ü L 顯示支持的進程屬性字段列表 (該選項下列出的進程屬性字段可以供o選項字制顯示輸出) ü 實例:利用o選項字制顯示字段,並結合k選項基於指定字段排序,如基於%mem字段排序 ü ps o pid,%cpu,%mem,size k %mem ü Ø 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的子進程 ü -t ttylist 指定tty,相當於 t ü -M 顯示SELinux信息,相當於Z Ø PS命令輸出字段 ü USER :進程執行用戶 ü PID:進程ID ü %CPU:CPU利用率 ü %MEM:內存利用率 ü VSZ:內核承諾分配給進程的虛似存內存(KB) ü RSS:進程佔用的真正物理內存(KB) ü TTY:終端號 ?號與終端無關的 ü STAT:進程狀態 ü START:進程啓動到PS命令查詢時所使用的時間 ü TIME:進程實際佔用CPU運行的時間(獲取的時間分) ü COMMAND:進程執行的命令行 ü EUESR:進程生效用戶effect user(例:passwd被設置了SUID權限,則在進程發起者執行的進程實際生效用戶上下文件爲passwd文件所屬組的) ü RUSER:進程的發起者real user Ø STAT進程狀態 ü R 處理運行狀態,正在被CPU執行或在可執行隊列中的進程處於該狀態 ü S 處於睡眠狀態(Sleep可中斷睡眠)等待事件或信號觸發喚醒,S狀態進程task_struct結構被放入對應事件的等待隊列中,一旦事件觸發則會被喚醒 ü D 處於深度睡眠狀態(Deep sleep不可中斷睡眠) ü T 暫停狀態或跟蹤狀態, ü Z 僵死狀態, ü X 死亡狀態, ü Z: zombie ü +: 前臺進程 ü l: 多線程進程 ü L:內存分頁並帶鎖 ü N:低優先級進程 ü <: 高優先級進程 ü s: session leader,會話(子進程)發起者 8. 進程的信號干預: Ø kill可以向進程發送信息,干預進程的運行狀態 Ø 常用信號,kill -l可以查看系統支持的所有信號,Linux中共有64種信號,信號功能介紹:man 7 signal查看幫助,kill -l {1..64} 查看對應信號名稱 ü 1號SIGHUP:無須關閉進程而讓進程重新讀取配置文件Systemctl reload選項就是服務進程發送HUP信號使進程重新加載配置文件 ü 2號SIGINT:interrupt中止,打斷正在運行的進程,相當於Ctrl+c ü 3號SIGQUIT 相當於ctrl+\ ,不是真正結進程,發送 SIGQUIT 信號給前臺進程組中的所有進程,終止前臺進程並生成 core 文件 ü 9號SIGKILL:強制殺死運行中的進程,不管理進程是否完成讀寫操作,會丟失進程數據,打開的文件可能會被損壞。一般應對僵死態或死亡態的進程 ü 15號SIGTERM:終止正在運行的進程,會給進程轉儲緩存數據的機會。如果kill不加任何信號則默認會發送第15號信號。 ü 18號SIGCONT:喚醒後臺休眠的進程繼續運行,此時在後臺運行,在進程所有的終端會話下使用fg命令可以恢復到前臺運行。bg命令就是向進程發送18號信號 ü 19SIGSTOP:將正在運行的進程轉入後臺休眠,相當於Ctrl+z ,Stopped暫停 Ø 進程前後臺切換 ü Ctrl+z將前臺運行的進程轉入後臺休眠(可以看到會提示[#]+ Stopped,#表示任務號,可以通過fg、bg發前18號信號喚醒任務),在進程所有的終端會話下使用fg命令可以恢復到前臺運行。相當於向後進程發送第19號信號SIGSTOP ü fg將後臺任務轉到前臺:jobs查看後臺休眠及運行任務,使用fg加上任務編號即可前後臺任務放到前臺運行,相當於向後臺進程發送第18號信號SIGCONT ü bg將前臺任務轉到後臺:bg即可以將前臺任務轉到後臺運行,也可以喚醒後臺休眠的任務,相當於向進程發前第18號信號SIGCONT ü Ctrl+c 中止前臺運行的任務 ü Ctrl+d 不是發送信號,而是表示一個特殊的二進制值,表示 EOF ü Ctrl+\ 發送 SIGQUIT 信號給前臺進程查並不執行並生成 core 文件,如ping命令想看 Ø 信號的表示方式: ü 信號的數字標識;例:1,2,3, ü 信號的完整名稱,以SIG後加信號名稱簡寫,例:SIGHUP,SIGINT,QUIT ü 信號的簡寫名稱;例:HUP,INT,QUIT Ø 基於進程名殺死所有進程 ü killall 進程名:例:killall httpd Ø 基於模式搜索進程 ü pgrep: ü 語法:pgrep [options] pattern ü 選項: -u uid: effective user,生效者 -U uid: real user,真正發起運行命令者 -t terminal: 與指定終端相關的進程 -l: 顯示進程名 -a: 顯示完整格式的進程名 -P pid: 顯示指定進程的子進程 ü 實例: ü pkill Ø 向進程發送信號 ü 語法:kill -s [信號] pid 注:-s可以省略,而直接用-加上信號再指定PID即可。 ü 例:四種不同的發送信號的方法 Ø kill -9 `pidof ping` Ø kill -HUP `pidof ping` Ø kill -SIGHUP `pidof ping` Ø kill -s 9 `pidof ping`
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章