1. 程式人生 > >現代作業系統(一)

現代作業系統(一)

一.引論

多數計算機有兩種執行模式:核心態和使用者態。軟體中最基礎的部分是作業系統,它執行在核心態(管態、核心態),在這個模式下,作業系統具有對所有硬體的完全訪問權,可以執行機器能夠執行的任何指令。軟體的其餘部分執行在使用者態,在使用者態下,只使用了機器指令中的一個子集
作業系統的任務是在相互競爭的程式之間有序的控制對處理器、儲存器以及其他I/O介面裝置的分配
計算機硬體簡介
1.處理器
由於用來訪問記憶體以得到指令或資料的時間要比執行指令花費的時間長得多,所有的CPU內都有一些用來儲存關鍵變數和臨時資料的暫存器
程式計數器,它儲存了將要取出的下一條指令的記憶體地址
堆疊指標,指向記憶體中當前棧的頂端,該棧包含了每個執行過程的棧幀。一個過程的棧幀中儲存了有關的輸入引數、區域性變數以及那些沒有儲存在暫存器中的臨時變數
程式狀態字(PSW)暫存器

,這個暫存器包含了條件碼位、CPU優先順序、模式(使用者態或核心態)以及各種其他控制位。使用者程式通常讀入整個PSW,但是隻對其中的少量欄位寫入
為了從作業系統中獲得服務,使用者程式必須使用系統呼叫以陷入核心並呼叫作業系統,TRAP指令把使用者態切換到核心態

2.儲存器
儲存器系統採用一種分層次的結構

1) 儲存器系統的頂層是CPU中的暫存器,程式必須在軟體中自行管理這些暫存器
2) 下一層是快取記憶體,它多數由硬體控制。主存被分割成快取記憶體行,有多行存在;第一級或稱為L1快取,總是在CPU中,通常用來將已解碼的指令調入CPU的執行引擎,對於頻繁使用的資料字,多數晶片安排有第二個L1快取;另外往往還設計有二級快取(L2快取),用來存放近來使用過的若干兆位元組的記憶體字。L1和L2快取之間的差別在於時序

,對L1快取的訪問,不存在任何延時;而對L2快取的訪問,則會延時1-2個時鐘週期
3) 再往下一層是主存,這是儲存器系統的主力。也成為隨機訪問儲存器(RAM)。所有不能在快取記憶體中得到滿足的訪問請求都會轉往主存。只讀儲存器(ROM)速度快且便宜,但是不可修改。電可擦除可程式設計ROM(EEPROM)和快閃記憶體(flash memory)也是非易失的,但是可以擦除和重寫。還有一類儲存器是CMOS,易失性的。

3.磁碟
一種機械裝置
資訊寫在磁碟的一系列同心圓上。在任意一個給定臂的位置,每個磁頭可以讀取一段環形區域,稱為磁軌;把一個給定臂的位置上的所有磁軌合併起來,組成了一個柱面。每個磁軌劃分為若干扇區。固態硬碟是資料儲存在快閃記憶體中。

4.I/O裝置
I/O裝置一般包括兩個部分:裝置控制器和裝置本身
控制器的任務是為作業系統提供一個簡單的介面
專門與控制器對話,發出命令並接收響應的軟體,稱為裝置驅動程式
實現輸入輸出有三種方式:

  • 忙等待:使用者程式發出一個系統呼叫,核心將其翻譯成一個對應裝置驅動程式的呼叫過程;然後裝置驅動程式啟動I/O並在一個連續不斷的迴圈中檢查該裝置。看該裝置是否完成了工作。當I/O結束後,裝置驅動程式把資料送到指定的地方並返回。缺點是一直佔據CPU
  • 裝置驅動程式啟動裝置並且讓該裝置在操作完成時發出一箇中斷
  • 直接儲存器訪問DMA,無須CPU干預

