《Unix/Linux系統程式設計》第三章學習筆記
第三章 Unix/Linux程序管理
3.1 多工處理
一般來說,多工處理指的是同時進行幾項獨立活動的能力。在計算機技術中,多工處理指的是同時執行幾個獨立的任務。
在單處理器(單CPU)中,一次只能執行一個任務,多工處理是通過在不同任務之間多路複用CPU的執行時間來實現的,即將CPU執行操作從一個任務切換到另一個任務。這種邏輯並行性被稱為“併發”。
3.2 程序的概念
作業系統是一個多工處理系統,任務也稱為程序。
程序是對映像的執行
在一個單CPU系統中,一次只能執行一個程序。
3.3 多工處理系統
多工處理系統,簡稱MT
- type.h 檔案定義了系統常熟和表示程序的簡單PROC結構體
/*********** type.h file ************/ #define NPROC 9 #define SSIZE 1024 // PROC status #define FREE 0 #define READY 1 #define SLEEP 2 #define ZOMBIE 3 typedef struct proc{ struct proc *next; int *ksp; int pid; int status; int priority; int kstack [SSIZE]; }PROC;
- t.c檔案定義MT系統資料結構、系統初始化程式碼和程序管理函式
- ts.s檔案在32位GCC彙編程式碼中可實現程序上下文切換
3.4 程序同步
一個作業系統包含許多併發程序,這些程序可以彼此互動。程序同步是指控制和協調程序互動以確保其正確執行所需的各項和規則和機制。
-
睡眠模式
當某程序需要某些當前沒有的東西時,它就會在某個事件值上進入休眠狀態,該事件值表示休眠的原因。
-
喚醒模式
多個程序可能進入休眠狀態等待同一個事件。在這種情況下,所有這些程序都將休眠等待同一個事件值。當某個等待實踐發生時,另一個執行實體將會呼叫kwakeup(event),喚醒正處於休眠狀態等待該事件值的所有程式。
kwakeup()的演算法是:
3.5 程序終止
在作業系統中,程序可能終止或死亡。
- 正常終止:程序自行呼叫結束函式exit(value)進行終止。
- 異常終止:程序因為某個訊號而異常終止。
1、kexit()的演算法
在所有類Unix系統中,程序P1(又叫INIT程序)將所有其他的孤兒程序,不論死亡還是活躍都被送到P1中,稱為P1的子程序。
INIT程序P1:有非常重要作用
它是除了P0之外所有程序的祖先,所有登入程序都是它的子程序。
它管理所有沒有父程序的程序。(他就像孤兒院的院長,所有孤兒都叫他爸爸)。
它不停尋找殭屍程序,並終止他們(埋葬它們死亡的空殼)。
3、等待子程序終止
在任何時候,程序都可以呼叫核心函式
pid = kwait(int *status)
在kwait演算法中,如果沒有子程序,則程序會返回-1,表示錯誤。否則,他將搜尋殭屍子程序。如果他找到殭屍子程序,就會收集殭屍子程序的pid和退出程式碼。相應的,當程序終止時,他必須發出:
kwakeup(running->parent)
喚醒父程序。
3.7Unix/Linux中的程序
作業系統啟動時,核心會強行建立PID=0的初始程序,然後系統執行P0。系統掛載檔案,然後初始化完成後,復刻出子程序P1。
P1執行時,執行映像更改為INIT程式,復刻出更多子程序,用於提供系統服務,這樣的程序成為守護程序。
登入程序:登入後進程開啟三個檔案流,分別是stdin、stdout、stderr。
3.9 I/O重定向
sh程序有三個用於終端I/O的檔案流:stdin(標準輸入)、stdout(標準輸出)、stderr(標準錯誤)。其檔案描述符分別對應0、1、2。
在執行scanf("%s", &item);時,就會從stdin讀入,如果其FILE結構體fbuf[]為空,它就會向Linux核心發出read系統呼叫,從終端/dev/ttyX或為終端/dev/pts/#上讀入。
3.10 管道
管道是用於程序交換資料的單向程序間通訊的通道。管道有一個輸入端、一個輸出端。在之前我們使用man -k | grep xx時,就用到管道的功能。
管道的使用可以通過程式完成,也可以在命令列中處理完成。
實踐內容過程、問題解決過程
ps -ef|grep root
fork演示