天天看點

linux程序管理本章節目标程序基本概述程序狀态程序優先級程序管理指令

文章目錄

  • 本章節目标
  • 程序基本概述
    • 程序的組成部分
    • 程序的環境
    • 程序的産生
    • 程序的分類
  • 程序狀态
    • linux程序狀态
  • 程序優先級
    • linux程序排程與多任務
    • 程序優先級
    • 相對優先級
    • nice級别與權限
    • 程序優先級調整
  • 程序管理指令
    • ps
      • 實驗操作
    • pstree
    • pgrep
    • pidof
    • vmstat

本章節目标

程序基本概述
程序狀态
程序優先級
程序管理指令
控制作業 (下期)
程序間的通信 (下期)
使用信号控制程序 (下期)
監控程序活動 (下期)

程序基本概述

程序是已啟動的可執行程式的運作中執行個體。

/proc目錄下以數字為名的目錄,每一個目錄代表一個程序,儲存着程序的屬性資訊。每一個程序的PID是唯一的,就算程序退出了,其它程序也不會占用其PID。

程序的組成部分

  • 已配置設定記憶體的位址空間
  • 安全屬性,包括所有權憑據和特權
  • 程式代碼的一個或多個執行線程
  • 程序狀态

程序的環境

  • 本地的全局變量
  • 目前排程上下文
  • 配置設定的系統資源,如檔案描述符合網絡端口

程序的産生

現有的(父)程序複制自己的位址空間(fork)來建立一個新的(子)程序結構。

每個新程序配置設定有一個唯一的程序ID(PID),滿足跟蹤和安全性之需。PID與父程序ID(PPID)是新程序環境的元素。

任何程序可建立子程序。所有程序都是第一個系統程序的後代。

RHEL7上,第一個系統程序是systemd

linux程式管理本章節目标程式基本概述程式狀态程式優先級程式管理指令

程序的分類

  • 前台程序:與終端相關的程序,通過終端啟動的程序
    • 注意:也可把在前台啟動的程序送往背景,以守護模式運作
  • 守護程序:daemon,與終端無關的程序(如核心),在系統引導過程中啟動的程序

程序狀态

linux程式管理本章節目标程式基本概述程式狀态程式優先級程式管理指令

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,被虛拟化技術偷走的時間(比如運作虛拟機)
           

繼續閱讀