程序管理(一)程序與程式 靜態的ps詳解

2021-09-27 04:09:54 字數 3931 閱讀 2327

在這個小專題我想要詳細的來談一下程序管理;

要談程序管理,我們首先應該明確:程序與程式之間的關係其次才是程序管理

在linux系統中,觸發任何乙個事件,系統都會將它定義為乙個程序,並且給予這個程序乙個id,稱為pid,同時根據觸發這個程序的使用者與相關屬性關係,給予這個pid一組有效的許可權設定

上面的描述我們乍一看是沒有什麼問題的,並且也相當容易理解,那麼,在linux系統中,「觸發乙個事件」到底是什麼意思呢?怎樣的操作才會觸發乙個事件?

《鳥哥的linux私房菜》一書中對此的解釋是:執行乙個程式或者命令,就可以觸發乙個事件,但我認為應該是執行乙個程式,就可以觸發乙個事件(因為命令也不過是對應目錄下的乙個二進位制程式而已)而獲取乙個pid。

程式和程序:一般是放置在物理磁碟中,然後通過使用者的執行來觸發。觸發後會被載入到記憶體中成為乙個個體,這個個體就是程序。為了讓os管理這個程序,父程序會給予執行者許可權,屬性等引數,以及程序所需要的指令碼或者資料等等,以及每個程序獨有的pid,os將會通過這個pid來判斷該程序是否具有執行許可權,以上關係可以由下圖表示:

##4:表示此程序許可權為root

##1:表示此程序僅僅fork而沒有exec

其他:既不是root也不是fork沒有exec

s:代表這個程序的狀態:

##r(task_running):可執行狀態,只有在該狀態的程序才可能在cpu上執行。而同一時刻可能有多個程序處於可執行狀態,這些程序的task_struct結構(程序控制塊)被放入對應cpu的可執行佇列中(乙個程序最多只能出現在乙個cpu的可執行佇列中)。程序排程器的任務就是從各個cpu的可執行佇列中選擇乙個程序在該cpu上執行。

很多作業系統教科書將正在cpu上執行的程序定義為running狀態、而將可執行但是尚未被排程執行的程序定義為ready狀態,這兩種狀態在linux下統一task_running狀態。

##s(task_interruptible):可中斷的睡眠狀態。處於這個狀態的程序因為等待某某事件的發生(比如等待socket連線、等待訊號量),而被掛起。這些程序的task_struct結構被放入對應事件的等待佇列中。當這些事件發生時(由外部中斷觸發、或由其他程序觸發),對應的等待佇列中的乙個或多個程序將被喚醒。

##d(task_uninterruptible):不可中斷的睡眠狀態。與task_interruptible狀態類似,程序處於睡眠狀態,但是此刻程序是不可中斷的。不可中斷,指的並不是cpu不響應外部硬體的中斷,而是指程序不響應非同步訊號。通常這個程序可能在等待i/o的情況

絕大多數情況下,程序處在睡眠狀態時,總是應該能夠響應非同步訊號的。否則你將驚奇的發現,kill -9竟然殺不死乙個正在睡眠的程序了!於是我們也很好理解,為什麼ps命令看到的程序幾乎不會出現task_uninterruptible狀態,而總是task_interruptible狀態。

==而task_uninterruptible狀態存在的意義就在於,核心的某些處理流程是不能被打斷的。==在程序對某些硬體進行操作時(比如程序呼叫read系統呼叫對某個裝置檔案進行讀操作,而read系統呼叫最終執行到對應裝置驅動的**,並與對應的物理裝置進行互動,印表機),可能需要使用task_uninterruptible狀態對程序進行保護,以避免程序與裝置互動的過程被打斷,造成裝置陷入不可控的狀態。這種情況下的task_uninterruptible狀態總是非常短暫的,通過ps命令基本上不可能捕捉到。

##t:(task_stopped or task_traced),暫停狀態或跟蹤狀態。

task_stopped:向程序傳送乙個sigstop訊號,它就會因響應該訊號而進入task_stopped狀態(除非該程序本身處於task_uninterruptible狀態而不響應訊號)。(sigstop與sigkill訊號一樣,是非常強制的。不允許使用者程序通過signal系列的系統呼叫重新設定對應的訊號處理函式。)

向程序傳送乙個sigcont訊號,可以讓其從task_stopped狀態恢復到task_running狀態。

task_traced:當程序正在被跟蹤時,它處於task_traced這個特殊的狀態。「正在被跟蹤」指的是程序暫停下來,等待跟蹤它的程序對它進行操作。比如在gdb中對被跟蹤的程序下乙個斷點,程序在斷點處停下來的時候就處於task_traced狀態。而在其他時候,被跟蹤的程序還是處於前面提到的那些狀態。對於程序本身來說,task_stopped和task_traced狀態很類似,都是表示程序暫停下來。

