麒麟操作系統之進程管理
前言:
1、在LINUX中,每個執行的程序(代碼)都稱為一個進程。每一個進程都分配一個ID號。
2、每一個進程,都會對應一個父進程,而這個父進程可以復制多個子進程。
3、每個進程都可能以兩種方式存在的。前台與后台,所謂前台進程就是用戶目前的屏幕上可以進行操作的。后台進程則是實際在操作,但由於屏幕上無法看到的進程,通常使用后台方式執行。
4、一般系統的服務都是以后台進程的方式存在,而且都會常駐在系統中。直到關機才才結束。
1、進程與服務簡介
當程序加載到內存中運行時,內存中的那個數據就稱為進程。
* 在麒麟操作系統中,程序通過用戶的執行來觸發,觸發任何一個事件時,系統都會將它定義為一個進程。為了能夠管理這個進程,操作系統會給予這個進程一個PID,同時根據觸發這個進程的用戶和相關屬性關系,給予這個PID一組有效的權限設置。
長期運行在內存中的進程,且可以提供一些系統或網絡功能,稱為服務。
* 服務(service)本質就是進程,但是是運行在后台的,通常都會監聽某個端口,等待其他程序的請求,比如mysql,sshd,防火牆等,因此我們又稱為守護進程(daemon)。
2、進程的類型
根據進程的特點,把進程可以分為下面三類:
交互進程
由shell啟動的進程,它既可以在前台運行,也可以在后台運行。交互進程在執行過程中,要求與用戶進行交互操作。簡單來說就是用戶需要給出某些參數或者信息,進程才能繼續執行。
批處理進程
與windows原來的批處理很類似,是一個進程序列。該進程負責按照順序啟動其它進程。
守護進程
是執行特定功能或者執行系統相關任務的后台進程。守護進程只是一個特殊的進程,不是內核的組成部分。許多守護進程在系統啟動時啟動,直到系統關閉時才停止運行。而某些守護進程只是在需要時才會啟動,比如FTP或者Apache服務等,可以在需要的時候才啟動該服務。
根據進程狀態的不同,又可以把進程分為另外三類:
守護進程
所有守護進程都可以超級用戶(用戶ID為0)的優先權運行;守護進程沒有控制終端;守護進程的父進程都是init進程(即1號進程)。
孤兒進程
一個父進程退出后,它的一個或多個子進程還在運行,那么這些子進程將成為孤兒進程。孤兒進程將被init進程所收養,並由init進程對它們完成狀態收集工作
僵屍進程
一個子進程結束但是沒有完全釋放內存(在內核中的task_struct沒有釋放),該進程就成為僵屍進程。當僵屍進程的父進程結束后該僵屍進程就會被init進程所收養,最終被回收。僵屍進程會導致資源的浪費,而孤兒進程不會。

狀態
|
意義
|
Runnable(可運行狀態)
|
進程可以被執行
|
Sleeping(睡眠狀態)
|
進程正在等待某些資源
|
Zombie(僵化狀態)
|
進程試圖消亡
|
Stopped(停止狀態)
|
進程被掛起(不允許執行)
|
Runnable 可運行狀態
處於可運行狀態的進程,代表着它獲得了需要的全部資源,只等CPU有時間就可以馬上執行。一旦進程執行了一個不能立即完成的系統調用,那么這個進程將轉入睡眠狀態,等待資源。
Sleeping 睡眠狀態
睡眠狀態的進程,被阻塞,等待資源以喚醒,也可以通過其他進程信號或時鍾中斷喚醒,進入可運行隊列。有一種深度睡眠狀態不可被其他進程信號或時鍾中斷喚醒。
Zombie 僵化狀態
僵化狀態的進程,其父進程還沒有詢問子進程狀態時,子進程就已經停止了,稱該進程處於僵死狀態,資源未釋放。為了讓父進程能夠獲取其停止運行的信息,此時子進程的任務數據結構信息還需要保留。
Stopped 停止狀態
停止狀態的進程,當進程收到相應的信號就會進入暫停狀態。
3、服務的類型
按照服務安裝方式,服務可以分為兩種:
使用deb、rpm安裝包安裝的服務:服務的安裝位置按照deb、rpm包設定好的目錄。這些包啟動的服務通常會加入到系統服務目錄中,通過service、systemctl等配合參數可以啟動(如systemctl start mysqld)。
使用源碼包編譯安裝的服務:可以手動指定安裝目錄。源碼包安裝的服務默認需用啟動腳本文件的絕對路徑配合參數來啟動(如/usr/local/nginx/sbin/nginx start)。
4、進程管理
(1)圖形管理
點擊開始菜單->系統監視器(或在桌面任務欄點擊右鍵選擇系統監視器)。如下圖,可以看到進程的狀態、CPU占用率、優先級、PID、占用內存大小等信息。

(2)通過命令查看進程的信息
PS
ps命令是最基本同時也是非常強大的進程查看命令,使用該命令可以確定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程占用了過多的資源等。

例1:查看所有進程。
- kylin@kylin-1:~$ps aux
USER PID%CPU%MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 130104 6956?Ss 10:44 0:02/sbin/init spl
……此處省略多行……
kylin 7884 0.0 0.1 46064 3360 pts/0 R+11:36 0:00 ps aux
對例1的選項解釋說明:
選項
|
說明
|
USER
|
說明該程序是屬於哪個用戶的
|
PID
|
該程序的代號
|
%CPU
|
代表該程序使用了多少CPU資源
|
%MEM
|
代表該程序使用了多少的RAM
|
VSZ,RSS
|
占去的ram的大小(bytes)
|
TTY
|
是否為登入者執行的程序?
若為tty1-tty6則為本機登入者,
若為pts/??則為遠程登入者執行的程序;
|
STAT
|
該程序的狀態,
(R)為可執行的
(S)為該程序正在睡眠中,就是沒有執行了
(T)正在偵測或是停止了
(Z)僵屍程序,就是zombie死掉的程序
|
START
|
該程序開始的日期;
|
TIME
|
該程序跑了多久時間;
|
COMMAND
|
該程序的內容。
|
小練習
- ps aux |grep mate-system-monitor|grep –v grep
- pstree -p:pstree命令以樹狀圖的方式展現進程之間的派生關系,顯示效果比較直觀。
(3)查看進程的實時信息
top命令可以實時動態地查看系統的整體運行情況,是一個綜合了多方信息監測系統性能和運行信息的實用工具。通過top命令所提供的互動式界面,用熱鍵可以管理。
top 選項
ü -c:顯示完整的命令。
ü -d:屏幕刷新間隔時間。
ü -p<進程號>:指定進程。
ü -n<次數>:循環顯示的次數。
Top的交互命令,在終端輸入top后,再在終端輸入交互選項。
選項
|
說明
|
q
|
退出程序
|
k
|
終止一個進程
|
s
|
改變兩次刷新之間的延遲時間(單位為s),
如果有小數,就換算成ms。輸入0值則系統將不斷刷新,默認值是3s;
|
m
|
切換顯示內存信息;
|
t
|
切換顯示進程和CPU狀態信息;
|
c
|
切換顯示命令名稱和完整命令行;
|
M
|
根據駐留內存大小進行排序;
|
P
|
根據CPU使用百分比大小進行排序
|
例2:使用top命令實時監控系統的進程狀態。
kylin@kylin-1:~$top
top-15:57:35 up 2:30,2 users,load average:0.08,0.02,0.01
Tasks:200 total,1 running,198 sleeping,0 stopped,1 zombie
%Cpu(s):8.1 us,4.7 sy,0.0 ni,87.2 id,0.0 wa,0.0 hi,0.0 si,0.0 st
KiB Mem:2028480 total,956292 free,465084 used,607104 buff/cache
KiB Swap:3142652 total,3142652 free,0 used.1367696 avail Mem
PID USER PR NI VIRT RES SHR S%CPU%MEM TIME+COMMAND
6668 kylin 20 0 694448 51076 41240 S 5.6 2.5 7:19.78 mate-syste+
778 root 20 0 250748 71244 30628 S 4.0 3.5 1:02.95 Xorg
6992 kylin 20 0 805332 45000 34660 S 1.3 2.2 0:06.85 mate-termi+
- 對top命令結果的解釋:
- top-15:57:35[當前系統時間],
- up 2:30[系統已經運行了兩個半小時],
- 2 users[2個用戶當前登錄],
- load average:0.08,0.02,0.01
[系統負載,即任務隊列的平均長度]
- Tasks:200 total[總進程數],
- 1 running[正在運行的進程數],
- 198 sleeping[睡眠的進程數],
- 0 stopped[停止的進程數],
- zombie[僵化進程數],
- 對top命令結果的解釋:
- %Cpu(s):8.1%us[用戶空間占用CPU百分比],
- 4.7%sy[內核空間占用CPU百分比],
- KiB Mem:2028480 total[物理內存總量],
- 465084 used[使用的物理內存總量],
- 956292 free[空閑內存總量],
- 607104 buffers[用作內核緩存的內存量],
- 對top命令結果的解釋:
- PID:進程ID,進程的唯一標識符
- USER:進程所有者的實際用戶名。
- PR:進程的調度優先級。這個字段的一些值是'rt'。
這意味這這些進程運行在實時態。
- NI:進程的nice值(優先級)。越小的值意味着越高的優先級。
負值表示高優先級,正值表示低優先級
- S:這個是進程的狀態。
它有以下不同的值:
- D-不可中斷的睡眠態。
- R–運行態
- S–睡眠態
- T–被跟蹤或已停止
- Z–僵屍態
(4)進程的優先級和執行順序
- 進程cpu資源分配就是指進程的優先權(priority)。優先權高的進程有優先執行權利。配置進程優先權對多任務環境的麒麟系統很有用,可以改善系統性能。還可以把進程運行到指定的CPU上,這樣一來,把不重要的進程安排到某個CPU,可以大大改善系統整體性能。
- 我們在top中看到的PR和NI兩個選項,PR代表這個程序“可被執行的優先級”,也就是動態優先級,越小越早被執行。NI代表這個程序的nice值,nice值就是“系統可被執行的修正數值”,即靜態優先級。默認情況下,進程的靜態優先級應該是從父進程繼承來的,這個值一般是0。
進程的優先級和執行順序
由於PRI是越小越快被執行,當我們加入nice值之后,將使得PRI變為:
PRI(new)=PRI(old)+nice
當nice值為負值的時候,那么該程序將會提前被執行!但是只有具有root權限的身份者,可以將程序的nice調為負值。
一般使用者可用nice值:0~19
root管理員可用nice值:-20~19
nice命令就是設置一個要執行command進程的nice值。
nice[-n number]command
-n:就是后面的number數值
renice命令就是設置一個已經在運行的進程的nice值
renice [number] PID
例3:將某個將要執行的程序nice值減3。
· kylin@kylin-1:~$nice -n -3 firefox
nice:無法設置優先級:權限不夠
公共的 模板 視頻 圖片 文檔 下載 音樂 桌面
· kylin@kylin-1:~$sudo nice -n -3 firefox
(root權限才可以降低nice值)
[sudo]kylin的密碼:
· kylin@kylin-1:~$top
(同時使用top命令查看PR和NI值的變化)
例4:修改某個正在執行的程序的nice值。
使用top命令查看到mate-system-monitor(系統監視器)的PID
是6668,PR值是20,NI值是0
PID USER PR NI VIRT RES SHR S%CPU%MEM TIME+COMMAND
6668 kylin 20 0 694448 51076 41240 S 5.6 2.5 7:19.78 mate-system-monitor
使用renice命令修改nice值
kylin@kylin-1:~$sudo renice 10 6668
6668(process ID)old priority 0,new priority 10
再次使用top命令查看PR值和NI值
PID USER PR NI VIRT RES SHR S%CPU%MEM TIME+COMMAND
6668 in 30 10 694448 51076 41240 S 5.3 2.5 10:10.50 mate-system-monitor
(5)信號和終止進程
- 終結進程是我們通常都會碰到的事情。有時,我們可能需要終結某個程序的所有實例。命令行提供了多種用於終結程序的方法。在麒麟操作系統中與進程相關的一個重要概念就是信號。信號是一種進程間通信的機制,它用來中斷運行的進程以執行某些操作。終止程序也是通過使用信號技術來實現的。
- 每一種信號都同一個整數值相關聯。當進程接收到一個信號時,它會通過執行對應的信號處理程序(singal handler)來進行響應。在shell腳本中同樣可以發送、接收信號,並對其進行處理。KILL就是用於終止進程的信號的命令。像CTRL+C、CTRL+Z這種作業都屬於信號。kill命令可用來向進程發送信號,而trap命令用來處理所接收的信號。
例4:列出所有可用的信號,打印出信號數(signal number)和信號名稱。
- kylin@kylin-1:~$kill -l
1)SIGHUP 2)SIGINT 3)SIGQUIT 4)SIGILL 5)SIGTRAP
中間省略……
63)SIGRTMAX-1 64)SIGRTMAX
雖然可以指定很多信號,我們經常用到的其實只有少數幾個:

用來中止進程時,kill命令的用法:
kill [-s 信號名稱] pid [pid2]……
或
kill [-信號編號] pid [pid2]……
例5:終止一個或多個進程。
- 查看vsftpd和ssh進程的PID
- kylin@kylin-1:~$ps aux|grep vsftpd
root 11844 0.0 0.1 26092 2380?Ss 17:10 0:00/usr/sbin/vsftpd/etc/vsftpd.conf
kylin 11867 0.0 0.0 20888 1092 pts/0 S+17:10 0:00 grep--color=auto vsftpd
- kylin@kylin-1:~$ps aux|grep sshd
root 11794 0.0 0.2 69624 5600?Ss 17:08 0:00/usr/sbin/sshd-D
kylin 11869 0.0 0.0 20888 1032 pts/0 S+17:10 0:00 grep--color=auto sshd
- 然后殺死這兩個進程
- kylin@kylin-1:~$sudo kill 11844 11794
例6:如果要強行殺死進程,則使用:$kill -s SIGKILL PID或者$kill -9 PID
- kylin@kylin-1:~$ps aux|grep vsftpd
root 11910 0.0 0.1 26092 2392?Ss 17:14 0:00/usr/sbin/vsftpd/etc/vsftpd.conf
- kylin@kylin-1:~$sudo kill -s SIGKILL 11910
- kylin@kylin-1:~$sudo /etc/init.d/vsftpd restart
[ok]Restarting vsftpd(via systemctl):vsftpd.service.
- kylin@kylin-1:~$ps aux|grep vsftpd
root 11964 0.0 0.1 26092 2376?Ss 17:15 0:00/usr/sbin/vsftpd/etc/vsftpd.conf
- kylin@kylin-1:~$sudo kill -9 11964