程序和任務

傲世九天發表於2024-04-26

程序和任務

目錄
  • 程序和任務
    • 一、程式和程序的關係
      • 1、程式
      • 2、程序
        • 2.1 程序具有的特徵
        • 2.2 執行緒和程序的關係
          • 2.2.1 執行緒:程式執行的最小單位
          • 2.2.2 程序:資源分配的最小單位
          • 2.2.3 檢視單執行緒還是多執行緒
        • 2.3 程序使用記憶體的問題
          • 2.3.1 解決方法
        • 2.4 程序狀態
          • 2.4.1 過濾殭屍程序
        • 2.5 程序分類
    • 二、檢視程序資訊
      • 1、檢視靜態程序資訊——ps
        • 1.1 常用選項
        • 1.2欄位分析
      • 2、檢視動態資訊 ——top
        • 2.1常用選項
        • 2.2互動操作選項
      • 3、 檢視程序資訊——pgrep
        • 3.1格式
        • 3.2常用選項
      • 4、 檢視程序樹——pstree
        • 4.1 格式
        • 4.2常用選項
      • 5、檢視系統中已被開啟的檔案
        • 5.1 格式
        • 5.2 常用選項
    • 三、程序的啟動方式
      • 1、手工啟動
        • 1.1 前臺啟動:使用者輸入命令,直接執行程式
        • 1.2 後臺啟動:在命令列尾加入"&"
    • 四、程序的前後臺排程
      • 1、Ctrl +Z組合鍵
      • 2、jobs 命令
      • 3、fg命令
    • 五、結束程序
      • 1、Ctrl + c 組合鍵
      • 2、kill、killall命令
        • 2.1格式
        • 2.2 常用選項

一、程式和程序的關係

1、程式

執行特定任務的一串程式碼,靜態,存在硬碟中

2、程序

執行中的程式叫做程序,動態,存在記憶體中有生命週期

2.1 程序具有的特徵

  • 動態性:程序是程式的一次執行過程,是臨時的,有生命期的,是動態產生,動態消亡的;
  • 併發性:任何程序都可以同其他程序一起併發執行;
  • 獨立性:程序是系統進行資源分配和排程的一個獨立單位;
  • 結構性:程序由程式、資料和程序控制塊三部分組成。

2.2 執行緒和程序的關係

2.2.1 執行緒:程式執行的最小單位
  • 執行緒 是CPU排程的最小單位(程式執行流的最小單元),它被包含在程序之中,是程序中的實際運作單元。
  • 一條執行緒是程序中一個單一順序的控制流,一個程序中可以併發多個執行緒,每條執行緒並行執行不同的任務
  • (一個執行緒掛掉會影響其他執行緒,而程序之間是互相隔離的,互不影響)
2.2.2 程序:資源分配的最小單位
  • 程序 是程式執行時的一個例項,即它是程式已經執行到課中程度的資料結構的彙集。
  • 從核心的觀點看,程序的目的就是擔當分配系統資源(CPU時間、記憶體等)的基本單位
2.2.3 檢視單執行緒還是多執行緒

image-20240417183112387

image-20240417183638574

另一個方法:

image-20240417183906300

2.3 程序使用記憶體的問題

  • 記憶體洩露:指程式中用malloc或new申請了一塊記憶體,但是沒有用free或delete將記憶體釋放,導致這塊記憶體一直處於佔用狀態

  • 記憶體溢位:指程式申請了10M的空間,但是在這個空間寫入10M以上位元組的資料,就是溢位,類似紅杏出牆

  • 記憶體不足:“記憶體用完了”,在情況在java程式中比較常見。系統會選一個程序將之殺死,在日誌messages中看到類似下面的提示:

    *Jul 10 10:20:30 kernel: Out of memory: Kill process 9527 (java) score 88 or sacrifice child**
    

    當JVM因為沒有足夠的記憶體來為物件分配空間並且垃圾回收器也已經沒有空間可回收時,就會丟擲這個error,因為這個問題已經嚴重到不足以被應用處理)。

2.3.1 解決方法
  • 限制java程序的max heap,並且降低java程式的worker數量,從而降低記憶體使用

  • 給系統增加swap空間

2.4 程序狀態

