Linux進程概念與管理

一、Linux進程概念

1.進程:Process,是運行中的程序的一個副本,有生命週期,都由其父進程創建

Linux內核存儲進程信息的固定格式:taskstruct

多個任務的的taskstruct組件的鏈表:task list

2.進程優先級:0-139

0:一般不使用

1-99:實時優先級;數字越大優先級越高,系統自動安排

100-139:靜態優先級;數字越小優先級越高,可手動更改

3.Nice值:-20至19,對應於100到139

普通用戶只能將自己的優先級調低,root用戶可以隨意調製

每個隊列有兩對:運行隊列、過期隊列,140對280隊,通過CPU中斷控制來給進程運行時間

4.進程內存

內存是以Page Frame:頁框的方式存儲頁面數據

每個內存頁框的MMU(Memory Management Unit,內存管理單元)的大小一般爲4k

進程在內存上的存儲單元可能是不連續的

5.IPC:Inter Process Communication進程間通信

同一主機上:signal信號、shm: shared memory共享內存、semerphor旗語手勢

不同主機上:rpc: remote procecure call遠程過程調用、socket套接字

6.進程類型

守護進程:在系統引導過程中啓動的進程,跟終端無關的進程;

前臺(用戶)進程:跟終端相關,通過終端啓動的進程

注意:也可把在前臺啓動的進程送往後臺,以守護模式運行;

7.進程狀態

運行態:running,進程佔用CPU,並在CPU上運行;

就緒態:ready,進程已經具備運行條件,但是CPU還沒有分配過來;

可中斷睡眠態:處於這個狀態的進程因爲等待某某事件的發生(比如等待socket連接、等待信號量),而被掛起。這些進程的task_struct結構被放入對應事件的等待隊列中。當這些事件發生時(由外部中斷觸發、或由其他進程觸發),對應的等待隊列中的一個或多個進程將被喚醒。

不可中斷睡眠:進程處於睡眠狀態,但是此刻進程是不可中斷的。不可中斷,指的並不是CPU不響應外部硬件的中斷,而是指進程不響應異步信號。絕大多數情況下,進程處在睡眠狀態時,總是應該能夠響應異步信號的。但是有延遲

可中斷:interruptable

不可中斷:uninterruptable,不可中斷,指的並不是CPU不響應外部硬件的中斷,而是指進程不響應異步信號。

停止態:暫停於內存中,但不會被調度,除非手動啓動之;stopped

僵死態:zombie,結束進程,父進程結束前,子進程不關,不可被kill, 即不響應任務信號, 無法用SIGKILL殺死

8.進程的分類

CPU-Bound:cpu密集型,對CPU佔用大,非交互式的佔用大

IO-Bound:io密集型,對io佔用大,交互式的佔用大

9.進程的數字標識16bits:

0-65535:有效使用1-65535

1-1023:固定分配,服務器使用,而且只有管理員有權限啓用;

1024-4W:半固定,服務,如mysql等

4W+:臨時;標識臨時通信進程

10.CentOS 5/6/7的啓動進程

CentOS 5: SysV init,在系統啓動和創建進程藉助腳本,串行啓動,速度慢

CentOS 6:upstart,在5的基礎上升級,同爲腳本啓動,但時可以支持並行啓動

CentOS 7:systemd,並行,以systemd爲單一進程同時啓動其他進程

二、進程管理相關命令

1.pstree:進程樹查看

常用選項:

-p:打印個進程的pid

實例:

[root@young ~]# pstree -p
systemd(1)─┬─abrt-watch-log(791)
           ├─abrt-watch-log(799)
           ├─abrtd(788)
           ├─alsactl(785)
           ├─at-spi-bus-laun(88842)─┬─dbus-daemon(88859)
           │                        ├─{at-spi-bus-laun}(88846)
           │                        ├─{at-spi-bus-laun}(88852)
           │                        └─{at-spi-bus-laun}(88865)
           ├─at-spi2-registr(88871)───{at-spi2-registr}(88873)
            ...

2.ps:process state,查看當前進程狀態

Linux各進程的相關信息在/proc目錄有一個以其PID命令的目錄下的衆多文件中.

常用選項:

a:所有與終端相關的進程;

x:所有與終端無關的進程;

u:以用戶爲中心組織進程狀態信息顯示

-e:顯示所有進程

-f:顯示完整格式的進程信息

-F:顯示完整格式的進程信息;

-H:以層級(樹狀)結構顯示進程的相關信息;

o  field1, field2,...:自定義要顯示的字段列表,以逗號分隔;

實例:

1) # ps aux:顯示所有與終端有無關聯的進程信息,一用戶爲中心組織狀態信息顯示

[root@young ~]# ps aux | head -5
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.2 128892  8792 ?        Ss   Feb06   3:34 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root          2  0.0  0.0      0     0 ?        S    Feb06   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    Feb06   0:14 [ksoftirqd/0]
root          7  0.0  0.0      0     0 ?        S    Feb06   0:00 [migration/0]

說明:

USER:運行該進程的用戶

PID:進程的ID號碼

%CPU:CPU的佔用百分比

%MEM:內存空間佔用比率,佔用整個內存空間的比例

VSZ(Virutal memory SiZe):虛擬內存集;佔用的虛擬內存大小,真正用來佔用的內存

每個內存佔用的內存有兩種:線性內存空間、物理內存空間

  • 線性內存:會映射到物理內存,在線性內存空間角度看是連續的內存佔用

  • 物理內存:實際上是以內存頁框保存,可能一個進程佔用的不連續的頁框

RSS:ResidentSize,常駐內存集;堅決不能轉換到swap中內存集

TTY:運行終端

STAT:當前進程的運行狀態,BSD樣式

  • R:running,運行態

  • S:interruptable sleeping,可中斷睡眠

  • D:uninterruptable sleeping,不可中斷睡眠

  • T:Stopped,停止狀態

  • Z:zombie,僵死狀態,進程結束後,在被回收之前狀態

  • +:表示一個前臺進程,佔據命令提示符

  • l:多線程進程

  • N:低優先級進程

  • <:高優先級進程

  • s:session leader ,回話主導進程,如shell,其主導其下的進程

START:進程開始時間

TIME:累計運行CPU時間

COMMAND:使用進程、線程,[]: 內核線程

2) # ps -ef:以完整格式顯示所有的進程信息

[root@young ~]# ps -ef|head -5
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 Feb06 ?        00:03:35 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root          2      0  0 Feb06 ?        00:00:00 [kthreadd]
root          3      2  0 Feb06 ?        00:00:14 [ksoftirqd/0]
root          7      2  0 Feb06 ?        00:00:00 [migration/0]

說明:

  • UID:啓動進程用戶

  • PID:運行進程號

  • PPID:父進程的進程號,0在內核啓動init之前存在,init啓動後終止,存在過渡,一般爲swap的進程

  • C:cpu utilization,CPU的佔用百分比

  • STIME:啓動時間

  • TTY:與其終端相關

  • TIME:累計運行CPU時間

  • CMD:啓動此進程的命令

3) # ps -eFH:樹狀層級結構顯示

F比f顯示的信息更加全面,層級結構顯示,縮進相同同層級

PSR:運行在哪顆CPU上,十進制編號,0/1/2/3

[root@young ~]# ps -eFH|head -5
UID         PID   PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
root          2      0  0     0     0   0 Feb06 ?        00:00:00 [kthreadd]
root          3      2  0     0     0   0 Feb06 ?        00:00:14   [ksoftirqd/0]
root          7      2  0     0     0   0 Feb06 ?        00:00:00   [migration/0]
root          8      2  0     0     0   0 Feb06 ?        00:00:00   [rcu_bh]

4) # ps -eo , #ps axo顯示自定義字段列表

o field1, field2,...:自定義要顯示的字段列表,以逗號分隔,o要寫在後面,因爲要帶參數

常用的field:pid,ni, pri, psr, pcpu, stat, comm, tty, ppid, rtprio

  • ni:nice值;

  • priority:priority,優先級;

  • rtprio:realtime priority,實時優先級;

    [root@young ~]# ps axo pid,ni,pri,psr|head -5
     PID  NI PRI PSR
     1   0  19   0
     2   0  19   0
     3   0  19   0
     7   - 139   0
    
    [root@young ~]# ps -eo pid,ni,pri|head -5
    PID  NI PRI
    1   0  19
    2   0  19
    3   0  19
    7   - 139

3.pgrep命令

用法:

pgrep [OPTIONS] [PATTERN]

:PATTERN: 支持正則表達元字符書寫模式實現進程過濾;

常用選項:

-U UID:僅顯示由指定用戶身份運行的進程PID
-G GID:僅顯示以指定組身份運行的進程PID
-t term: 僅顯示指定的終端設備的進程PID
-l: 顯示進程PID的同時顯示進程名
-a: 顯示完整格式的進程名
-u uid: effective user,生效者
-P pid: 顯示指定進程的子進程

實例:

1)顯示以root身份運行的進程的PID

[root@young ~]# pgrep -U root|head -5 
1
2
3
7
8

2)顯示以root組身份運行的進程的PID

[root@young ~]# pgrep -G root|head -5
1
2
3
7
8

3)顯示以tty1終端運行的進程PID

[root@young ~]# pgrep -t tty1
88406
88472
88494
88495

4)顯示以root身份運行,root組運行,且終端爲tty1進程的PID與進程名

[root@young ~]# pgrep -U root -G root -t tty1 -l
88406 bash
88472 startx
88494 xinit
88495 X

5)使用正則表達式做模式匹配

[root@young ~]# pgrep "\<bash\>" -l  
19320 bash
88406 bash
125591 bash

4.pidof:根據進程名獲取其PID;

格式:

pidof PROGRAM

實例:

[root@young ~]# pidof bash
125591 88406 81122 19320

5.top:display Linuxprocesses,動態顯示進程信息

格式:

top  [OPTION]

常用選項:

-d #:指定刷新時間間隔,默認爲3秒;

-b:以批次方式顯示;

-n #:顯示多少批次;

