一、進程和線程的概念
1.進程
?(1)概念
進程是程序在操作系統中的一次執行過程,是系統進行資源分配和調度的基本單位。進程是程序的執行實例,擁有獨立的資源(如內存、文件描述符等)。每個進程在創建時會被分配唯一的進程ID,即為PID,也叫進程編號。
(2)特點
資源隔離:進程擁有獨立的虛擬地址空間。
獨立性:進程崩潰通常不會直接影響其他進程,代表了其高隔離性的特點。
通信成本高:進程間通信(IPC)需通過管道、共享內存、信號、消息隊列等機制。
創建開銷大:fork()系統調用會復制父進程的上下文。
2.線程
(1)概念
線程是進程中的一個執行單元,是 CPU 調度和分派的基本單位,是進程內的執行單元,共享進程的資源(如內存、文件句柄),但擁有獨立的棧和寄存器上下文。
(2)特點
資源共享:線程直接共享進程的內存、全局變量等,通信更高效。
輕量級:線程創建和切換的開銷遠小于進程。
同步需求:共享資源需通過互斥鎖(mutex)、信號量(semaphore) 等機制避免競態條件。
高風險:一個線程崩潰可能導致整個進程終止(共享地址空間)。
3.進程的狀態
運行態(Running) | 進程正在 CPU 上執行,系統中處于運行態的進程在某一時刻只有一個(單核 CPU),多核 CPU 環境下可以有多個。 |
就緒態(Ready) | 進程已經準備好運行,只等待 CPU 資源分配。 |
阻塞態(Blocked) | 進程因等待某一事件(如 I/O 操作完成、信號量獲取等)而暫時無法繼續執行。 |
停止態(Stopped) | 進程被暫停執行,通常是收到了特定信號(如 SIGSTOP)。 |
僵死態(Zombie) | 進程已經終止,但父進程尚未回收其資源(如進程描述符等)。 |
4.進程和線程之間的聯系與對比
(1)聯系:
線程隸屬于進程,且同一進程內的線程共享同一個進程ID(PID),但每個線程有唯一的線程ID(TID)。
(2)對比:
進程 | 線程 | |
資源分配 | 擁有獨立內存空間與系統資源,如文件描述符、打開文件等,進程間資源隔離,一個進程崩潰不影響其他進程,像辦公軟件進程崩潰不影響瀏覽器進程。 | 共享所屬進程資源,無獨立系統資源,但有獨立執行棧與程序計數器記錄執行狀態。 |
調度 | 是系統資源分配和調度基本單位,調度時需保存和恢復內存映射、寄存器狀態等大量上下文信息,開銷大。 | 是 CPU 調度和分派基本單位,因共享進程資源,調度時僅保存和恢復執行棧、程序計數器等少量信息,開銷小。 |
創建、銷毀和切換開銷 | 創建要分配獨立內存與系統資源,銷毀需釋放,創建、銷毀及切換時保存和恢復大量上下文信息,開銷均大。 | 創建和銷毀僅分配、釋放少量資源,切換時保存和恢復少量上下文信息,開銷小且速度快。 |
通信機制 | 進程間通信(IPC)依靠管道、消息隊列等專門機制,較復雜,要額外同步、互斥操作保證數據安全一致。 | 可直接訪問共享內存變量來通信,方式簡單高效,但多線程同時訪問共享資源易出現數據競爭,需鎖等同步機制保障線程安全。 |
健壯性 | 進程間資源隔離,健壯性較高,一個進程崩潰通常不影響其他進程。 | 同一進程內線程共享資源,一個線程崩潰可能致使整個進程崩潰,健壯性較低。 |
二、查看進程狀態的相關命令
查看進程狀態的命令有(常用):ps、ps ax、ps aux、pgrep、pidof、top
1、ps相關命令(ps、ps ax、ps aux)
ps命令的常用參數表
參數 | 說明 | 示例 |
基礎選項 | ||
a | 顯示所有用戶的進程(包括其他用戶)。 | ps a |
x | 顯示無控制終端的進程(如守護進程)。 | ps x |
ax | 組合使用:顯示所有進程(包括無終端的進程)。 | ps ax |
信息控制 | ||
-o <字段> | 自定義輸出字段(支持?pid ,?user ,?%cpu ,?comm ,?tty ,?stat ?等)。 | ps axo pid,user,comm,%cpu |
u | 顯示詳細資源占用(用戶、CPU、內存等,類似?ps aux )。 | ps aux |
-e | 顯示所有進程(等效于?ax ,但屬于Unix風格參數)。 | ps -e |
篩選過濾 | ||
-p <PID> | 顯示指定PID的進程。 | ps ax -p 1234 |
-U <用戶> | 顯示指定用戶的進程。 | ps ax -U root |
-C <命令> | 按進程名過濾(支持部分匹配)。 | ps ax -C nginx |
--ppid <PID> | 顯示父進程為指定PID的子進程。 | ps ax --ppid 1 |
格式化輸出 | ||
--sort | 按字段排序(+%cpu ?升序,-%mem ?降序)。 | ps ax --sort=-%cpu |
-H | 顯示進程層級關系(樹形結構)。 | ps axH |
-f | 顯示完整格式(包括命令行參數)。 | ps axf |
線程查看 | ||
-L | 顯示線程(LWP列)。 | ps axL |
-T | 顯示線程(SPID列)。 | ps axT |
ps ax的默認輸出列
列名 | 說明 | 示例 |
PID | 進程的唯一標識符(Process ID)。 | 1234 |
TTY | 進程關聯的終端設備: -? ? :無控制終端(如守護進程)。-? pts/0 :虛擬終端或SSH會話。 | ? ?或?pts/0 |
STAT | 進程狀態(由多個字符組成,見下方詳細說明)。 | Ss ,?R+ ,?D |
TIME | 進程累計占用CPU的時間(格式為分鐘:秒 )。 | 00:01 ,?10:23 |
COMMAND | 啟動進程的命令名稱或命令行參數: -? [] ?表示內核線程。 | /usr/bin/nginx ,?[kworker] |
?ps aux的默認輸出列
列名 | 說明 | 示例 |
USER | 進程的所有者(用戶賬號)。 | root ,?nginx |
PID | 進程的唯一標識符(Process ID)。 | 1234 |
%CPU | 進程占用CPU的百分比(單位:%),基于最近一次刷新周期內的使用情況。 | 0.5 ,?99.0 |
%MEM | 進程占用物理內存的百分比(單位:%)。 | 2.3 ,?15.8 |
VSZ | 虛擬內存大小(Virtual Memory Size,單位:KB),即進程申請的虛擬內存總量。 | 123456 (約123MB) |
RSS | 實際使用的物理內存(Resident Set Size,單位:KB),即進程當前占用的非交換內存。 | 65432 (約65MB) |
TTY | 進程關聯的終端設備: -? ? :無控制終端(如守護進程)。-? pts/0 :虛擬終端或SSH會話。 | ? ?或?pts/0 |
STAT | 進程狀態(由多個字符組成,見下方詳細說明)。 | Ss ,?R+ ,?Dl |
START | 進程啟動時間(格式為小時:分鐘或日期,取決于運行時長)。 | 10:00 ,?Jan01 |
TIME | 進程累計占用CPU的時間(格式為分鐘:秒 )。 | 00:01 ,?120:45 |
COMMAND | 啟動進程的命令名稱或命令行參數: -? [] ?表示內核線程。 | /usr/bin/nginx ,?[kworker] |
2、pgrep
作用:
pgrep
?用于根據?進程名、用戶、組等條件快速查找進程PID,默認僅輸出匹配的進程ID(PID)。
與ps
/grep
組合相比,pgrep
更高效且語法簡潔。?
pgrep常用參數表
參數 | 說明 | 輸出新增內容 | 示例 |
基礎過濾 | |||
-u <用戶> | 按用戶過濾進程(用戶名或UID)。 | 僅PID | pgrep -u root |
-G <組> | 按組過濾進程(組名或GID)。 | 僅PID | pgrep -G www-data |
-x | 精確匹配進程名(需全名匹配)。 | 僅PID | pgrep -x sshd |
輸出控制 | |||
-l | 顯示進程名(與PID一同輸出)。 | 進程名 | 1234: nginx |
-a | 顯示完整命令行(需結合-l )。 | 完整命令 | 1234: nginx: worker process |
-c | 輸出匹配進程的數量(計數)。 | 數字 | 3 |
-d <分隔符> | 自定義PID分隔符(默認為換行)。 | 無,格式變化 | pgrep -d ',' nginx ?→?1234,5678 |
信號與狀態 | |||
-f | 匹配完整命令行(而非僅進程名)。 | 無,過濾條件變化 | pgrep -f "nginx -g" |
-n | 僅顯示最新(最近啟動)的進程PID。 | 僅PID | pgrep -n nginx |
-o | 僅顯示最舊(最早啟動)的進程PID。 | 僅PID | pgrep -o nginx |
?
3、pidof
命令:
pidof 進程名稱示例
pidof nginx # 輸出:1234 5678 (多個nginx進程的PID)
pidof sshd # 輸出:8910 (sshd守護進程的PID)
顯示單個PID(-s):
pidof -s <進程名> # 僅返回一個PID(通常是最新的進程)示例
pidof -s python3 # 輸出:9999 (最近啟動的Python3進程PID)
pidof常用參數表?
參數 | 說明 |
-s | 僅返回一個PID(單實例進程適用)。 |
-c | 僅返回與當前運行環境相同根目錄(chroot)下的進程PID。 |
-x | 同時匹配執行該腳本的Shell進程PID(用于腳本文件)。 |
-o <PID> | 排除指定PID的進程(可多次使用,如?-o 1234 -o 5678 )。 |
-d <分隔符> | 自定義PID分隔符(默認是空格)。 |
4、top
概念:
top
?是 Linux 系統中用于?實時監控系統資源使用情況和進程狀態?的核心命令行工具。它能動態顯示 CPU、內存、交換分區、進程負載等關鍵指標,幫助用戶快速定位性能瓶頸。
(1)top 的核心功能
① 實時刷新:
默認每 3 秒更新一次數據(可配置)。
② 多維度展示:
系統資源概覽:
CPU、內存、負載、運行時間等。
進程列表:
按資源占用排序的進程詳情(PID、用戶、CPU、內存等)。
③ 交互式操作:
支持動態排序、篩選、終止進程等操作。
(2)top內容詳解(實例演示)
第一行:系統時間、運行時長、登錄用戶數、平均負載。
第二行:進程總數及狀態統計(運行、睡眠、停止、僵尸)。
第三行:CPU 使用率(用戶態 us、內核態 sy、空閑 id、等待I/O wa 等)。
第四行:物理內存使用情況(總量、空閑、已用、緩存)。
第五行:交換分區使用情況。
關鍵字眼:
PID:進程ID。
USER:進程所有者。
%CPU:CPU 占用百分比。
%MEM:物理內存占用百分比。
VIRT:虛擬內存總量(KB)。
RES:實際物理內存占用(KB)。
SHR:共享內存大小(KB)。
S:進程狀態(R=運行, S=睡眠, Z=僵尸等)。
TIME+:累計 CPU 占用時間。
三、進程的前/后臺調用
<ctrl>+<z>:
在終端中,當一個進程正在前臺運行并占用著 shell 時,按下?Ctrl + Z
?組合鍵可以將該進程暫停并打入后臺掛起。此時,進程處于停止狀態,但并未終止,它會釋放對終端的控制權,讓用戶可以在 shell 中繼續輸入其他命令。
bg:
用于將后臺掛起的進程在后臺運行起來。
fg:
用于把后臺進程調回前臺。
命令 &:
在命令后面加上?&
,可以讓該命令對應的進程在后臺運行。
jobs:
命令用于查看當前 shell 中在后臺的所有工作,即顯示所有后臺進程的信息,包括進程的編號、狀態以及對應的命令等。
四、進程的優先級
1、概念
在 Linux 系統中,進程優先級決定了進程獲取 CPU 時間的順序。優先級高的進程會更頻繁地被調度執行,這對系統性能調優和資源管理至關重要。
2、優先級種類
(1)概念
進程也分為“可控的”和“不可控的”,“可控”,說明進程可以被用戶或管理員進行修改或手動設置,這種即為靜態優先級,而“不可控”,即不能被用戶或管理員進行修改等操作,由系統內核根據進程的運行狀態來調整(如等待時間、CPU 使用率),優化調度公平性,避免低優先級進程長期饑餓,這種即為動態優先級。
(2)靜態優先級的調節
用戶通過 nice 或 renice 設置,范圍 -20(最高)到 19(最低),能直接影響普通進程的初始調度權重。
nice值
? ? ? ? nice值用來調整控制進程優先級的,nice值越低(越負),優先級就越高;Nice 值范圍:-20(最高優先級)到 19(最低優先級),默認值為 0
命令格式:
nice -n <調整值> <命令> ? # 調整值為目標 Nice 值與默認值(0)的差值
示例??:
解釋:用指定權限-5來打開cat命令?
renice值
?renice命令可以修改進程的nice值,如renice -5 3595,其中 -5 為你想要修改的nice值為多少,后面的編號3595即為進程編號
Tips:查看進程編號可以用監視(watch)來監控進程的pid,即可看到進程編號,也可以用vim &來查看
命令格式:
renice -5(想要修改的nice值) 16410(進程編號)
(3)進程狀態字符解釋
字符 | 說明 |
R | 進程正在運行或在就緒隊列中等待 CPU 分配。 |
S | 可中斷睡眠:等待事件完成(如 I/O 操作、信號)。 |
D | 不可中斷睡眠:通常等待硬件操作(如磁盤 I/O),不能被信號中斷。 |
Z | 僵尸進程:進程已終止,但其退出狀態未被父進程回收。 |
T | 進程被作業控制信號(如?SIGSTOP 、SIGTSTP )暫停。 |
t | 進程被調試器暫停(如通過?ptrace ?跟蹤)。 |
X | 進程完全終止(極少見,通常瞬間消失)。 |
< | 高優先級:進程的 Nice 值為負(優先級高于默認)。 |
N | 低優先級:進程的 Nice 值為正(優先級低于默認)。 |
s | 會話領導者:進程是會話(Session)的首進程(如 Shell 進程)。 |
l | 多線程:進程是多線程的(有多個輕量級進程 LWP)。 |
+ | 前臺進程組:進程屬于終端的前臺進程組(可接收輸入)。 |
L | 鎖定內存:進程將部分內存鎖定(如通過?mlock ?避免換出)。 |
I | 空閑進程:內核線程處于空閑狀態(某些系統顯示為?I )。 |
五、進程信號
1.概念:
進程信號是操作系統用于在進程之間傳遞事件通知的一種機制,它可以讓操作系統、其他進程或進程自身向某個進程發送信號,以通知該進程發生了特定的事件,進程接收到信號后會根據信號的類型和自身的狀態做出相應的反應。
2.用戶可控制的進程信號(表格)
信號名稱 | 信號值 | 默認行為 | 典型用途 | 可否捕獲/忽略 |
SIGHUP | 1 | 終止進程 | 通知進程重新加載配置(如?nginx -s reload )。 | 可 |
SIGINT | 2 | 終止進程 | 用戶按下?Ctrl+C ?中斷前臺進程。 | 可 |
SIGQUIT | 3 | 終止進程并生成核心轉儲 | 用戶按下?Ctrl+\ ?強制終止并調試(生成 core dump)。 | 可 |
SIGKILL | 9 | 強制終止進程 | 無條件終止進程(無法被捕獲或忽略)。 | 否 |
SIGTERM | 15 | 終止進程 | 請求進程正常退出(允許清理資源),默認的?kill ?信號。 | 可 |
SIGSTOP | 17,19,23 | 暫停進程 | 暫停進程(不可被捕獲或忽略),用戶按下?Ctrl+Z (實際發送?SIGTSTP )。 | 否 |
SIGCONT | 18,25,26 | 繼續運行 | 恢復被暫停的進程(如?bg /fg ?命令)。 | 可 |
SIGTSTP | 20 | 暫停進程 | 用戶按下?Ctrl+Z ?暫停前臺進程(可捕獲處理)。 | 可 |
SIGUSR1 | 10 | 終止進程 | 用戶自定義用途(如通知進程切換日志文件)。 | 可 |
SIGUSR2 | 12 | 終止進程 | 用戶自定義用途(如通知進程更新配置)。 | 可 |
3、控制進程信號的命令
(1)killall命令
該命令可以向內核詢問一個進程存不存在,如:
killall -<信號名或值> <進程名> # 向所有同名進程發送信號如
killall -0(信號編號) gedit(進程的名字或編號)
其中的 -0 位為信號編號,且有許多其他數字代表,但用戶可以控制的常用信號只有代碼這些(上面的表有詳細的介紹):-1? -2? -3? -15? -9? -18? -19? -20
(2)kill命令
kill可以精準的將一個進程殺死(結束)如:
kill -<信號名或值> <PID> # 向指定 PID 發送信號如
kill -9(信號編號) 16410(進程的名字或編號)
(3)pkill命令
pkill -<信號名或值> <模式> # 按模式匹配進程并發送信號
pkill可以終止一個用戶
我們先創建一個用戶test來測試pkill命令,并登錄上此test用戶
另起一個終端命令行,輸入pkill命令
六、systemd守護進程
1.概念
守護進程(Daemon)是一種在后臺持續運行的特殊進程,它不與終端直接交互,通常在系統啟動 時自動啟動,并在系統關閉時才停止。
2.作用
守護進程的設計目的是為系統提供各種服務,例如網絡服務(如 HTTP 服務器、FTP 服務器)、日 志服務、定時任務服務等。它們默默地在后臺運行,為其他進程和用戶提供支持,確保系統的正常 運行。
3.特性(核心)
特性 | 說明 |
無控制終端 | 脫離終端運行(TTY 顯示為?? ),不接收用戶直接輸入。 |
后臺運行 | 默默執行任務,不占用用戶交互界面。 |
獨立會話 | 創建新會話(Session)并成為會話領導者(Session Leader)。 |
脫離父進程 | 通過兩次?fork() ?脫離原進程,由?init (PID=1)接管。 |
固定工作目錄 | 通常將工作目錄設置為根目錄(/ )或特定目錄(如?/var/run )。 |
日志輸出 | 將標準輸入/輸出重定向到文件(如?/var/log )或?syslog 。 |
4.常用命令表
命令 | 作用 | 示例 |
systemctl start <服務名> | 啟動服務 | sudo systemctl start nginx |
systemctl stop <服務名> | 停止服務 | sudo systemctl stop sshd |
systemctl restart <服務名> | 重啟服務 | sudo systemctl restart mysql |
systemctl reload <服務名> | 重新加載配置(不重啟服務) | sudo systemctl reload nginx |
systemctl status <服務名> | 查看服務狀態 | systemctl status docker |
systemctl enable <服務名> | 啟用開機自啟 | sudo systemctl enable httpd |
systemctl disable <服務名> | 禁用開機自啟 | sudo systemctl disable postfix |
systemctl is-enabled <服務名> | 檢查服務是否開機自啟 | systemctl is-enabled cron |
systemctl mask <服務名> | 禁用服務(阻止手動或自動啟動) | sudo systemctl mask apache2 |
systemctl unmask <服務名> | 解除禁用 | sudo systemctl unmask apache2 |