基本狀態 描述
建立狀態 建立狀態:程序在建立時需要申請一個空白PCB(process control block程序控制塊),向其中填寫控制和管理程序的資訊,完成資源分配。如果建立工作無法完成,比如資源無法滿足,就無法被排程執行,把此時程序所處狀態稱為建立狀態
就緒狀態 程序已準備好,已分配到所需資源,只要分配到CPU就能夠立即執行
執行狀態 程序處於就緒狀態被排程後,程序進入執行狀態
阻塞狀態 在執行的程序由於某些事件(I/O請求,申請快取區失敗)而暫時無法執行,程序受到阻塞。在滿足請求時進入就緒狀態等待系統呼叫
終止狀態 程序結束,或出現錯誤,或被系統終止,進入終止狀態。無法再執行

如圖:

image-20240417164829698

還有幾個其他的狀態:

  • 執行態:running
  • 就緒態:ready
  • 睡眠態:分為兩種,可中斷:interruptable,不可中斷:uninterruptable
  • 停止態:stopped,暫停於記憶體,但不會被排程,除非手動啟動
  • 僵死態:zombie,殭屍態,結束程序,父程序結束前,子程序不關閉,殺死父程序可以關閉僵死態 的子程序
2.4.1 過濾殭屍程序

首先建立一個殭屍程序

image-20240417171155870

過濾殭屍程序

image-20240417171327220

2.5 程序分類

作業系統分類:

  • 協作式多工:早期 windows 系統使用,即一個任務得到了 CPU 時間,除非它自己放棄使用CPU ,否則將完全霸佔 CPU ,所以任務之間需要協作——使用一段時間的 CPU ,主動放棄使用
  • 搶佔式多工:Linux核心,CPU的總控制權在作業系統手中,作業系統會輪流詢問每一個任務是否需要使用 CPU ,需要使用的話就讓它用,不過在一定時間後,作業系統會剝奪當前任務的 CPU 使用權,把它排在詢問佇列的最後,再去詢問下一個任務

程序型別:

  • 守護程序: daemon,在系統引導過程中啟動的程序,和終端無關程序
  • 前臺程序:跟終端相關,透過終端啟動的程序

注意:兩者可相互轉換

二、檢視程序資訊

1、檢視靜態程序資訊——ps

1.1 常用選項

命令 作用
a 顯示當前終端下的所有程序資訊,包括使用者的程序
u 使用以使用者為主的格式輸出程序資訊
x 顯示當前使用者在所有終端下的程序資訊
-e 顯示系統內的所有程序資訊
-l 使用長格式顯示程序資訊
-f 使用完整的格式顯示程序資訊
k|--sort 對屬性排序,屬性前加-表示倒序 ps aux k -%cpu
o屬性 選項顯示定製的資訊pid、cmd.....

例項:

ps -aux

image-20240417185814729

ps -ef

image-20240417185857840

ps aux k -pid

image-20240417190436095

1.2欄位分析

image-20240417190650075

表頭 含義
USER 該程序是由哪個使用者產生的。
PID 程序的 ID。
%CPU 該程序佔用 CPU 資源的百分比,佔用的百分比越高,程序越耗費資源。
%MEM 該程序佔用實體記憶體的百分比,佔用的百分比越高,程序越耗費資源。
VSZ 該程序佔用虛擬記憶體的大小,單位為 KB。
RSS 該程序佔用實際實體記憶體的大小,單位為 KB。
TTY 該程序是在哪個終端執行的。其中,tty1 ~ tty7 代表本地控制檯終端(可以透過 Alt+F1 ~ F7 快捷鍵切換不同的終端),tty1~tty6 是本地的字元介面終端,tty7 是圖形終端。pts/0 ~ 255 代表虛擬終端,一般是遠端連線的終端,第一個遠端連線佔用 pts/0,第二個遠端連線佔用 pts/1,依次増長。?代表和終端無關,系統程序
STAT 程序狀態。常見的狀態有以下幾種: -D:不可被喚醒的睡眠狀態,通常用於 I/O 情況。
-R:該程序正在執行。
-S:該程序處於睡眠狀態,可被喚醒。
-T:停止狀態,可能是在後臺暫停或程序處於除錯狀態。
-W:記憶體互動狀態(從 2.6 核心開始無效)。
-X:死掉的程序(應該不會出現)。
-Z:殭屍程序。程序已經中止,但是還是佔用硬體資源。
-<:高優先順序(以下狀態在 BSD 格式中出現)。
-N:低優先順序。
-L:被鎖入記憶體。
-s:包含子程序。
-l:多執行緒(小寫 L)。
-+:位於後臺。
START 該程序的啟動時間。
TIME 該程序佔用 CPU 的運算時間,注意不是系統時間。
COMMAND 產生此程序的命令名。

