操作系統核心原理-2.一些基本概念


一、計算機硬件基礎

1.1 總線結構

  從概念上講,計算機的結構是總線型的:布置一根總線將各種硬件設備掛在總線(Bus)上

  (1)所有的設備都有一個控制設備,外部設備通過控制器與CPU進行通信。

  (2)所有的設備之間的通信也需要通過總線。

1.2 流水線結構

  為了提高計算機的效率,人們又設計出了流水線結構:仿照工業流水裝配線,將計算機的功能部件分為多個梯級,並將計算機的每條指令拆分為同樣多個步驟,使每條指令在流水線上流動,到流水線最后一個梯級時指令執行完畢

  下圖展示了5個梯級的流水線結構,流水線上的每個梯級都可以容納一條指令並同時執行。

  在流水線的基礎之上,為了進一步提高效率,人們又發明了多流水線、超標量計算和超長指令字等多指令發射機制。

1.3 存儲結構

  除了指令執行單元外,計算機中的另一個重要部件是指令的存放單元,被稱為存儲架構。存儲架構包括了緩存、主存、磁盤、磁帶等。下圖展示了一個包括寄存器在內的5級存儲介質構成的存儲架構。

  從寄存器到磁帶,每一級存儲媒介的訪問延遲和容量均依次增大,而價格卻依次降低。從圖中可以看出,寄存器的訪問速度最快,容量最小,但成本卻最高;磁帶的訪問速度最慢,容量最大,但是成本卻最低。通過合理搭配,可以形成一個性價比頗高的存儲架構。

1.4 中斷機制

  中斷是計算機里面的一個最為重要的機制,它也是操作系統獲得計算機控制權的根本保證。其基本原理是:設備在完成自己的任務后向CPU發出終端,CPU判斷優先級,然后確定是否響應。如果響應,則執行中斷服務程序,並在中斷服務程序執行完后繼續執行原來的程序。下圖簡單地描述了中斷機制:

二、抽象

  所謂抽象,就是在根本上存在但現實中不存在的東西。抽象來源於具體,但又超越具體

  操作系統提供的抽象來源於顯示,就是具體的計算機硬件,如CPU、內存、I/O設備等等。但又超出這些現實,給人提供了強於現實的東西,使人和應用軟件感覺到更多、更好的硬件存在。

  抽象不只是操作系統提供給用戶的一個存在,它也存在於操作系統內部。操作系統內部分為不同的功能模塊,而不同功能塊之間互相提供的也是抽象。想想在我們得實際開發中,是不是也遵循着這樣類似的原則?針對抽象編程?面向接口編程?依賴於抽象而不依賴於具體?

三、內核態與用戶態

殘酷的現實:世界上的人並非都是平等的,有些人生來占有的資源就多,而有的人占有的資源就很少。當有些人來了,其他人就得讓出資源。程序亦是如此。

  操作系統作為計算機的管理者,享有着更多的方便或權限。為了區分不同的程序的不同權限,人們發明了內核態和用戶態的概念。

3.1 兩種狀態的概念

  內核態就是擁有資源多的狀態(或訪問資源多的狀態),也稱為特權態。而用戶態則是非特權態,在用戶態下訪問的資源會受到限制。例如,要訪問OS的內核數據結構,如進程表等,則需要在特權態下才能做到。如果只需要訪問用戶程序里的數據,則在用戶態下就可以了。

3.2 兩種狀態的優勢

  內核態:訪問資源多,但可靠性、安全性要求高,維護管理都比較復雜;

  用戶態:訪問資源有限,但可靠性、安全性要求低,維護起來比較簡單;

  那么,一個程序到底應該運行在內核態還是用戶態呢?這取決於其對資源和效率的需求;下圖展示了Windows操作系統的內核態與用戶態的界限,我們可以看到哪些需要在內核態下運行,哪些只在用戶態下運行。

3.3 兩種狀態的本質

  計算機對於內核態和用戶態的識別是通過CPU的一個狀態位來實現的,這個狀態位是CPU狀態字里面的一個字位。所謂的用戶態、內核態實際是CPU的一種狀態,而不是程序的狀態。通過設置該狀態字,可以使CPU處於內核態、用戶態或者其他的子態(有的CPU有更多種子態)。

  換句話說:一個程序運行時,CPU是什么態,這個程序就運行在什么態。

  那么,知道了是怎么實現的,那又是如何對用戶態的訪問進行限制的呢?在對用戶態下程序執行的每一條指令進行檢查,這種檢查又被稱為地址翻譯,即對程序發出的每一條指令都要經過這個地址翻譯過程(你可以將其理解為我們在實際開發中所作的權限管理,對用戶發出的每個操作請求首先都經過一個Filter進行過濾),通過對翻譯的控制,就可以限制程序對資源的訪問。

四、操作系統結構

4.1 單一體結構

  單一體結構是最早期的結構,這時整個OS是一個巨大的單一體,運行在內核態下,為用戶提供服務,如下圖所示。

  但單一體結構各功能塊之間關系復雜,修改困難,牽一發而動全身,且容易形成循環調用造成死鎖,於是有了下面的層次關系。

4.2 層次化結構

  將操作系統的功能分成不同的層次,低層次的功能為緊鄰其上一個層次的功能提供服務,而高層次的功能又為更高一個層次的功能提供服務,如下圖所示。

4.3 微內核結構

  從單一體和層次化結構的圖中可以看出,操作系統的所有功能都在內核態下運行。但是,從用戶態轉為內核態是有時間成本的,這樣就會造成OS的效率低下。於是,人們將操作系統的核心中的核心才放在內核態運行,其他功能都遷移到用戶態運行,於是就有了下面的微內核結構。

五、進程、內存和文件

5.1 進程

process

  進程是OS中的核心概念,它指的是一個運動中的程序。一個程序一旦在計算機里運行起來,它就稱為一個進程。進程與進程之間可以進行通信、同步、競爭,並在一定情況下可能形成死鎖。

5.2 內存

  內存是另一個核心概念,它是進程的存放場所。OS要做的就是對內存進行管理,使得數據讀寫高效、安全、簡單。

5.3 文件

  文件是操作系統提供的外部存儲設備的抽象,它是程序和數據的最終存放地點。OS要做的就是讓用戶的數據存放變得容易、方便和可靠。

六、系統調用

  操作系統是一個系統程序,即為別的程序提供服務的程序。那么,操作系統的服務是通過什么方式提供的呢?答案就是:系統調用(System Call)。

  所謂系統調用就是:操作系統提供的API,用戶通過調用這些API即可獲得操作系統的服務。(想想是不是跟我們現在所作的什么Web Service、WCF、WebAPI、開放API之類的一致?)例如,如果用戶程序需要進行讀磁盤的操作,在C程序代碼中可以使用如下語句來操作:

    result = read(fd, buffer, nbytes);

  這個read函數是C語言提供的庫函數,而這個庫函數本身則是調用的操作系統的read系統調用。具體的系統調用過程不是我們討論的重點,但我們還是可以通過下圖來看看這個read系統調用的過程。

參考資料

鄒恆明,《操作系統之哲學原理》,機械工業出版社

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM