第3章學習筆記
第三章 Unix/linux程序管理
多工處理指的是同時進行幾項獨立活動的能力
程序:在作業系統中,任務也稱為程序,執行映像定義為包含程式碼、資料和堆疊的儲存區,程序就是對映像的執行。
PROC結構體:在作業系統知識中我們學習過,程序的狀態用一個獨特的資料結構表示,叫做程序控制塊(PCB)。在Liunx中也可以稱為PROC結構體。PROC結構體包含某個程序的所有資訊。
PROC結構體如下:
typedef struct proc{ struct proc *next; int *ksp; int pid; intstatus; int priority; int kstack [SSIZE]; }PROC;
多工處理系統
type.h檔案定義了系統常熟和表示程序的簡單PROC結構體
#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;
ts.s檔案在32位GCC彙編程式碼中可實現程序上下文切換
queue.c檔案可實現佇列和連結串列操作函式。
.globl running,scheduler, tswitch tSwitch: SAVE: pushl %eax : pushl %ebx pushl %ecx pushl %edx pushl %ebp pushl %esi pushl%edi pushf1 movl running, Sebx mov1 # esp,4(%ebx) FIND: call scheduler RESUME: movl running,8ebx movl 4(%ebx),%esp popf1 popl %edi popl %esi popl %ebp popl %edx popl %ecx popl %ebx popl %eax ret # stack contents=|retPC|eax|ebx|ecx|edx|ebp|esi|edi|eflag| # -1 -2 -3 -4 -5 -6 -7 -8 -9
enqueue()函式按優先順序將PROC輸入佇列中。在優先順序佇列中,具有相同優先順序的程序按照FIFO的順序排序。
dequeue()函式可返回從佇列或連結串列中刪除的第一個元素。
printList()函式可列印連結串列元素。
t.c檔案定義MT系統資料結構、系統初始化程式碼和程序管理函式
睡眠模式:當程序需要某些當前沒有的東西的時候,就會進入休眠狀態。
喚醒操作:呼叫kwakeup()就可以喚醒一個程序。此時,正在休眠的一個程式得到了需要的資源,繼續執行其操作。
程序終止:程序完成後,就會終止或死亡。程序會以兩種方式終止:1)正常終止:程序自行呼叫結束函式exit(value)進行終止。2)異常終止:程序因為某個訊號而異常終止。終止時,都會呼叫kexit()。
程序管理中的系統呼叫
fork:在fork函式執行完畢後,如果建立新程序成功,則出現兩個程序,一個是子程序,一個是父程序。在子程序中,fork函式返回0,在父程序中,fork返回新建立子程序的程序ID。
通過fork返回的值來判斷當前程序是子程序還是父程序。
exec:用fork函式建立子程序後,子程序往往要呼叫一種exec函式以執行另一個程式。當程序呼叫一種exec函式時,該程序執行的程式完全替換為新程式,而新程式則從其main函式開始執行。
因為呼叫exec並不建立新程序,所以前後的程序ID並未改變。exec只是用一個全新的程式替換了當前程序的正文、資料、堆和棧段。
SHELL:指定將解釋任何使用者命令的sh。
TERM:指定執行sh時要模擬的終端型別。
USER:當前登入使用者。
PATH:系統在查詢命令時將檢查的目錄列表。
HOME:使用者的主目錄。在 Linux 中,所有使用者主目錄都在/home中。
關於fork的實踐
環境變數
各環境變數定義為:關鍵字=字串
*#include <unistd.h>* *int execl( const char *pathname, const char *arg0, ... /* (char *)0 */ );* *int execv( const char *pathname, char *const argv[] );* *int execle( const char *pathname, const char *arg0, ... /* (char *)0, char *const envp[] */ );* *int execve( const char *pathname, char *const argv[], char *const envp[] );* *int execlp( const char *filename, const char *arg0, ... /* (char *)0 */ );* *int execvp( const char *filename, char *const argv[] );*
I/O重定向
sh程序有三個用於終端I/O的檔案流:stdin(標準輸入)、stdout(標準輸出)、stderr(標準錯誤)。其檔案描述符分別對應0、1、2。
管道 |
管道是用於程序交換資料的單向程序件通訊通道。管道有一個讀取端和一個寫入端。
管道命令處理:在Unix/Linux中,命令列cmd1 | cmd2,sh將通過一個程序執行cmd1,並通過另一個程序執行cmd2,他們通過一個管道連線在一起,因此cmd1的輸出變為cmd2的輸入
命令管道:命令管道又叫FIFO。在sh中,通過mknod命令建立一個命令管道:
mknod mypipe p
或在c語言中發出mknod()系統呼叫
int r = mknod("mypipe",s_IFIFP,0);
程序可像訪問普通檔案一樣發個文命名管道。