-p PID:通過指定監控進程ID來僅僅監控某個進程的狀態。

-c:顯示整個命令行而不只是顯示命令名

-i: 使top不顯示任何閒置或者僵死進程

常用交互式命令:

(1)在top顯示過程中通過交互式命令指定排序(默認CPU):

  • P: 按照CPU百分比大小將進程降序排序

  • M:Memory佔用量大小將進程降序排序

  • T:CPU累積時間佔用量將進程降序排序

(2)首部信息關閉

  • l: top行信息是否顯示;

  • t:是否顯示進程及CPU相關的信息

  • 1:是否單獨顯示每顆CPU的使用率

  • m: 是否顯示內存及swap相關的信息

(3)其他命令

  • q: 退出top

  • s: 修改刷新時間間隔;

  • k: 殺死指定進程

  • L:搜索字符串

說明:

load avg:

CPU上等待運行的進程隊列的隊列長度;
過去1分鐘、5分鐘、15分鐘的平均長度;

cpu(s)行解釋:

us: user space,用戶空間佔用CPU百分比
sy: system,內核空間佔用CPU百分比
ni: nice,用戶進程空間內改變過優先級的進程佔用CPU百分比
id: idle,空閒CPU百分比
wa: waiting io,等待輸入輸出的CPU時間百分比
hi: hardware interrupt,硬件CPU中斷佔用百分比
si: software interrupt,軟件CPU中斷佔用百分比
st: stolen,虛擬機佔用百分比

默認上,top顯示這些關於進程的屬性:

PID

進程ID,進程的唯一標識符

USER

進程所有者的實際用戶名。

PR

進程的調度優先級。這個字段的一些值是'rt'。這意味這這些進程運行在實時態。

NI

進程的nice值(優先級)。越小的值意味着越高的優先級。

VIRT

進程使用的虛擬內存。

RES

駐留內存大小。駐留內存是任務使用的非交換物理內存大小。

SHR

SHR是進程使用的共享內存。

S

這個是進程的狀態。它有以下不同的值:

D - 不可中斷的睡眠態。
R – 運行態
S – 睡眠態
T – 被跟蹤或已停止
Z – 殭屍態

%CPU

自從上一次更新時到現在任務所使用的CPU時間百分比。

%MEM

進程使用的可用物理內存百分比。

TIME+

任務啓動後到現在所使用的全部CPU時間,精確到百分之一秒。

COMMAND

運行進程所使用的命令。

還有許多在默認情況下不會顯示的輸出,它們可以顯示進程的頁錯誤、有效組和組ID和其他更多的信息。

實例:

[root@young ~]# top
top - 01:21:28 up 9 days, 19:36,  3 users,  load average: 0.07, 0.08, 0.06
Tasks: 419 total,   2 running, 417 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.6 us,  1.9 sy,  0.0 ni, 96.4 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3098484 total,   281664 free,   566888 used,  2249932 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  2393584 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                 
  6851 root      20   0       0      0      0 S  6.2  0.0   0:07.28 kworker/0:1                             
 84869 root      20   0  146412   2240   1368 R  6.2  0.1   0:00.01 top                                     
     1 root      20   0  128996   8856   1712 S  0.0  0.3   3:37.38 systemd

# top   //每隔3秒顯式所有進程的資源佔用情況
# top -d 2  //每隔2秒顯式所有進程的資源佔用情況
# top -c  //每隔3秒顯式進程的資源佔用情況,並顯示進程的命令行參數(默認只有進程名)
# top -p 12345 -p 6789//每隔5秒顯示pid是12345和pid是6789的兩個進程的資源佔用情況
# top -d 2 -c -p 123456 //每隔2秒顯示pid是12345的進程的資源使用情況,並顯式該進程啓動的命令行參數

更加詳細內容: http://www.cnblogs.com/qiwenhui/articles/4262044.html

:VIRT=SWAP+RES

6.htop命令

需要安裝(第三方安裝包):

[root@localhost~]#  yum  install -y htop

(1)常用選項:

-d #:指定延遲時間間隔;

-u UserName:僅顯示指定用戶的進程;

-s COLUME:以指定字段進行排序;

(2)常用交互式命令:

l:顯示選定的進程打開的文件列表;

s:跟蹤選定的進程的系統調用;

t:以層級關係顯示各進程狀態;

u: 僅顯示指定用戶的進程

k:發送信號,15通常用來殺死命令,15不起作用可用用9信號

#:快速定位到PID爲#的進程上

(3)顯示描述

e7fb8cbb196857c8.png

左上方數據:表示每顆CPU、內存、交換內存的使用率

右上方數據

  • Tasks:當前的任務數量,用戶空間進程

  • thr:線程數量

  • running:運行的數量

  • Load average :過去一分鐘、五分鐘、十五分鐘的平均負載

(4)支持鼠標操作的文本窗口

h命令獲取幫助 0bd74c85bc49cc98.png

(5)獲取支持排序字段

[root@young ~]# htop --sort-key=help 
PID
Command
STATE
PPID
PGRP
SESSION
TTY_NR
TPGID
FLAGS


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章