1. 程式人生 > 其它 >第3章學習筆記

第3章學習筆記

第三章 Unix/linux程序管理

多工處理指的是同時進行幾項獨立活動的能力
程序:在作業系統中,任務也稱為程序,執行映像定義為包含程式碼、資料和堆疊的儲存區,程序就是對映像的執行。
PROC結構體:在作業系統知識中我們學習過,程序的狀態用一個獨特的資料結構表示,叫做程序控制塊(PCB)。在Liunx中也可以稱為PROC結構體。PROC結構體包含某個程序的所有資訊。

PROC結構體如下:

typedef struct proc{
    struct proc *next;    
    int *ksp;            
    int pid;            
    int
status; 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);

程序可像訪問普通檔案一樣發個文命名管道。