UNIX 進程管理

2018-08-12 22:12 更新

進程管理

如果用戶在 UNIX 操作系統(tǒng)上執(zhí)行了一個程序,那么操作系統(tǒng)會為這個程序創(chuàng)建一個運行它的特定環(huán)境。這個環(huán)境包含系統(tǒng)運行該程序所需的一切資源,使得好像系統(tǒng)中沒有運行其他程序一樣。

用戶如果在 UNIX 操作系統(tǒng)中輸入一個指令,操作系統(tǒng)就會創(chuàng)建(啟動)一個相應的進程。比如,如果用戶希望使用 ls 指令來列出目錄內(nèi)的文件列表時,系統(tǒng)就啟動了一個進程來完成這個任務。簡單的說,進程就是一個可執(zhí)行程序的實例。

操作系統(tǒng)通過一個 5 位的 ID 號碼來追蹤進程,這個 ID 號碼 通常被稱為pid 或進程 ID。操作系統(tǒng)中的每一個進程都有唯一 pid。

由于所有的進程 ID 是循環(huán)使用的,所以 pid 是會重復的。不過,在操作系統(tǒng)中,不存在兩個進程擁有統(tǒng)一進程 ID 的情況。

創(chuàng)建進程

如果用戶創(chuàng)建一個進程(執(zhí)行一個指令),那么可以兩種方式來運行它。

  • 前臺進程
  • 后臺進程

前臺進程

默認情況下,任何一個用戶創(chuàng)建的進程都會在前端執(zhí)行。該進程可以從鍵盤獲取輸入信息并且可以將執(zhí)行結(jié)果反饋到顯示器上。

我們可以使用 ls 指令來觀察這個過程。如果用戶希望列出當前目錄下的所有文件,用戶需要在終端命令行鍵入如下指令:

    $ls ch*.doc

這個指令將會顯示所有文件名稱以 ch 開頭,以 .doc 結(jié)尾的文件。

    ch01-1.doc   ch010.doc  ch02.docch03-2.doc 
    ch04-1.doc   ch040.doc  ch05.docch06-2.doc
    ch01-2.doc   ch02-1.doc

該指令對應的進程在前臺進行,輸出結(jié)果直接顯示在顯示屏上,如果 ls 執(zhí)行需要獲取輸入,那么該進程會等待來自鍵盤的輸入信息。

當程序在前臺執(zhí)行的時候,用戶無法執(zhí)行其他的指令(創(chuàng)建其他的進程),這是因為系統(tǒng)會提示其他進程無法創(chuàng)建直到當前進程執(zhí)行完畢。

后臺進程

后臺進程不需要鍵盤輸入的信息就可以執(zhí)行。如果后臺進程需要鍵盤等外設的輸入信息的話,那么它會等待。

后臺進程的優(yōu)點是用戶可以執(zhí)行其他的指令。用戶此時不需要等待進程結(jié)束就可以執(zhí)行其他的進程。

開啟一個后臺進程的最簡單的方法就是在指令的末尾添加 & 標識符。

    $ls ch*.doc &

這個指令也會示所有文件名稱以 ch 開頭,以 .doc 結(jié)尾的文件。

    ch01-1.doc   ch010.doc  ch02.docch03-2.doc 
    ch04-1.doc   ch040.doc  ch05.docch06-2.doc
    ch01-2.doc   ch02-1.doc

如果這里的 ls 指令希望得到輸入信息,它會轉(zhuǎn)換為停止狀態(tài)直到用戶將他轉(zhuǎn)到前臺并獲取到從鍵盤來的輸入信息。

第一行顯示了后臺進程的信息——作業(yè)號和進程 ID,用戶需要使用作業(yè)號來完成前景和后臺之間的切換。

如果用戶按下回車鍵,可以看到如下信息:

    [1]   +   Done ls ch*.doc &
    $

第一行表示 ls 指令的后臺進程已經(jīng)成功執(zhí)行。第二行提示可以執(zhí)行其他的指令。

列出處于執(zhí)行狀態(tài)的進程

可以使用 ps 指令來顯示當前操作系統(tǒng)處于執(zhí)行狀態(tài)的進程,結(jié)果如下:

    $ps
    PID     TTY     TIMECMD   

    18358   ttyp3   00:00:00sh
    18361   ttyp3   00:01:31abiword
    18789   ttyp3   00:00:00ps