image-20240417190755768

表頭 含義
F 程序標誌,說明程序的許可權,常見的標誌有兩個: 1:程序可以被複制,但是不能被執行;4:程序使用超級使用者許可權;
S 程序狀態。具體的狀態和"psaux"命令中的 STAT 狀態一致;
UID 執行此程序的使用者的 ID;
PID 程序的 ID;
PPID 父程序的 ID;
C 該程序的 CPU 使用率,單位是百分比;
PRI 程序的優先順序,數值越小,該程序的優先順序越高,越早被 CPU 執行;系統定義不可以人為修改
NI 程序的優先順序,數值越小,該程序越早被執行;可以人為修改
ADDR 該程序在記憶體的哪個位置;
SZ 該程序佔用多大記憶體;
WCHAN 該程序是否執行。"-"代表正在執行;
TTY 該程序由哪個終端產生;
TIME 該程序佔用 CPU 的運算時間,注意不是系統時間;
CMD 產生此程序的命令名;

2、檢視動態資訊 ——top

2.1常用選項

命令 作用
-d秒數 指定top命令每隔幾秒更新。預設是3秒
-b 使用批處理模式輸出。一般和"-n"選項合用,用於把 top 命令重定向到檔案中;
-n 指定 top 命令執行的次數。一般和"-"選項合用;
-p 程序PID:僅檢視指定 ID 的程序;
-s 使 top 命令在安全模式中執行,避免在互動模式中出現錯誤;
-u 使用者名稱:只監聽某個使用者的程序;

2.2互動操作選項

命令 作用
?/h 顯示互動模式的幫助;
c 按照 CPU 的使用率排序,預設就是此選項;
M 按照記憶體的使用率排序;
N 按照 PID 排序;
T 按照 CPU 的累積運算時間排序,也就是按照 TIME+ 項排序;
k 按照 PID 給予某個程序一個訊號。一般用於中止某個程序,訊號 9 是強制中止的訊號;
r 按照 PID 給某個程序重設優先順序(Nice)值;
q 退出 top 命令;

2.3 欄位分析

image-20240417191825778

行列名稱 各欄位涵義
第一行任務佇列資訊 14 : 09 : 16(系統時間)up 5:31(系統已執行時長)2user(當前登入使用者數)oad average: 0.00, 0.01, 0.05(系統負載,即單位時間內系統處理的任務數,後面三個數值分別為1分鐘、5分鐘、15分鐘前到現在的平均值)(Load Average的值應該小於CPU個數核數0.7)
第二行為程序資訊 Tasks(總程序數)running(正在執行的程序數 )sleeping(休眠的程序數) stopped(中止的程序數) zombie(僵死的程序數)
第三行為CPU資訊 us(使用者佔用)sy(核心佔用)ni(優先順序排程佔用)id(空閒CPU,要了解空閒的CPU百分比,主要看%id 部分)wa(I/O等待佔用)hi(硬體中斷佔用)si(軟體中斷佔用)st(虛擬化佔用)
第四行為記憶體資訊 total(總記憶體空間)free(空閒記憶體)used(已用記憶體)buff/cache(實體記憶體和交換記憶體的緩衝區總和)
第五行為交換空間資訊 total(總交換空間)free(空閒交換空間)used(已用交換空間)avail Mem(可用物理空間)

3、 檢視程序資訊——pgrep

3.1格式

pgrep “程序名”   #預設只輸出PID號,相似的命令"pidof"

3.2常用選項

選項 功能
-l 顯示程序名
-U 指定特定使用者
-t 指定終端

例項:

pgrep:

image-20240418135411439

pidof:

image-20240418140739885

4、 檢視程序樹——pstree

4.1 格式

pstree [選項] 

4.2常用選項

命令 作用
-a 顯示完整資訊
-u 列出對應使用者名稱
-p 列出對應的PID號

image-20240418140308126

