Linux 程序概念詳解

2021-09-26 21:44:05 字數 3349 閱讀 6070

程序指正在執行的程式。從核心來說,它是擔當分配系統資源(cpu時間,記憶體)的實體。

那程序跟程式有什麼區別呢?從資料和**層面看,它們是一樣的,但是程序比程式多了乙個東西,那就是描述程序的pcb結構體。

那這個pcb到底有什麼作用呢?

相信學過作業系統的同學都知道,作業系統作為軟體和硬體的管理者,那作業系統要管理那麼多的程序,而每個程序都有很多的資訊,為了方便管理這些程序資訊,它們被放在乙個叫做程序控制塊的資料結構中,我們稱之為pcb。

在linux中描述程序的結構體叫做task_struct。它是linux核心的一種資料結構,會被裝載到記憶體裡。

識別符號(pid) :跟這個程序相關的唯一識別符號,用來區別其他程序

狀態 :如果程序正在執行,那麼程序處於執行狀態。

優先順序 :相對於其他程序的優先順序。

程式計數器 :程式中即將被執行的下一條指令的位址。

記憶體指標:包括程式**和程序相關資料的指標,還有和其他程序共享的記憶體塊的指標。

上下文資料:程序執行時處理器的暫存器中的資料。

i/o狀態資訊:包括顯示的i/o請求,分配給程序的i/o裝置(如磁帶驅動器)和被程序使用的檔案列表。

審計資訊:可包括處理器時間總和,使用的時鐘數總和,時間限制,審計號等。

識別符號(pid)

在linux下可以使用top命令(相當於windows系統下的任務管理器)可以檢視

也可以使用ps aux命令,可以檢視所有程序,也可以使用ps aux | grep +特定要查詢的程序 。(可以使用ps aux | head -1 && ps aux | grep ***可在第一行顯示對應的屬性)

當然也有可以檢視pid的函式getpid(),檢視父程序的函式getppid()

#include #include #include int main()

getpid返回當前程序標識,getppid返回父程序標識。可以通過ps aux | grep + pid,可以看到所顯示的父程序pid為bash
可以通過echo $$ 檢視指令碼執行的當前程序的pid

使用ls /proc 命令可以檢視動態目錄,存放的是一些程序的資訊。

通過系統呼叫建立程序(fork)

如何建立乙個程序呢?我們可以使用fork()函式來建立

可以看到fork之後有兩個程序,為父子關係。

而fork的有兩個返回值,給父程序返回子程序的pid,給子程序返回0值。 父程序後面需要通過子程序的pid管理子程序的狀態。

程序狀態

可以通過ps aux | ps axj 命令檢視

r(running) 執行狀態:表示程序要麼在執行中,要麼在執行佇列裡。

s(sleeping) 睡眠狀態:可中斷睡眠狀態,表示程序正在等待事件完成。

d(disk sleep) 磁碟休眠狀態:不可中斷睡眠狀態,在這個狀態的程序通常會等待io的結束。

t(stopped) 停止狀態:可以通過傳送 sigstop 訊號給程序來停止(t)程序。這個被暫停的程序可 以通過傳送 sigcont 訊號讓程序繼續執行。

x(dead) 死亡狀態:這個狀態為返回狀態。

z(zombie) 殭屍狀態:當程序退出並且父程序使用wait()系統呼叫沒有讀取到子程序退出的返回**時就會產生僵死(屍)程序,僵死程序會以終止狀態保持在程序表中,並且會一直在等待父程序讀取退出狀態**。 所以,只要子程序退出,父程序還在執行,但父程序沒有讀取子程序狀態,子程序進入z狀態。(類似於警察檢查死者,要知道死者的原因和狀態)

注:若系統中有大量殭屍狀態的程序,長時間不**,會造成記憶體資源的浪費,造成==記憶體洩漏問題==
在下面簡單的實現乙個僵死程序

#include #include #include include using namespace std;

int main()

if(id == 0)

else }

return 0;

}

另起乙個終端,跑乙個指令碼 while :; do ps aux | grep 『myprocess』| grep -v grep ;sleep 1;echo 『###################』;done

可以從上看出三秒之後,子程序變成僵死狀態。

那父程序如果提前退出,子程序後退出會怎樣呢?這時候子程序就稱為孤兒程序了,應該由1號(作業系統)init程序領養,之後也由init程序**。

int main()

if(id == 0)

else }

return 0;

}

跑指令碼:while :; do ps axj | grep 『myprocess』| grep -v grep ;sleep 1;echo 『###################』;done

注:要看到父程序,需要將aux變成axj

可以看到當父程序退出之後,子程序被1號程序領養。

程序優先順序

程序的優先權:cpu資源分配的先後順序。一般來說,數字越小優先順序越高。

可以使用ps -l 命令檢視優先順序

nice值為linux下優先順序的修正資料,nice其取值範圍是-20至19。

pri = (舊的)pri + nice

可使用top命令進行修改(一般不建議修改)

進入top之後按「r」 —> 輸入程序id —>輸入nice值

總結來說,如何管理程序就是先描述再組織,先把程序描述起來(就是這些表徵資訊,都放在task_struct裡面),然後進行組織。

Linux 程序概念

任何計算機系統都包含乙個基本的程式集合,成為作業系統 os 它包括 作業系統是管管理的軟體 使用者操作 使用者操作介面 shell,lib,指令等 作業系統 驅動程式 硬體 作業系統管理硬體 系統呼叫 在開發者角度,作業系統會對外表現為乙個整體,但是會暴露自己的一部分介面供上層開發者使用,這部分由作...

Linux 程序概念

程序排程演算法 在早期作業系統的排程方式大多數是非剝奪的,這是由於早期的應用一般是科學計算或事務處理,不太把人機互動的響應時間指標放在首要位置。在這種情況下,正在執行的程序可一直占用cpu直到程序阻塞或終止。這種方式的排程演算法可以很簡單,且比較適用對於響應時間不關心或者關心甚少的批處理科學計算或事...

Linux 程序概念

調研程序的排程演算法.短程序優先演算法,對預計執行時間短的程序優先分派處理機。通常後來的短程序不搶先正在執行的程序。演算法優點 相比fcfs 演算法,該演算法可改善平均周轉時間和平均帶權周轉時間,縮短程序的等待時間,提高系統的吞吐量。演算法缺點 對長程序非常不利,可能長時間得不到執行,且未能依據程序...