使用 ps 指令時,通常會選擇 -f 選項。該選項可以顯示更為詳細的內(nèi)容。

    $ps -f
    UID      PID  PPID C STIME       TTY     TIME CMD
    amrood   6738 3662 0 10:23:03    pts/6   0:00 first_one
    amrood   6739 3662 0 10:22:54    pts/6   0:00 second_one
    amrood   3662 3657 0 08:10:53    pts/6   0:00 -ksh
    amrood   6892 3662 4 10:51:50    pts/6   0:00 ps -f

下面是 -f 選項列出內(nèi)容的的相關(guān)解釋。

列名稱 意義
UID 執(zhí)行該進程的用戶ID
PID 進程編號
PPID 該進程的父進程編號
C 該進程所在的CPU利用率
STIME 進程執(zhí)行時間
TTY 進程相關(guān)的終端類型
TIME 進程所占用的CPU時間
CMD 創(chuàng)建該進程的指令

如下是其他配合 ps 指令的選項:

選項 意義
-a 顯示所有用戶的信息
-x 顯示關(guān)于沒有終端的進程的信息
-u 顯示類似 -f 的其他附加信息
-e 顯示擴展信息

停止進程執(zhí)行

用戶可以使用多種方式來停止一個進程。通常情況下,可以通過終端指令來完成,比如,同時按下 CTRL+C 鍵就可以停止當前執(zhí)行的指令。這種方式僅在程序以前臺的方式執(zhí)行的情況下起作用。

如果一個進程以后臺的方式在執(zhí)行,那么首先用戶需要通過 ps 指令來獲取它的作業(yè)編號,然后用戶可以使用 kill 指令來殺掉該進程。如下:

    $ps -f
    UID  PID  PPID C STIMETTY   TIME CMD
    amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
    amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
    amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
    amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
    $kill 6738
    Terminated

這里的 kill 指令收終止指令為 first_one 對應的進程。如果某個進程無視常規(guī)的 kill 指令。用戶可以使用 kill -9 后跟進程編號的方式來終止指令,如下:

    $kill -9 6738
    Terminated

父進程和子進程

UNIX 系統(tǒng)中的每一個進程都有兩個 ID 號碼:進程 ID(pid)和父進程 ID(ppid).系統(tǒng)中的每一個用戶進程均有父進程。

大部分使用 shell 執(zhí)行的指令均有他們各自的父進程。使用 ps -f 指令可以顯示出每個進程相對應的進程 ID和其父進程 ID.

僵尸進程和孤兒進程

通常情況下,當某個子進程被殺掉后,其父進程會被 SIGCHILD 信號通知。然后,該父進程會做一些必要的操作或者啟動一個新的子進程。然而,有時候是父進程先于子進程被殺掉。這種情況下,被稱為“所有進程的父進程”的 init 進程就稱為該子進程的父進程。這些子進程也稱為孤兒進程。

當某個進程被殺掉后,ps 指令列出的列表里顯示該進程標志位 Z 狀態(tài)。它就是一個僵尸進程。該進程處于死亡狀態(tài)并且不會被再次使用。這些進程不同于孤兒進程。他們是已經(jīng)完成任務的進程,但是仍在進程表中留有一個入口。

守護進程

守護進程是操作系統(tǒng)相關(guān)的后臺進程,他們通常以 root 權(quán)限執(zhí)行,并且會相應其他進程的請求。

守護進程沒有控制終端。它也不能打開 /dev/tty。如果用戶使用"ps -ef" 指令來查看 tty 域,所有的守護進程在該域都會顯示?。

更詳細的來講,守護進程就是執(zhí)行在后臺的進程,且它會等待某個事件的發(fā)生,從而相應該事件。比如打印機守護進程一直在等待打印的指令。

如果用戶的某個程序需要長時間的執(zhí)行,那么可以將它設計為守護進程的啟動方式。

top 指令

top 指令是用于顯示以不同條件排序進程的指令。

它是一個頻繁更新的交互式診斷工具,會動態(tài)的顯示如下和相關(guān)進程的如下信息:物理內(nèi)存、虛擬內(nèi)存、CPU 利用率、負載率。

下面是一個簡單的例子來執(zhí)行 top 指令,且查看不同繼承的CPU使用率。

    $top

作業(yè)編號與進程號

后臺的且阻塞狀態(tài)的進程通常使用作業(yè)編號來維護。該作業(yè)編號不同于進程編號。

此外,作業(yè)可以包含多個進程,這些進程可以串行執(zhí)行,也可以并行執(zhí)行,所以使用作業(yè)編號比跟蹤單個的進程會更加簡單。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號