1. 程式人生 > >Linux下程序知識(1)

Linux下程序知識(1)

#Linux 下程序的總結(1)

##什麼是程序?

程序是程式執行一次的過程。它佔用了CPU,佔用了記憶體的資源。
作業系統為了將各個程序統一管理起來。將每一個程序定義成了一個小塊,這個小塊被稱之為PCB(Program control blocks) 程式控制塊。通常情況下我們可以把這個塊看做是一個小的結構體。在Linux下,這個結構體是task_struct。這個結構體會在程序進行時被裝載到記憶體當中去使得這個程序能被作業系統監視起來。

##檢視程序

檢視程序資訊可以再 Proc的資料夾目錄下檢視。

在這裡插入圖片描述

除此之外,我們還可以使用 top命令 和 ps命令來檢視程序資訊。
使用 ps命令時候 -ef 和 aux可以檢視詳細資訊

在這裡插入圖片描述
每個程序都有自己獨立的id 。其中 父程序 的id為 ppid() 。子程序的 id為 pid()。

##初次使用fork()函式

在這裡插入圖片描述

通過手冊初步瞭解 fork()函式。fork()函式可以在執行的程式碼中建立一個 子程序。這個子程序的程式碼與父程序完全相同。

fork()函式建立的子程序,將會自己開闢空間執行。程式碼是父程序的一份臨時拷貝。
fork()函式返回兩個值。如果這個值大於零表示是父程序。如果等於零則表示是子程序。

不妨寫個程式來看看他們會返回什麼樣的值。

在這裡插入圖片描述
在這裡插入圖片描述

這裡看到 父程序的pid是 3506,而子程序的pid是3507。

##程序的狀態

程序也是有狀態的。通常來說程序有三種狀態,即 就緒態,阻塞態,執行態。程序在這三種最基本的狀態中間切換。
而在Linux下,程序的狀態通常有 7種基本狀態。
R:Running 執行態,表示程序要麼在運行當中,要麼處於臨界區的之前的等待佇列中。
S:Sleeping 睡眠態,表示程序在等待著事件的完成。(這個過程是可以被打斷的,所以也叫做可中斷睡眠態)。
D:Disk Sleeping 磁碟休眠態,表示程序正在等待著磁碟i/o過程結束,這個過程是不可以被打斷的。(不可中斷睡眠態(uninterrupted sleeping))。
T:Stopped 停止狀態。可以通過SIGSTOP訊號停止(T)程序。也可以使用SIGCONT來繼續使其進入(T程序)。
X:Dead 死亡狀態。不可以在工作管理員當中看到該狀態。它是一個返回值。
t:trace追蹤狀態
Z : 殭屍狀態。消耗記憶體空間。造成記憶體洩漏。
在這裡插入圖片描述

##特殊的程序狀態

###殭屍程序(zombie)

當一個父程序建立了一個子程序後,子程序意外退出,此時父程序沒有接受到子程序的退出的返回程式碼時,就會產生僵死狀態。

這個殭屍程序是子程序遺留的產物,它將儲存子程序退出時的返回程式碼,等待著父程序接收。如果父程序一直執行,且不接收,那麼這個遺留產物就會一直等待著,佔用記憶體空間,造成記憶體洩漏。

如果一個父程序建立了較多的子程序後,不進行回收就會造成大量的記憶體佔用。

###孤兒程序 (orphan)

孤兒程序指的是,當一個父程序建立了一個子程序後。父程序先於子程序退出,子程序就會找不到返回程式碼的物件,此時的子程序就是孤兒程序。

孤兒程序會被“孤兒院”領養。這個“孤兒院”是 Init 1。在任務資源管理器中的第一個程序。它會在後臺默默掛起這個子程序。