5.匯流排
PCI使用並行匯流排架構,PCIe使用序列匯流排架構
USB是用來將所有慢速I/O裝置與計算機連線的
SCSI匯流排是一種高速匯流排,用在高速硬碟、掃描器和其他需要較大頻寬的裝置上

6.啟動計算機
母板上有BIOS程式,存放在一塊快閃記憶體RAM中,非易失性。
(1)在計算機啟動時,BIOS開始執行。首先檢查所安裝的RAM數量,鍵盤和其他基本裝置是否已經安裝並正常響應。接著掃描PCIe和PCI匯流排並找到連在上面的所有裝置。
(2)然後BIOS通過嘗試儲存在CMOS中的裝置清單決定啟動裝置。啟動裝置上的第一個扇區被讀入記憶體並執行。這個扇區中包含一個對儲存在啟動扇區末尾的分割槽表檢查的程式,以確定哪個分割槽是活動的。然後從該分割槽讀入第二個啟動裝載模組。來自活動分割槽的這個裝載模組被讀入作業系統,並啟動之。
(3)然後,作業系統詢問BIOS,以獲得配置資訊。一旦有了全部的裝置驅動程式,作業系統就將它們調入核心。然後初始化有關表格,建立需要的任何背景程序,並在每個終端上啟動登入程式和GUI

作業系統概念
1.程序:本質上是正在執行的一個程式,基本上是容納執行一個程式所需要所有資訊的容器
2.地址空間:與每個程序相關,一般存放有可執行程式、程式的資料以及程式的堆疊
3.檔案:普通檔案的相關操作都是需要系統呼叫;特殊檔案有塊特殊檔案(可隨機存取的塊組成的裝置,諸如磁碟)以及字元特殊檔案(用於印表機、調變解調器和其他接收或輸出字元流的裝置);管道是一種虛檔案,它可連線兩個程序
4.輸入/輸出
5.保護

系統呼叫
1.用於程序管理的系統呼叫

呼叫 說明
pid = fork() 建立與父程序相同的子程序
pid = waitpid(pid,&statloc,options) 等待一個子程序終止
s = execve(name,argv,environp) 替換一個程序的核心映像
exit(status) 終止程序執行並返回狀態

UNIX將其儲存空間劃分為三段:正文段、資料段以及堆疊段。資料向上增長而堆疊向下增長
2.用於檔案管理的系統呼叫

呼叫 說明
fd = open(file,how,…) 開啟一個檔案供讀、寫或兩者
s = close(fd) 關閉一個開啟的檔案
n = read(fd,buffer,nbytes) 把資料從一個檔案讀到緩衝區中
n = write(fd,buffer,nbytes) 把資料從緩衝區寫到一個檔案中
position = lseek(fd,offset,whence) 移動檔案指標
s = stat(name,&buf) 取得檔案的狀態資訊

3.用於目錄管理的系統呼叫

呼叫 說明
s = mkdir(name,mode) 建立一個新目錄
s = rmdir(name) 刪去一個空目錄
s = link(name1,name2) 建立一個新目錄name2並指向name1
s = unlink(name) 刪去一個目錄項
s = mount(special,name,flag) 安裝一個檔案系統
s = umount(special) 解除安裝一個檔案系統

4.各種系統呼叫

呼叫 說明
s = chdir(dirname) 改變工作目錄
s = chmod(name,mode) 修改一個檔案的保護位
s = kill(pid,signal) 傳送訊號給一個程序
seconds = times(&seconds) 自1970-1-1流逝的時間

作業系統結構
單體系統:整個作業系統在核心態以單一程式的方式執行
層次式系統:上層軟體都是在下一層軟體的基礎上構建的
微核心:為了實現高可靠性,將作業系統劃分為小的、良好定義的模組、只有其中一個模組(微核心)執行在核心態,其餘的功能較弱的模組則作為普通使用者程序執行
客戶端-伺服器模式
虛擬機器
外核