linux第六章-程式管理
linux的入門篇
文章目錄
一,程式基本概述
1,描述
- 程式是已啟動的可執行程式的執行中例項。
- cpu的工作機制是分時進行的,通過核心來進行排程,通過納秒來計量工作時間的。
/proc目錄下以數字為名的目錄,每一個目錄代表一個程式,儲存著程式的屬性資訊,每一個程式的PID是唯一的,就算程式退出了,下一個程式也不會使用此PID。
2,程式的組成部分
- 已分配記憶體的地址空間
- 安全屬性,包括所有權憑據和特權
- 程式程式碼的一個或多個執行執行緒
- 程式狀態
3,程式環境
- 本地和全域性變數
- 當前排程上下文
- 分配的系統資源,如檔案描述符和網路埠
4,程式的產生
- /proc//pidfd:(fd-file describe;檔案描述符)
- 父程式—子程式:
現有的父程式複製位元組的地址空間(fork)來建立一個新的子程式結構
每一個新程式分配有唯一的程式ID(PID),滿足跟蹤和安全性之需,PID與父程式ID(PPID)是新程式環境的元素。
- 任何程式可建立子程式,所有的程式都是第一個系統程式的後代,第一個系統程式是systemd
通過fork程式,子程式繼承安全性身份,過去的和當前的檔案描述符、埠和資源特權、環境變數,以及程式程式碼。隨後,子程式可能exec其自己的程式程式碼。
通常,父程式在子程式執行期間處於睡眠狀態,設定一個在子程式完成時發出訊號的請求(wait)。在退出時,子程式可能已經關閉或丟棄了其資源和環境,剩餘的部分被稱作僵停zmbie(殭屍)。父程式在子程式退出時收到訊號而被喚醒,清理剩餘結構,然後繼續執行其自己的程式程式碼。
5,程式的分類
- 前臺程式:與終端相關的程式,通過終端啟動的程式:
也可把前臺啟動的程式送往後臺處理,以守護模式執行,通過&將程式掛起。
- 守護程式:daemon,與終端無關的程式(如核心),在系統引導過程中啟動的程式
- zombie(殭屍程式)通過重啟系統毀滅殭屍程式
二,程式狀態
- Excuting :執行狀態
- ** Ready:就緒態,也可稱作睡眠態**
a Uninterruptible sleep //不可終端的睡眠,不可隨時喚醒,只有當IO資源載入成功後才能被喚醒。
b ,interruptible //可終端的睡眠,可隨時喚醒。
-
Zombie :殭屍程式,正常的執行結束了,但是不釋放暫據的記憶體。
-
Stopped://停止狀態,暫停於記憶體中,但不會被排程,除非手動啟動之
-
程式睡眠的原因:
當一個執行中的程式,需要載入額外的IO資源的時候,由於IO裝置的速度太慢,所以會轉入睡眠狀態等待,交出CPU給其他程式,以免浪費剩餘執行時間
在多工處理作業系統中,每個CPU(或CPU核心)在一個時間點上處理一個程式。在程式執行時,它對CPU時間和資源分配的直接要求會有變化。程式分配有一個狀態,它隨著環境要求而改變。
- Linux程式狀態
標誌 | 核心定義的狀態名稱和描述 |
---|---|
R | TASK_RUNNING:程式正在CPU上執行,或者正在等待執行。處於執行中(或可執行)狀態時,程式可能正在執行使用者例程或核心例程(系統呼叫),或者已排隊並就緒 |
S | TASK_INTERRUPTIBLE:程式處於睡眠狀態且正在等待某一條件:硬體請求、系統資源訪問或訊號。當事件或訊號滿足該條件時,該程式將返回到執行中 |
D | TASK_UNINTERRUPTIBLE:此程式也在睡眠,但與S狀態不同,不會響應傳遞的訊號。僅在特定的條件下使用,其中程式中斷可能會導致意外的裝置狀態 |
K | TASK_KILLABLE:程式處於睡眠狀態,與不可中斷的D狀態相同,但有所修改,允許等待中的任務通過響應訊號而被中斷(徹底退出)。實用程式通常將可中斷的程式顯示為D狀態 |
T | TASK_STOPPED:程式已被停止(暫停),通常是通過使用者或其他程式發出的訊號。程式可以通過另一訊號返回到執行中狀態,繼續執行(恢復) |
T | TASK_TRACED:正在被除錯的程式也會臨時停止,並且共享同一個T狀態標誌 |
z | EXIT_ZOMBIE:子程式在退出時向父程式發出訊號。除程式身份(PID)之外的所有資源都已釋放 |
X | EXIT_DEAD:當父程式清理(獲取)剩餘的子程式結構時,程式現在已徹底釋放。此狀態從不會在程式列出實用程式中看到 |
< | 高優先順序程式 |
N | 低優先順序程式 |
+ | 前臺程式組中的程式 |
| | 多執行緒程式 |
s | 會話程式首程式 |
三,程式優先順序
1,linux程式排程與多工。
-
a,現代計算機系統中既包含每次只能執行一個指令的低端處理器,也包含高效能的超級計算機,這些超級計算機每臺配備數百個CPU,可以並行執行數以百計的指令,但是所有這些系統往往具有一個共同點:它們需要執行的程式數量總是超出實際具有的核心數,
-
b,通過時間分片技術,Linux(和其他作業系統)實際能夠執行的程式數(和執行緒數)可以超出可用的實際處理單元數,作業系統程式之間進行快速切換,從而給使用者一種有多個程式在同時執行的印象,
-
c,執行此切換的linux核心部分稱為程式排程程式。
2,程式優先順序
- 程式優先順序範圍:0-139,數字越小,優先順序越高。
0-99:實時優先順序,核心調整
100-139:靜態優先順序,使用者可控制
- 程式優先順序高的特點
獲得更多的CPU執行實際
更優先獲得CPU執行的機會
- 要修改程式的優先順序可以通過調整程式的nice值來實現,nice值越小,優先順序越高;
nice值的範圍是(-20,19),-20對應100,19對應139(優先順序最大-20)
3,相對優先順序:
-
由於不是每種程式都與其他程式同樣重要,可告知排程程式為不同的程式使用不同的排程策略。常規系統上執行的大多數程式所使用的排程策略稱為SCHED_OTHER(也稱為SCHED_NORMAL),但還有一些其他策略可用於不同的目的。
-
由於並非所有程式都以同樣的方式建立,可為採用SCHED_NORMAL策略執行的程式指定相對優先順序。此優先順序稱為程式的nice值。一個程式可以有40種不同級別的nice值。
-
這些nice級別的範圍是從-20到19。預設情況下,程式將繼承其父程式的nice級別,通常為0
-
nice級別越高,表示優先順序越低(該程式容易將其CPU使用量讓給其他程式)
-
nice級別越低,表示優先順序越高(該程式更加不傾向於讓出CPU)
-
如果不存在資源爭用(例如當活動程式數少於可用CPU核心數時),即使nice級別高的程式也將仍使用它們可使用的所有可用CPU資源。但當請求CPU時間的程式數超過可用核心數時,nice級別較高的程式將比nice級別較低的程式收到更少的CPU時間
4 nice級別與許可權
-
為很佔CPU資源的程式設定較低的nice級別可能會對同一系統上執行的其他程式的效能造成負面影響,
所以僅允許root使用者設定負nice級別以及降低現有程式的nice級別。root可以隨意調整,普通使用者只能將優先順序調低。 -
普通非特權使用者僅允許設定正的nice級別。只能對現有程式提升nice級別,而不能降低nice級別。
5,程式優先順序調整:調整nice值
- 調整已經啟動的程式nice值:renice NI PID (如 renice 3 3704)
- 在啟動時指定nice值:(-20,19) nice -n NI COMMAND
四,程式管理命令
1,ps
- ps(process state)命令用於列出當前的程式。可以顯示詳細的程式資訊,
- 包括以下內容
-使用者識別符(UID),它確定程式的特權
-唯一程式識別符(PID)父程式ID(PPID)
-CPU和已經花費的實時時間
-程式在各種位置上分配的記憶體數量
-程式的位置STDOUT,稱為控制終端
-當前的程式狀態
- os支援的三種選項格式
a | UNIX(POSIX)選項,可以分組但必須以連字元開頭;如ps -aux |
---|---|
b | BSD 選項,可以分組但不可與連字元同用 |
c | GNU 長選項,以雙連字元開頭 |
-
ps(process state),顯示程式資訊。注意事項:
加了[]中括號的,表示核心執行緒,通常位於頂部
exiting或defunct表示殭屍程式 zombie -
常用選項
A | //顯示所有與終端有關的程式 |
---|---|
U | //顯示程式是由哪個使用者啟動的 |
X | //顯示所有與終端無關的程式 |
-e | //顯示所有程式,與-A效果相同 |
-l | //以長格式顯示 |
-F | //顯示更詳細的完整格式的程式資訊 |
-f | //顯示更詳細的完整格式的程式資訊 |
-H | //以程式層級格式顯示程式相關資訊 |
-o | //根據自己的需要選擇要顯示的欄位 |
- //aux結果解析
VSZ //Virtual memory SiZe,虛擬記憶體集
RSS //ReSident Size,常駐記憶體集
STAT //程式狀態
TIME //執行時的累積時長
- //ps命令結果解析
NI //nice值
PRI //優先順序
PSR //程式執行在哪個CPU核心上
RTPTRIO //實時優先順序
C //執行的CPU編號
STIME //程式的啟動時間
VSZ //Virtual memory SiZe,虛擬記憶體集
RSS //ReSident Size,常駐記憶體集
STAT //程式狀態
TIME //執行時的累積時長
2 pstree
- pstree:用於顯示當前系統上的程式樹
- 如
3,pgrep
- 以grep的風格指定只顯示那些程式,在當前系統中找符合某些特性的程式,只顯示程式號。
4,pidof
- pidof 根據程式名稱查詢其PID號。
- 如
5,vmstat
- 虛擬記憶體狀態檢視命令:語法:vmstat [option] [delay{conunt}]
例如:
vmstat 2 //表示每2秒重新整理一次
vmstat 2 5 //表示每2秒重新整理一次,重新整理5次後退出。
//常用的選項:
-s //顯示記憶體的統計資料
-
1,procs:
r(running) //表示等待執行的佇列長度,也即等待執行的程式的個數
b(block) //表示阻塞佇列長度,也即處於不可中斷睡眠態的程式個數 -
2,memory:儲存使用記錄
swpd //交換記憶體的使用總量(總空間) free //空閒實體記憶體總量 (可用的空間) buffer //用於buffer的記憶體總量(緩衝) cache //用於cache的記憶體總量(快取) -
3,swap:交換空間,大小一般是真實記憶體的1到1.5倍。
數值越大表明記憶體在不停的呼叫,反映出記憶體不足的問題。si(swap in) //表示從實體記憶體有多少頁面換進swap,也即資料進入swap的資料速率(kb/s) so(swap out) //表示從swap有多少頁面換進實體記憶體,也即資料離開swap的資料速率(kb/s) - 4,io:寫入/輸出(in/out)
bi(block in) | //表示磁碟塊有多少個被調入記憶體中,也即從塊裝置讀入資料到系統的速率(kb/s) |
---|---|
bo(block out) | //表示有多少個磁碟塊從記憶體中被同步到硬碟上去了,也即儲存資料至塊裝置的速率(kb/s) |
-
5,system:
in( interrupts) //表示中斷的個數,也即中斷速率(kb/s) cs(context switch) //表示上下文切換的次數,也即程式切換速率(kb/s) -
6,CPU:
us | //表示使用者空間 |
---|---|
sy | //表示核心空間 |
id | //表示空閒百分比 |
wa | //表示等待IO完成所佔據的時間百分比 |
st | //表示steal,被虛擬化技術偷走的時間(比如執行虛擬機器) |
五,控制作業
1,作業與會話
-
作業控制是shell的一種功能,它允許單個shell例項執行和管理多個命令。
-
作業與在shell提示符中輸入的每個管道相關聯。該管道中的所有程式均是作業的一部分,並且是同一個程式組的成員。(如果在shell提示符中僅輸入了一條命令,則這條命令可視為命令的最小管道。該命令將是該作業的唯一成員)
-
一次只能有一個作業從特定終端視窗讀取輸入和鍵盤生成的訊號。屬於該作業的程式是該控制終端的前臺程式。
-
該控制終端的後臺程式是與該終端相關聯的任何其他作業的成員。終端的後臺程式無法從終端讀取輸入或接收鍵盤生成的中斷,但可以寫入終端。後臺中的作業可能已停止(暫停),也可能正在執行。如果某個正在執行的後臺作業嘗試從終端讀取內容,則該作業將自動暫停。
-
每個終端是其自身的會話,並且可以具有一個前臺程式和多個獨立的後臺程式。一個作業只能屬於一個會話,也就是屬於其控制終端的會話。
2,作業分類:
- Linux分為前臺作業和後臺作業
前臺作業:通過終端啟動,且啟動後一直佔據了命令提示符
後臺作業:可以通過終端啟動,但啟動後,釋放命令提示符,後續的操作在後臺完成========此類作業雖然被送往後臺執行,但其依然與終端相關,當終端關閉時改後臺也隨之停止。
- 可以通過nohup command & 剝離與終端的關係。當終端停止執行時,作業依舊在後臺進行。
3,後臺作業
- &掛起作業,後臺執行,不佔用前臺bash視窗。
[root@localhost ~]# sleep 1000 &
[1] 1819
- 1,//jobs命令用於顯示當前所有的後臺作業
[root@localhost ~]# jobs
[1]+ Running sleep 1000 &
//jobs命令的結果中
+ //命令將預設操作的作業
- //命令將第二個預設操作的作業
- 2,//fg命令用於將”後臺作業調至前臺執行“
[root@localhost ~]# fg
//當只有一個後臺作業時,直接使用fg命令,不跟任何引數即可將後臺作業調至前臺執行,但是當有多個作業時則必須跟上%+作業號,也就是上面命令執行結果中以[]括起來的數字。
[root@localhost ~]# jobs
[1]- Running sleep 1000 &
[2]+ Running sleep 500 &
[root@localhost ~]# fg %1
//使用ctrl+z可將前臺程式傳送到後臺,此時作業將處於停止狀態
[root@localhost ~]# fg %1
sleep 1000
^z
[1]+ Stopped sleep 1000
- 3,//使用bg命令+作業號可使後臺”已停止的作業重新執行“
[root@localhost ~]# bg %1
[1]+ sleep 1000 &
[root@localhost ~]# jobs
[1]- Running sleep 1000 &
[2]+ Running sleep 500 &
- 4,//kill加上作業號可以手動殺死(終止)指定作業。
[root@localhost ~]# jobs
[1]- Running sleep 1000 &
[2]+ Running sleep 500 &
[root@localhost ~]# kill %1
[1]- Terminated sleep 1000
- 5,//Nuhup:將程式掛在後臺執行:跟隨系統程式:
- 命令例項:Nuhup sleep 600 &
六,程式間通訊(IPC:inter Process Communication)
- 程式間通訊方式:
同一主機:-共享記憶體;-訊號:Signal
不同主機:-rpc:remote procecure call;-基於socket(套接字)實現程式間通訊。
套接字socket:IP+port
在終端上可以通過netstat use檢視執行的程式IP和埠。
七,使用訊號控制程式
-
訊號是傳遞至程式的軟體終端。訊號向執行中的程式報告事件,生成訊號的事件可以是錯誤或外部事件(如I/O請求或計時器過期,或者來自於明確請求(如使用訊號傳送命令),或者來自於明確請求(如使用訊號傳送命令))
-
–event事件:下面列出系統管理員用於日常程式管理的基本訊號。
-
通過短名稱(HUP)或正確名稱(SIGHUP)指代訊號。
指定一個訊號的方法:
-訊號號碼(數字標識):kill -1
-訊號完整名稱:kill -SIGKILL(訊號)
-訊號簡寫名稱:kill -TERM或kill -KILL或kill -INT或kill -HUP -
基本程式管理訊號
訊號編號 ID | 短名稱 | 定義 | 用途 |
---|---|---|---|
1 | HUP | 掛起 | 讓一個程式不用重啟就可以重讀配置檔案,並讓新的配置資訊生效 |
2 | INT | 鍵盤中斷 | 中斷一個前臺程式。ctrl+c就是用的SIGINT訊號 |
9 | KILL | 中斷,無法攔截 | 導致立即終止程式。無法被攔截、忽略或處理 |
15 預設值 | TERM | 終止 | 導致程式終止。和SIGKILL不同,可以被攔截、忽略或處理。要求程式終止的友好方式,允許自我清理 |
使用者可以中斷自己的程式,但只有root才能終止由其他人擁有的程式。
- kill命令根據ID向程式傳送訊號。雖其名稱為kill,但該命令可用於傳送任何訊號,而不僅僅是終止程式的訊號
//語法: kill [-SIGNAL] PID …
//顯示所有可用的訊號(可使用man 7 signal檢視幫助資訊)
- //killall COMMAND:killall後面跟程式名,表示將匹配到的以程式名為名的程式全部殺死
也可以使用kill 加程式ID
八,監控程式活動
1,I/O負載
-
負載平均值代表一段時間內感知的系統負載,Linux通過預期服務等待時間來表示實施平均負載計算
-
a,Linux不僅計算程式數,也作為獨立的任務計算執行緒數。執行中執行緒和等待I/O資源的執行緒的CPU請求佇列對應於R和D程式狀態。等待I/O包括處於睡眠而等待預期磁碟和網路響應的任務。
-
b,負載數屬於全域性計數器計算,是所有CPU的總和數。由於從睡眠返回的任務可能會重新排程到不同的CPU,難以精確的每CPU計數,但累計數的準確度可以保障。顯示的平均負載代表所有的CPU。
-
signal佇列長度
//檢視cpu核心數
[root@Eryuege ~]# grep ‘model name’ /proc/cpuinfo
model name : Intel® Xeon® CPU E5-2650 v3 @ 2.30GHz
[root@Eryuege ~]# grep ‘processor’ /proc/cpuinfo
processor : 0 -
一些UNIX系統僅考慮CPU使用率或執行佇列長度來指示系統負載。由於具有空閒CPU的系統可能會因為磁碟或網路資源忙而遇到很長時間的等待,因此Linux負載平均值中包含了對I/O的考量。遇到負載平均值很高但CPU活動很低時,請檢查磁碟和網路活動。(CPU使用率很低,但是負載平均值高,可能是磁碟或網路的讀寫過慢)
-
Linux中可以使用top、uptime顯示負載平均值的情況。
[root@Eryuege ~]# uptime
09:14:12 up 4 days, 22:36, 4 users, load average: 0.00, 0.00, 0.09
//此處的load average就表示負載平均值,這三個值代表最近1、5和15分鐘的負載情況。-
a,將顯示的負載平均值除以系統中的邏輯CPU數。當值低於1表示資源利用率較好,等待時間很短。當值高於1表示資源飽和,而且有一定的服務等待時間。
-
b,空閒CPU佇列的負載數為0。每個就緒和等待的執行緒使計數增加1。總佇列數為1時,資源(CPU、磁碟或網路)正在使用中,但沒有請求把時間花在等待上。增加的請求數會累積該計數,但由於許多請求可以在時限內處理,資源使用率會很高,而等待時間則不會。
-
c,因為磁碟或網路資源忙碌等待I/O而處於睡眠的程式包含在該計數內,而且使負載平均值增大。
雖然不能表示CPU使用率,佇列數依然表明使用者和程式正在等待資源服務。 -
d,在資源飽和前,平均負載將保持在1以下,因為幾乎不會在佇列中發現等待的任務。只有資源飽和導致請求留在排隊狀態並且被負載計算例程計數時,負載平均才會增大。當資源使用率接近100%時,每個增加的請求將開始遭遇服務等待時間。
-
2,實時監控-TOP
-
top用於實現全屏動態顯示系統資訊(預設按照CPU的使用率排序)
-
//常用選項
-d //設定延遲時長,top -d 1 表示每一秒重新整理一次,預設每隔5秒重新整理
-b //批模式翻屏顯示,預設只實時顯示一屏,若要顯示後面的程式資訊則可使用-b選項,與-n #號合用
-
load average:1分鐘,5分鐘,15分鐘
load average //CPU佇列中等待執行的任務的個數 -
cpu(s):多顆CPU平均負載,按1鍵顯示每顆CPU平均負載。
sy | //表示核心空間; |
---|---|
us | //表示使用者空間; |
Ni | //表示調整nice值,CPU佔用的比率; |
id | //表示空閒百分比; |
wa | //表示等待IO完成所佔據的時間百分比; |
hi | //表示hard interrupt,硬體中斷佔據的時間百分比; |
si | //表示軟中斷佔據的時間百分比; |
st | //表示steal,被虛擬化技術偷走的時間(比如執行虛擬機器) |
-
PR // 優先順序
-
NI // nice值
-
VIRT // 虛擬記憶體集
-
RES // 常駐記憶體集
-
SHR // 共享記憶體大小
-
S // 程式狀態
-
進入top實時監控後的互動命令
//top命令互動式子命令:M //根據駐留記憶體大小進行排序,預設根據CPU百分比排序 P //根據CPU使用百分比進行排序 T //根據累計時間(佔據CPU時長)進行排序 l //是否顯示平均負載和啟動時間 t //是否顯示程式和CPU狀態相關資訊 m //是否顯示記憶體相關資訊 c //是否顯示完整的命令列資訊 q //退出top命令 k //終止某個程式 1 //顯示所有CPU的資訊 s //修改重新整理時間間隔
相關文章
- 第六章 Linux檔案與目錄管理Linux
- Linux程式管理Linux
- Linux 程式管理Linux
- Linux-程式管理Linux
- Linux:程式模型和程式管理Linux模型
- Linux系統管理之程式管理Linux
- Linux詳解 --- 程式管理Linux
- Linux:使用systemd管理程式Linux
- Linux程式管理工具Linux
- Linux運維之程式管理①Linux運維
- Linux安裝及管理程式Linux
- Linux程式及作業管理Linux
- LINUX程式如何管理控制(二)Linux
- linux 基礎(10)程式管理Linux
- (1)Linux效能調優之Linux程式管理Linux
- 『學了就忘』Linux系統管理 — 84、Linux中程式的管理Linux
- Linux程式管理與效能監控Linux
- Linux 學習筆記--程式管理Linux筆記
- Linux下使用supervisor實現程式管理Linux
- Linux 程式管理常用命令總結Linux
- Linux基礎命令---mail郵件管理程式LinuxAI
- LINUX系統中程式如何管理控制(一)Linux
- 鳥哥的Linux私房菜筆記第六章Linux筆記
- Linux中程式包管理及程式的原始碼編譯Linux原始碼編譯
- 『學了就忘』Linux系統管理 — 81、程式管理介紹Linux
- 作業系統思考 第六章 記憶體管理作業系統記憶體
- 程式是怎麼跑起來的第六章
- 《程式是怎樣跑起來的》第六章
- Linux程式管理工具supervisor安裝及使用Linux
- 成華區ztzy管理系統程式碼部署 linuxLinux
- Linux程式管理工具Supervisor的安裝配置Linux
- 如何在 Linux 上使用 kill 和 killall 來管理程式Linux
- Linux磁碟管理Linux
- Linux 磁碟管理Linux
- 使用shell指令碼在Linux中管理Java應用程式指令碼LinuxJava
- 『學了就忘』Linux系統管理 — 83、Linux中程式的檢視(top命令)Linux
- Linux系統管理——Linux簡介Linux
- Linux系統管理之硬碟管理Linux硬碟