Linux 程序概念

2021-09-19 13:13:47 字數 1490 閱讀 9195

1. 程序id  系統中每乙個程序都有乙個唯一id    linux中id用 pid_t 型別表示

2. 程序狀態 就緒, 執行, 掛起, 停止

3. 程序切換時儲存的暫存器的資料

4. 優先順序

5. 記憶體指標

6. 程式計數器等

...

基本使用
pid_t fork(void);    // fork 函式有兩個返回值

返回值: 成功: 1.返回0 2.返回子程序id

失敗: 返回-1

使用fork()函式通常要使用if判斷父子程序執行後續邏輯

fork()函式建立的子程序會複製父程序的pcb以及程式位址空間全部資訊

殭屍程序

殭屍程序: 當程序退出並且父程序沒有讀取到子程序退出的返回**時就會產生僵死(屍)程序

殭屍程序會占用資源造成資源浪費, 而且不能使用kill命令殺死殭屍程序

**模擬殭屍程序:

int main()else if(ret > 0)

} }使用 ps -aux 命令檢視子程序 可以看到子程序的狀態是z+, 子程序變成乙個殭屍程序, 無法用kill殺死

孤兒程序

孤兒程序: 父程序先於子程序結束, 子程序被init程序領養, 被稱為孤兒程序

**模擬孤兒程序:

int main()else if(ret > 0) }

輸出:parent: pid[3837]

child: pid[3838] --- parent[3837]

child: pid[3838] --- parent[1]

可以看出sleep一秒的父程序先退出後, 子程序被1號程序領養

父子程序共享(寫時拷貝), 虛擬記憶體和物理記憶體

fork()後, 子程序拷貝父程序的虛擬位址空間, **段, 資料段, 堆疊都會拷貝, pcb不一樣

如果子程序對乙個變數進行寫操作, 就會拷貝乙份新的在物理記憶體, 否則父子程序共用同乙個物理記憶體中的變數

int g_val = 0;

int main()else if (ret > 0)

輸出結果:

parent[4587], g_val = 50, g_val adress: 0x55fcb1179014

child[4588], g_val = 100, g_val adress: 0x55fcb1179014

可以看到父子程序都修改了 g_val 變數, g_val變數列印的位址相同,值不同,因為子程序拷貝了父程序的虛擬位址空間,所以

位址是一樣的, 但是父子程序都在物理記憶體中開闢了一塊新的空間,所以值不同 這就是寫時拷貝

Linux 程序概念

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

Linux 程序概念

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

Linux 程序概念

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