文章目錄
- 本章節目标
- 程序基本概述
-
- 程序的組成部分
- 程序的環境
- 程序的産生
- 程序的分類
- 程序狀态
-
- linux程序狀态
- 程序優先級
-
- linux程序排程與多任務
- 程序優先級
- 相對優先級
- nice級别與權限
- 程序優先級調整
- 程序管理指令
-
- ps
-
- 實驗操作
- pstree
- pgrep
- pidof
- vmstat
本章節目标
程序基本概述
程序狀态
程序優先級
程序管理指令
控制作業 (下期)
程序間的通信 (下期)
使用信号控制程序 (下期)
監控程序活動 (下期)
程序基本概述
程序是已啟動的可執行程式的運作中執行個體。
/proc目錄下以數字為名的目錄,每一個目錄代表一個程序,儲存着程序的屬性資訊。每一個程序的PID是唯一的,就算程序退出了,其它程序也不會占用其PID。
程序的組成部分
- 已配置設定記憶體的位址空間
- 安全屬性,包括所有權憑據和特權
- 程式代碼的一個或多個執行線程
- 程序狀态
程序的環境
- 本地的全局變量
- 目前排程上下文
- 配置設定的系統資源,如檔案描述符合網絡端口
程序的産生
現有的(父)程序複制自己的位址空間(fork)來建立一個新的(子)程序結構。
每個新程序配置設定有一個唯一的程序ID(PID),滿足跟蹤和安全性之需。PID與父程序ID(PPID)是新程序環境的元素。
任何程序可建立子程序。所有程序都是第一個系統程序的後代。
RHEL7上,第一個系統程序是systemd
程序的分類
- 前台程序:與終端相關的程序,通過終端啟動的程序
- 注意:也可把在前台啟動的程序送往背景,以守護模式運作
- 守護程序:daemon,與終端無關的程序(如核心),在系統引導過程中啟動的程序
程序狀态
xcuting //運作态
Ready //就緒态,也可以稱作睡眠态
Uninterruptible sleep //不可中斷的睡眠。不可随時喚醒,隻有當IO資源加載成功後才能喚醒
Interruptible sleep //可中斷的睡眠。可随時喚醒
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 | 會話程序首程序 |
程序優先級
linux程序排程與多任務
現代計算機系統中既包含每次隻能執行一個指令的低端處理器,也包含高性能超級計算機,這些超級計算機每台配備數百個CPU,每個CPU上具有多個核心,它們可以并行執行數以百計的指令。但是所有這些系統往往具有一個共同點:它們需要運作的程序數量總是超出實際具有的核心數。
通過時間分片技術,Linux(和其他作業系統)實際能夠運作的程序數(和線程數)可以超出可用的實際處理單元數。作業系統程序排程程式将在單個核心上的程序之間進行快速切換,進而給使用者一種有多個程序在同時運作的印象。
執行此切換的Linux核心部分稱為程序排程程式。
程序優先級
- 程序優先級範圍:0-139,數字越小,優先級越高
- 0-99:實時優先級,核心調整
- 100-139:靜态優先級,使用者可控制
- 程序優先級高的特點:
- 獲得更多的CPU運作時間
- 更優先獲得CPU運作的機會
要修改程序的優先級可以通過調整程序的nice值來實作,nice值越小,優先級越高:
nice值的範圍是(-20,19),-20對應100,19對應139
相對優先級
由于不是每種程序都與其他程序同樣重要,可告知排程程式為不同的程序使用不同的排程政策。正常系統上運作的大多數程序所使用的排程政策稱為SCHED_OTHER,但還有一些其他政策可用于不同的目的。
由于并非所有程序都以同樣的方式建立,可為采用SCHED_NORMAL政策運作的程序指定相對優先級。此優先級稱為程序的nice值。一個程序可以有40種不同級别的nice值。
這些nice級别的範圍是從-20到19。預設情況下,程序将繼承其父程序的nice級别,通常為0
nice級别越高,表示優先級越低(該程序容易将其CPU使用量讓給其他程序)
nice級别越低,表示優先級越高(該程序更加不傾向于讓出CPU)
如果不存在資源争用(例如當活動程序數少于可用CPU核心數時),即使nice級别高的程序也将仍使用它們可使用的所有可用CPU資源。但當請求CPU時間的程序數超過可用核心數時,nice級别較高的程序将比nice級别較低的程序收到更少的CPU時間
nice級别與權限
為很占CPU資源的程序設定較低的nice級别可能會對同一系統上運作的其他程序的性能造成負面影響,是以僅允許root使用者設定負nice級别以及降低現有程序的nice級别。
普通非特權使用者僅允許設定正的nice級别。隻能對現有程序提升nice級别,而不能降低nice級别。
程序優先級調整
程序優先級調整:調整nice值
//調整已經啟動的程序的nice值:
renice NI PID(例:renice 3 3704)
//在啟動時指定nice值:(-20,19)
nice -n NI COMMAND
[[email protected] ~]# ps -el | grep vim
4 S 0 1622 1583 0 80 0 - 37333 poll_s pts/1 00:00:00 vim
[[email protected] ~]# renice 19 1622
1622 (程序 ID) 舊優先級為 0,新優先級為 19
[[email protected] ~]# ps -el | grep vim
4 S 0 1622 1583 0 99 19 - 37333 poll_s pts/1 00:00:00 vim
程序管理指令
ps
ps(process state)指令用于列出目前的程序。可以顯示詳細的程序資訊,包括:
- 使用者識别符(UID),它确定程序的特權
- 唯一程序識别符(PID)
- CPU和已經花費的實時時間
- 程序在各種位置上配置設定的記憶體數量
- 程序的位置STDOUT,稱為控制終端
- 目前的程序狀态
ps支援三種選項格式:
- UNIX(POSIX)選項,可以分組但必須以連字元開頭
- BSD 選項,可以分組但不可與連字元同用
- GNU 長選項,以雙連字元開頭
ps(process state),顯示程序資訊。注意事項:
- 加了[]中括号的,表示核心線程,通常位于頂部
- exiting或defunct表示僵屍程序
//常用選項:
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 //運作時的累積時長
實驗操作
指令選項【-a】
作用:顯示所有與終端有關的程序
[[email protected] ~]# ps -a
PID TTY TIME CMD
1463 pts/0 00:00:00 bash
1475 pts/0 00:00:00 ps
指令選項【-u】
作用:顯示程序是有哪個使用者啟動的
[[email protected] ~]# ps -u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 781 0.0 0.0 110044 828 tty1 Ss+ 15:08 0:00 /sbin/agetty --noclear tty1 linux
root 1404 0.0 0.0 115392 2020 pts/0 Ss 15:08 0:00 -bash
root 1463 0.0 0.0 115392 2044 pts/0 S 15:08 0:00 bash
root 1487 0.0 0.0 151064 1816 pts/0 R+ 15:11 0:00 ps -u
指令選項【-x】
作用:顯示所有與終端無關的程序
//截取部分
[[email protected] ~]# ps -x
PID TTY STAT TIME COMMAND
1 ? Ss 0:01 /usr/lib/systemd/systemd --switched-root --syst
2 ? S 0:00 [kthreadd]
3 ? S 0:00 [ksoftirqd/0]
4 ? S 0:00 [kworker/0:0]
5 ? S< 0:00 [kworker/0:0H]
6 ? S 0:00 [kworker/u256:0]
7 ? S 0:00 [migration/0]
8 ? S 0:00 [rcu_bh]
9 ? S 0:00 [rcu_sched]
10 ? S 0:00 [watchdog/0]
11 ? S 0:00 [watchdog/1]
12 ? S 0:00 [migration/1]
13 ? S 0:00 [ksoftirqd/1]
指令選項【-e】
作用:顯示作用程序,與-A效果相同
//截取部分
[[email protected] ~]# ps -e
PID TTY TIME CMD
1 ? 00:00:01 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:00 ksoftirqd/0
5 ? 00:00:00 kworker/0:0H
7 ? 00:00:00 migration/0
8 ? 00:00:00 rcu_bh
9 ? 00:00:00 rcu_sched
10 ? 00:00:00 watchdog/0
11 ? 00:00:00 watchdog/1
12 ? 00:00:00 migration/1
13 ? 00:00:00 ksoftirqd/1
14 ? 00:00:00 kworker/1:0
15 ? 00:00:00 kworker/1:0H
17 ? 00:00:00 kdevtmpfs
18 ? 00:00:00 netns
指令選項【-l】
作用:以長格式顯示
[[email protected] ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1404 1399 0 80 0 - 28848 do_wai pts/0 00:00:00 bash
4 S 0 1463 1404 0 80 0 - 28848 do_wai pts/0 00:00:00 bash
0 R 0 1499 1463 0 80 0 - 37235 - pts/0 00:00:00 ps
指令選項【-F】
作用:顯示更詳細的完整格式的程序資訊
[[email protected] ~]# ps -F
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
root 1404 1399 0 28848 2020 1 15:08 pts/0 00:00:00 -bash
root 1463 1404 0 28848 2044 0 15:08 pts/0 00:00:00 bash
root 1500 1463 0 37766 1788 0 15:17 pts/0 00:00:00 ps -F
指令選項【-f】
作用:顯示更詳細的完整格式的程序資訊
[[email protected] ~]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 1404 1399 0 15:08 pts/0 00:00:00 -bash
root 1463 1404 0 15:08 pts/0 00:00:00 bash
root 1501 1463 0 15:18 pts/0 00:00:00 ps -f
指令選項【-H】
作用:以程序層級格式顯示程序相關資訊
[[email protected] ~]# ps -H
PID TTY TIME CMD
1404 pts/0 00:00:00 bash
1463 pts/0 00:00:00 bash
1504 pts/0 00:00:00 ps
指令選項【-o】
作用:根據自己的需求選擇要顯示的字段
[[email protected] ~]# ps -o pid,ni,uid,tty
PID NI UID TT
1404 0 0 pts/0
1463 0 0 pts/0
1508 0 0 pts/0
雜合選項【-aux】
[[email protected] ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.2 0.1 194652 6456 ? Ss 15:07 0:01 /usr/lib/
root 2 0.0 0.0 0 0 ? S 15:07 0:00 [kthreadd
root 3 0.0 0.0 0 0 ? S 15:07 0:00 [ksoftirq
root 5 0.0 0.0 0 0 ? S< 15:07 0:00 [kworker/
root 7 0.0 0.0 0 0 ? S 15:07 0:00 [migratio
root 8 0.0 0.0 0 0 ? S 15:07 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S 15:07 0:00 [rcu_sche
pstree
yun provides semanage //反向查找自己需要的yum源包
pstree用于顯示目前系統上的程序樹
[[email protected] ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─agetty
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─irqbalance
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rhnsd
├─rhsmcertd
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd───bash───bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─vmtoolsd───{vmtoolsd}
pgrep
以grep風格指定隻顯示哪些程序,在目前系統中找符合某些特性的程序。隻顯示程序号
[[email protected] ~]# pgrep sshd
1109
1399
1600
[[email protected] ~]# ps -ef | grep sshd
root 1109 1 0 15:08 ? 00:00:00 /usr/sbin/sshd -D
root 1399 1109 0 15:08 ? 00:00:00 sshd: [email protected]/0
root 1600 1109 0 15:34 ? 00:00:00 sshd: [email protected]/2
root 1666 1604 0 15:41 pts/2 00:00:00 grep --color=auto sshd
pidof
根據程序名查找PID号
[[email protected] ~]# pidof sshd
1600 1399 1109
[[email protected] ~]# ps -ef | grep sshd
root 1109 1 0 15:08 ? 00:00:00 /usr/sbin/sshd -D
root 1399 1109 0 15:08 ? 00:00:00 sshd: [email protected]/0
root 1600 1109 0 15:34 ? 00:00:00 sshd: [email protected]/2
root 1671 1604 0 15:43 pts/2 00:00:00 grep --color=auto sshd
vmstat
虛拟記憶體狀态檢視指令
//文法:vmstat [options] [delay] [count]]
//例
vmstat 2 //表示每2秒重新整理一次
vmstat 2 5 //表示每2秒重新整理一次,重新整理5次後退出
//常用選項:
-s //顯示記憶體的統計資料
[[email protected] ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 3399384 2788 295884 0 0 47 10 52 49 0 0 99 0 0
procs:
r(running) //表示等待運作的隊列長度,也即等待運作的程序的個數
b(block) //表示阻塞隊列長度,也即處于不可中斷睡眠态的程序個數
memory:
swpd //交換記憶體的使用總量
free //空閑實體記憶體總量
buffer //用于buffer的記憶體總量
cache //用于cache的記憶體總量
swap:
si(swap in) //表示從實體記憶體有多少頁面換進swap,也即資料進入swap的資料速率(kb/s)
so(swap out) //表示從swap有多少頁面換進實體記憶體,也即資料離開swap的資料速率(kb/s)
io:
bi(block in) //表示磁盤塊有多少個被調入記憶體中,也即從塊裝置讀入資料到系統的速率(kb/s)
bo(block out) //表示有多少個磁盤塊從記憶體中被同步到硬碟上去了,也即儲存資料至塊裝置的速率(kb/s)
system:
in( interrupts) //表示中斷的個數,也即中斷速率(kb/s)
cs(context switch) //表示上下文切換的次數,也即程序切換速率(kb/s)
CPU:
us //表示使用者空間
sy //表示核心空間
id //表示空閑百分比
wa //表示等待IO完成所占據的時間百分比
st //表示steal,被虛拟化技術偷走的時間(比如運作虛拟機)