現代作業系統: 第一章 引言
現代計算機由一個或多個處理器、主存、磁碟、印表機、滑鼠、顯示器、網路介面以及各種其他輸入/輸出裝置組成。多數計算機有兩種執行模式:核心態和使用者態。軟體中最基本的部分是作業系統,它執行在核心態。
作業系統由硬體進行保護,防止使用者試圖對其進行修改 作業系統和普通軟體的主要區別,如果使用者不喜歡某個特定的應用軟體,使用者可以重新寫一個軟體。但是不能自行寫一個屬於作業系統中的一部分的時鐘中斷處理程式。因為這個程式是由硬體保護,防止使用者試圖對它進行修改。
1.1 什麼是作業系統
作業系統就是一種執行在核心態的軟體
作業系統的作用概括起來主要有兩個方面的作用:
- 作業系統建立好的抽象,並且實現和管理它所建立的抽象物件。
- 記錄哪個程式在使用什麼樣的資源,對資源請求進行分配,評價使用代價,並且為不同的的程式和使用者調解互相沖突的資源請求。
另外,對於作業系統的理解,從不同角度看的,有不同的定義,
自頂向下看:作業系統為應用程式提供基本抽象,從而使應用程式在此基礎上可以組合功能。
自底向上看:作業系統用來管理複雜系統的各個部分,對資源的請求進行分配,調節不同程式見相互衝突的資源請求。
資源管理包括以下兩種不同的複用方式實現多路複用共享資源:在時間上覆用和在空間上覆用。
- 在時間上覆用:當一個資源在時間上覆用時,不同的程式或使用者輪流使用它。
- 在空間上覆用:每個客戶都得到資源的一部分,從而取代了客戶排隊。
1.2 作業系統的歷史
第一代:真空管和穿孔卡片
第二代:電晶體和批處理系統
第三代:小規模積體電路和多到程式設計
第四代:個人計算機(大規模積體電路)
第五代:移動計算機(手機、平板等)
1.3 計算機硬體簡介
作業系統地作用:作業系統擴充套件了計算機指令集並且管理計算機資源。
1.3.1 處理器
計算機的大腦是CPU,它從記憶體中取出指令並且執行它。在每個CPU基本週期內,首先從記憶體中取出指令,解碼以確定其型別和運算元,接著執行它,然後取指、解碼並執行下一條指令。按照這一方式,程式被執行完成。
所有的CPU內部都有一些用來儲存關鍵變數和臨時資料的暫存器。
對程式設計師可見的專用暫存器:
- 程式計數器:它儲存了將要取出的下一條指令的記憶體地址。
- 堆疊指標:它指向記憶體中當前堆疊的頂端,該棧包含了每一個執行過程的棧針。
CPU取出指令執行的機制,是通過內部的取指單元、解碼單元、執行單元三部分完成。為了提高效率。現在CPU通常可以同時取出多條指令。當CPU執行指令n時,它可以正在對指令n+1解碼,並讀取指令n+2,這樣,當執行完指令n後,無需等待,就可以直接執行n+1,然後n+2,這樣的機制,稱為流水線(pipeline)。
多數CPU有兩種模式,即前面提到的核心態和使用者態:
- 當在核心態執行時,CPU可以知悉指令集中的每一條指令,並且使用硬體的每種功能。在臺式機器和伺服器上,作業系統在核心態中執行,從而可以訪問整個機器。
- 使用者程式在使用者態中執行時,僅僅執行執行整個指令集的一個子集和訪問所有功能的一個子集。在使用者態中有關I/O和記憶體保護的所有指令是禁止的。
多核體系架構和多執行緒
1.3.2 儲存器
典型的儲存層次結構及其一個大概的訪問時間如下:
儲存器中的頂層是CPU中的暫存器
下一層次為快取記憶體,CPU讀取資料時,如果資料在快取記憶體行中,則成為快取記憶體命中。提升快取記憶體命中有利於提升效率。
再下一次是主存。主存通常稱為隨機訪問器。
1.3.3 磁碟
下圖是常見的機械硬碟結構:
在任意一個給定臂的位置,每個磁頭可以讀取一端環形區域,稱為磁軌。把一個給定的臂的位置上的所有磁軌合併起來,組成了一個柱面。每個磁軌可以分為若干扇區。
現如今,許多計算機中支援一種著名的虛擬記憶體機制。這種機制使得期望執行大於實體記憶體的程式稱為可能,器方法是將程式放在磁碟上去,而將主存作為一種快取,用來儲存最頻繁使用的部分程式。
1.3.4 I/O裝置
I/O裝置一般包括兩個部分:裝置控制器和裝置本身。裝置控制器的任務是為作業系統提供一個簡單的介面。
每類裝置控制器都是不同的,所以需要不同的軟體進行控制。專門與控制器對話,發出命令並接受相應的程式,稱為裝置驅動程式。
實現輸入輸出有三種方式:
-
第一種,使用者程式發出一個系統呼叫,然後就執行I/O過程,CPU一直等待I/O的資料,直到得到資料後處理,處理完以後返回結果,CPU才繼續處理其他事情。這種方式稱為忙等待。
-
第二種是通過中斷機制。裝置驅動程式啟動並讓裝置在操作完成時發出一箇中斷。裝置驅動程式在這個時刻立即返回。作業系統接著在需要時阻塞呼叫者並安排其他工作進行。當裝置驅動程式檢測到該裝置的操作完畢時,它發出一箇中斷通知操作完成。
-
第三種,使用直接儲存器訪問晶片(DMA,Direct Memory Access),直接控制位流,可以控制在記憶體和某些控制器之間的位流,而無須持續的CPU干預。
1.3.5 匯流排
匯流排就是CPU連線其他裝置的線,各種裝置間的資料傳輸通過匯流排完成。
- 共享匯流排架構表示多個裝置使用一些相同的導線傳輸資料。
- 並行匯流排架構表示通過多條導線傳送資料的每一個字。(PCI匯流排)
- 序列匯流排架構通過一條被稱為資料通路的鏈路傳遞了集合了所有位的一條訊息,這非常像網路包。(PCIe匯流排)
PCIe恰好相反,它使用分離的端到端的鏈路。
1.3.6 啟動計算機
通電後,系統首先啟動BIOS裡面的程式, BIOS全稱基本輸入輸出系統(Basic Input Output System), 內部包含了一下基本的引數設定,以及接下來要啟動的程式,從而把系統啟動起來。
1.4 作業系統大觀園(各種作業系統)
作業系統有很多,主要有:大型機作業系統、伺服器作業系統、多處理器作業系統、個人計算機作業系統、掌上計算機作業系統、嵌入式作業系統、感測器節點作業系統、實時作業系統、智慧卡作業系統。
1.5 作業系統概念
作業系統中有很多基本概念和抽象,它們是需要理解的核心內容,主要有:程序、地址空間、檔案、I/O(輸入輸出)、保護、shell.
1.5.1 程序
程序的本質是正在執行的一個程式。可以簡單理解一個程序就是一個程式,但有時,一個程式包含多個程序。程序是對CPU處理器的一個抽象概念,可以把程序看做一個資源排程的集合,通常包含的資源有:暫存器(程式計數器和堆疊指標)、開啟檔案的清單、突出的警報、有關程序的清單以及程式需要的其他資訊。
與每個程序相關的是地址空間,這是從某個最小值的儲存位置到每個最大值的儲存位置的列表。在這個地址空間中,程序可以進行讀寫。該地址空間中存放有可執行程式、程式的資料以及程式的堆疊。
一個程序包括:程序的地址空間和對應的程序表項(其中包括暫存器以及稍後重啟該程序所需要的許多資訊)。
若一個程序能夠建立一個或者多個程序(或稱為子程序),而且這些子程序又能建立子程序,則很容易就形成程序樹。合作完成某些作業的相關程序經常需要彼此之間進行通訊以便同步完成他們的工作,這就是程序間的通訊。
1.5.2 地址空間
計算機的主存用來儲存正在執行的程式,為了找到程式在主存(也就是記憶體)的位置,實體記憶體設定了對應的地址編號,地址編號的一個集合就是地址空間。 實體地址空間是有限的,這是裝置決定的,不過有虛擬地址空間技術。地址空間這個概念其實就是對記憶體的一個抽象,用來方便管理記憶體及程序。
該程序在執行的時候,看到和使用的記憶體都是虛擬記憶體地址。
對於32位的作業系統,該虛擬地址空間位2^32 位4GB
1.5.3 檔案
檔案這個概念的抽象是為了描述資料的集合,這個比較好理解。在現實中的檔案其實就是某些資料裝訂在了一起,這些資料通常儲存的也是某些資料(文字、圖表等)。
在UNIX中有一個重要的概念是特殊檔案。提供特殊檔案是為了使I/O裝置看起來像檔案一樣。這樣的特殊檔案有兩種:
- 塊特殊檔案:那些可以隨機存取的塊組成的裝置,如磁碟等
- 字元特殊檔案:字元特殊檔案用於印表機、調變解調器和其他接受或輸出字元流的裝置。
管道:管道是一種虛檔案,它可以連線兩個程序。當程序A想對程序B傳送資料的時候,它把資料寫到管道上,彷彿管道就是輸出檔案一樣。程序B可以通過讀取該管道而得到資料,彷彿管道就是一個輸入檔案一樣。
1.5.4 輸入/輸出 I/O
主要是指輸入輸出裝置,通過這些裝置來輸入或輸出資料, 比如鍵盤、印表機等。鍵盤輸入字母,就可以在硬碟或者其他位置輸出文字。
1.5.5 保護
計算機有大量資訊,使用者希望對其進行保護。對一個檔案來說,通常有三種狀態,可讀(只能讀取,不可修改),可寫(只能寫入,不可讀出),可讀可寫。
rwxr-x–x 的含有是對於使用者所有者是可讀、可寫、可執行。對於同一個組的使用者可以讀、和執行。對於其他使用者只能執行。對於一個目錄來說,x的含義是執行查詢。
1.6 系統呼叫
先簡單瞭解下系統呼叫的流程,下圖是呼叫一個read方法的過程:
然後是一些常用的呼叫函式:
1.6.1 用於程序管理的系統呼叫
1.6.2 用於檔案管理的系統呼叫
1.6.3 用於目錄管理的系統呼叫
1.7 作業系統結構
1.7.1 單體系統
整個作業系統以單一程式的方式執行,所有過程連結成一個大型可執行二進位制程式
1.7.2 層次式系統
整個系統分了很多層,每一層都進行一些封裝,再給上一層次呼叫,從而可以加入一些限制進行保護。
1.7.3 微核心
微核心的設計思想是,為了實現高可靠性,將作業系統劃分為小的、良好定義的模組,只有其中一個模組—微核心—執行在核心態,其餘的模組由於功能相對較弱,則作為普通使用者程序執行。