5、檢視系統中已被開啟的檔案

5.1 格式

lsof[選項]

5.2 常用選項

命令 作用
-c 字串 只列出以字串開頭的程序開啟的檔案。
+d 目錄名 列出某個目錄中所有被程序呼叫的檔案。
-u 使用者名稱 只列出某個使用者的程序開啟的檔案。
-p pid 列出某個 PID 程序開啟的檔案。

例項:

image-20240418142620561

image-20240418142730559

image-20240418144941847

三、程序的啟動方式

1、手工啟動

1.1 前臺啟動:使用者輸入命令,直接執行程式

image-20240418145531269

1.2 後臺啟動:在命令列尾加入"&"

image-20240418145844923

四、程序的前後臺排程

1、Ctrl +Z組合鍵

將當前程序掛起,調入後臺並停止執行

2、jobs 命令

檢視處於後臺的任務列表

3、fg命令

將後臺程序恢復到前臺執行,可指定任務序號

例項:

image-20240418150526474

五、結束程序

1、Ctrl + c 組合鍵

中斷正在執行的命令

2、kill、killall命令

kill用於終止指定pid號的程序

killall用於終止指定名稱相關的所有程序

2.1格式

kill [訊號] PID
killall [選項] [訊號] 程序名

2.2 常用選項

訊號編號 訊號名 含義
0 EXIT 程式退出時收到該資訊。
1 HUP 掛掉電話線或終端連線的掛起訊號,這個訊號也會造成某些程序在沒有終止的情況下重新初始化。
2 INT 表示結束程序,但並不是強制性的,常用的 "Ctrl+C" 組合鍵發出就是一個 kill -2 的訊號。
3 QUIT 退出。
9 KILL 殺死程序,即強制結束程序。
11 SEGV 段錯誤。
15 TERM 正常結束程序,是 kill 命令的預設訊號。

六、計劃任務管理

1、at命令

一次性計劃任務

1.1格式:

at [HH:MM] [yyyy-mm-dd]                #指定時間設定任務(不加年月日表示當天)ctrl+D退出 

atq                                    #檢視未執行的任務列表 

atrm [任務序號]                        #刪除第一條任務

image-20240418152438757

image-20240418152621502

2、crontab命令

週期性計劃任務

2.1 格式

crontab -e [-u 使用者名稱]         #編輯計劃任務,-u預設時表示當前使用者
crontab -l [-u 使用者名稱]         #檢視計劃任務
crontab -r [-u 使用者名稱]         #刪除計劃任務

2.1 常用選項

選項 功能
-u user 用來設定某個使用者的 crontab 服務,例如 "-u demo" 表示裝置 demo 使用者的 crontab 服務,此選項一般有 root 使用者來執行。
-e 編輯某個使用者的 crontab 檔案內容。如果不指定使用者,則表示編輯當前使用者的 crontab 檔案。
-l 顯示某使用者的 crontab 檔案內容,如果不指定使用者,則表示顯示當前使用者的 crontab 檔案內容。
-r 從 /var/spool/cron 刪除某使用者的 crontab 檔案,如果不指定使用者,則預設刪除當前使用者的 crontab 檔案。
-i 在刪除使用者的 crontab 檔案時,給確認提示。

例項:

image-20240418161147000

image-20240418160752703

欄位解析:

專案 含義 範圍
第一個"*" 一小時當中的第幾分鐘(minute) 0~59
第二個"*" 一天當中的第幾小時(hour) 0~23
第三個"*" 一個月當中的第幾天(day) 1~31
第四個"*" 一年當中的第幾個月(month) 1~12
第五個"*" 一週當中的星期幾(week) 0~7(0和7都代表星期日)
特殊符號 含義
*(星號) 代表任何時間。比如第一個"*"就代表一小時種每分鐘都執行一次的意思。
,(逗號) 代表不連續的時間。比如"0 8,12,16***命令"就代表在每天的 8 點 0 分、12 點 0 分、16 點 0 分都執行一次命令。
-(中槓) 代表連續的時間範圍。比如"0 5 ** 1-6命令",代表在週一到週六的凌晨 5 點 0 分執行命令。
/(正斜線) 代表每隔多久執行一次。比如"/10***命令",代表每隔 10 分鐘就執行一次命令。

相關文章