而task_traced狀態相當於在task_stopped之上多了一層保護,處於task_traced狀態的程序不能響應sigcont訊號而被喚醒。只能等到除錯程序通過ptrace系統呼叫執行ptrace_cont、ptrace_detach等操作(通過ptrace系統呼叫的引數指定操作),或除錯程序退出,被除錯的程序才能恢復task_running狀態。

##z:殭屍狀態,子程序退出,父程序還沒有退出並且父程序沒有對退出的子程序進行wait()或者waitpid(),那麼這個時候的子程序便成了殭屍程序(詳見我的部落格殭屍程序和孤兒程序)。

##x: (task_dead - exit_dead),退出狀態,程序即將被銷毀。

而程序在退出過程中也可能不會保留它的task_struct。比如這個程序是多執行緒程式中被detach過的程序。或者父程序通過設定sigchld訊號的handler為sig_ign,顯式的忽略了sigchld訊號。(這是posix的規定,儘管子程序的退出訊號可以被設定為sigchld以外的其他訊號。)

此時,程序將被置於exit_dead退出狀態,這意味著接下來的**立即就會將該程序徹底釋放。所以exit_dead狀態是非常短暫的,幾乎不可能通過ps命令捕捉到。

##t:跟蹤狀態;

uid/pid/ppid:此程序被該uid所擁有、此程序的pid號碼、此程序的父程序的pid號碼;

c:代表cpu的使用率,單位為百分比

pri/ni:priority/nice,代表此程序被cpu所執行的優先順序,數值越小代表越快被執行。(詳細的解釋將會在動態的top命令一節中談到);

addr/sz/wchan:都與記憶體有關,addr是kernel function指出該程序在記憶體的那個部分,如果是running的程序一般會顯示-,sz代表此程序用掉多少記憶體;wchan表示目前程序是否執行,-代表正在執行;

tty:登入者的終端位置,若為遠端登入則使用動態終端介面名稱(pts/n);

time:此程序實際使用的cpu時間;

cmd:表示造成此程序的觸發程序的命令是什麼;

pid:該程序的程序pid

%cpu:該程序使用掉的cpu資源百分比

%mem:該程序所占用的物理記憶體百分比

vsz:該程序使用掉的虛擬記憶體量kb

rss:該程序占用的固定的記憶體量拷貝

tty:該程序在那個終端上面執行,與終端無關則顯示?,另外,tty1~tty6是本機上面的登入程序,若為pts/0,則表示是由網路鏈結進入主機的程序;

stat:同ps -l 的s;

start:該程序被觸發啟動的時間;

time:該程序實際使用cpu執行的時間;

command:該程序的實際命令是什麼;

參考文獻:《鳥哥的linux私房菜》

還有這篇優秀的博文.

在下乙個小結裡面,我將會總結為什麼ps是靜態的而top是動態的

動態終端介面名稱pts/n的解釋

如果乙個程序有一段時間是s狀態,那麼這段時間是否計入time ?

設計程式檢視d,z,t狀態;

一 程序管理

1基本概念 程序 計算機已執行程式的實體。程式本身只是指令的集合,程序才是程式的真正執行。使用者下達執行程式的命令後,就會產生程序。程序通常有5種狀態,其中前3種為程序的基本狀態。分別為 執行狀態 就緒狀態 阻塞狀態 建立狀態 結束狀態。其中,就緒狀態指程序獲得了除了處理器之外的一切所需資源,一旦得...

程序管理 一 程序的概念以及程序的建立

程式一旦跑起來就是乙個程序,程序是乙個可以執行的例項。每個程序都擁有乙個自己的虛擬cpu,但是實際上只有乙個cpu,其只是在各個程序之間快速的切換,這種快速切換就叫做多道程式設計 例子 乙個計算機科學家給女兒做蛋糕,他有做蛋糕用的食譜,廚房中有大量的原料,比如香草 雞蛋 麵粉 糖等等。其中食譜就是程...

linux系統程式設計之程序(一) 程序與程式

mickole 出處 本節目標 一,什麼是程式?程式是完成特定任務的一系列指令集合 二,什麼是程序?三,程序資料結構 程序的靜態描述 由三部分組成 pcb 有關程式段和該程式段對其進行操作的資料結構集。程序控制塊 pcb 用於描述程序情況及控制程序執行所需的全部資訊,是作業系統用來感知進存在的乙個重...