1. 程式人生 > >作業系統學習 1

作業系統學習 1

第零章 作業系統介面

1 作業系統介面

1.1 作業系統的工作
  • 將計算機資源在多個程式間共享,並且給程式提供一系列比硬體本身更有用的服務。
  • 管理並抽象底層硬體。
  • 多路複用硬體,使得多個程式可以同時執行(至少看上去是這樣)。
  • 給程式間一種受控的互動方式,使程式之間可以共享資料、共同工作。
1.2 作業系統通過介面向用戶提供服務

設計一個好的介面很難。一方面我們希望介面設計得簡單和精準,易於正確地實現;另一方面,又想為應用提供一些更加複雜的功能。

解決這種矛盾的方法:介面的設計依賴於少量的機制 ,而通過這些機制的組合提供強大、通用的功能。

1.3 核心的概念

一個向其它執行中的程式提供服務的特殊程式。每一個執行中的程式(被稱為程序

)都包含指令、資料、棧的記憶體空間。

程序通過系統呼叫使用核心服務。系統呼叫會進入核心,執行服務然後返回。所以程序總是在使用者空間和核心空間之間交替執行。

核心使用了CPU的硬體保護機制,保證了使用者程序只能訪問其自己的記憶體空間。核心擁有實現保護機制所需的硬體許可權,而使用者程式沒有這些許可權。當一個使用者程式進行一次系統呼叫時,硬體會提升特權並且開始執行一些核心中預定義的功能。

核心提供的系統呼叫,其實就是使用者程式可見的作業系統介面,下列了UNIX傳統系統呼叫的一部分,它們是:

系統呼叫 描述
fork() 建立程序
exit() 結束當前程序
wait() 等待子程序結束
kill(pid) 結束pid所指程序
getpid() 獲得當前程序pid
sleep(n) 睡眠n秒
exec(filename, *argv) 載入並執行一個檔案
sbrk(n) 為程序記憶體空間增加n位元組
open(filename, flags) 開啟檔案,flags指定讀/寫模式
read(fd, buf, n) 從檔案中讀n個位元組到buf
write(fd, buf, n) 從buf中寫n個位元組到檔案
close(fd) 關閉開啟的fd
dup(fd) 複製fd
pipe(p) 建立管道,並把讀和寫的fd返回到p
chdir(dirname) 改變當前目錄
mkdir(dirname) 建立新的目錄
mknod(name, major, minor) 建立裝置檔案
fstat(fd) 返回檔案資訊
link(f1,f2) 給f1建立一個新名字(f2)
unlink(filename) 刪除檔案

2 程序和記憶體

2.1 程序的組成

一個程序由兩部分組成,一部分是使用者記憶體空間,另一部分是僅對核心可見的程序狀態。

xv6作業系統提供了分時特性:它在可用CPU之間不斷切換,決定哪一個等待中的程序被執行。當一個程序不在執行時,xv6儲存它的CPU暫存器,當他們再次被執行時恢復這些暫存器的值。核心將每個程序和一個pid(process identifier)關聯起來。

2.2 子程序

一個程序可以通過呼叫fork()來建立一個新的程序,fork建立的新程序被稱為子程序,子程序的記憶體內容同建立它的程序(父程序)一樣。fork函式在父程序、子程序中都返回,在父程序中,它返回子程序的pid,在子程序中,它返回0。

2.3 系統呼叫exit

exit會導致呼叫它的程序停止執行,並且釋放如記憶體和開啟檔案在內的資源。

2.4 系統呼叫wait

wait會返回一個當前程序已退出的子程序,若子程序沒退出,wait會等待直到有一個子程序退出。

2.5 系統呼叫exec

exec將從某個檔案(通常是可執行檔案)裡讀取記憶體映象,並將其替換到呼叫它的程序的記憶體空間。這份檔案必須符合特定的格式,規定檔案的哪一部分是指令,哪一部分是資料,哪裡是指令的開始等等。

3 I/O和檔案描述符

3.1 檔案描述符

檔案描述符是一個整數,它代表了一個程序可以讀寫的被核心管理的物件。程序可以通過多種方式獲得一個檔案描述符,如開啟檔案、目錄、裝置,或建立一個管道,或者複製已經存在的檔案描述符。簡單起見,我們常常把檔案描述符指向的物件成為“檔案”。檔案描述符的介面是對檔案、管道、裝置等的抽象,這種抽象使得它們看上去就是位元組流。