linux第六章-程式管理

二月哥-IE發表於2020-10-21

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程式狀態
標誌核心定義的狀態名稱和描述
RTASK_RUNNING:程式正在CPU上執行,或者正在等待執行。處於執行中(或可執行)狀態時,程式可能正在執行使用者例程或核心例程(系統呼叫),或者已排隊並就緒
STASK_INTERRUPTIBLE:程式處於睡眠狀態且正在等待某一條件:硬體請求、系統資源訪問或訊號。當事件或訊號滿足該條件時,該程式將返回到執行中
DTASK_UNINTERRUPTIBLE:此程式也在睡眠,但與S狀態不同,不會響應傳遞的訊號。僅在特定的條件下使用,其中程式中斷可能會導致意外的裝置狀態
KTASK_KILLABLE:程式處於睡眠狀態,與不可中斷的D狀態相同,但有所修改,允許等待中的任務通過響應訊號而被中斷(徹底退出)。實用程式通常將可中斷的程式顯示為D狀態
TTASK_STOPPED:程式已被停止(暫停),通常是通過使用者或其他程式發出的訊號。程式可以通過另一訊號返回到執行中狀態,繼續執行(恢復)
TTASK_TRACED:正在被除錯的程式也會臨時停止,並且共享同一個T狀態標誌
zEXIT_ZOMBIE:子程式在退出時向父程式發出訊號。除程式身份(PID)之外的所有資源都已釋放
XEXIT_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支援的三種選項格式
aUNIX(POSIX)選項,可以分組但必須以連字元開頭;如ps -aux
bBSD 選項,可以分組但不可與連字元同用
cGNU 長選項,以雙連字元開頭
  • 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短名稱定義用途
1HUP掛起讓一個程式不用重啟就可以重讀配置檔案,並讓新的配置資訊生效
2INT鍵盤中斷中斷一個前臺程式。ctrl+c就是用的SIGINT訊號
9KILL中斷,無法攔截導致立即終止程式。無法被攔截、忽略或處理
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//修改重新整理時間間隔

相關文章