深刻理解計算機系統(1.3)------操做系統的抽象概念

  上一篇博客咱們講解了存儲設備的層次結構,並詳細講解了高速緩存的原理,以及能夠利用高速緩存來提升程序性能。若是對Java Web 熟悉的,咱們能夠理解高速緩存相似Web 端的緩存機制。那麼這一篇博客咱們來引出並談談操做系統的抽象概念。java

 

一、操做系統

  首先接着來討論 hello world 程序的例子。當外殼加載和運行 hello 程序,以及 hello 程序輸出本身的消息時,外殼和 hello 程序都沒有直接訪問鍵盤、顯示器、磁盤或者主存。取而代之的是,它們依靠操做系統提供服務。程序員

  那麼什麼是操做系統呢?咱們能夠把操做系統當作應用程序和硬件之間插入的一層軟件,以下圖:數據庫

  

  如圖可知:全部的應用程序對硬件的操做都必須經過操做系統。常見的操做系統好比windows、Unix、Linux等等。編程

  操做系統的兩個基本功能:windows

  ①、防止硬件被失控的應用程序濫用。緩存

  ②、嚮應用程序提供簡單一致的機制來控制複雜而又截然不同的低級硬件設備。多線程

  咱們能夠經過進程、虛擬存儲器和文件這幾個抽象概念來實現上面兩個功能。併發

  

 

   如上圖:文件是對I/O設備的抽象表示,虛擬存儲器是對主存和磁盤I/O設備的抽象表示,進程則是對處理器、主存和I/O設備的抽象表示。下面咱們分別對其進行介紹。函數

 

二、進程

   當咱們去運行 hello 程序的時候,操做系統會給我提供一種假象,就好像系統只有這個程序在運行。處理器看上去就像在不間斷的一條接着一條地執行程序中的命令,即該程序的代碼和數據是系統存儲器中惟一的對象。性能

  這實際上是一種假象,而這種假象是經過進程的概念來實現的。

  進程是操做系統對一個正在運行的程序的一種抽象,在一個系統上能夠運行多個進程,而每一個進程都好像在獨佔的使用硬件。但實際上,他們是併發的在運行,即一個進程的指令和另外一個進程的指令是交錯運行的。

  在單CPU系統中,系統在一個時刻只能運行一個進程,多CPU系統中,系統則是可以同時處理多個進程。但不管是單核仍是多核,一個CPU只能併發的執行多個進程,這是經過處理器在進程間切換來實現的。而操做系統實現這種交錯機制稱爲上下文切換。

  上下文:操做系統保持跟蹤進程運行所需的全部狀態信息,好比PC和寄存器文件的當前值,主存的內容。

  

  好比上面的A進程是外殼進程,B進程是hello進程。起初只有外殼進程在運行,即等待命令行上的輸入,當咱們輸入相關命令讓它運行hello程序時,外殼經過調用一個專門的函數,即系統調用,來執行咱們的請求,系統會將控制權傳遞給操做系統。操做系統保存外殼程序的上下文,建立一個新的 hello 進程以及上下文,而後將控制權傳遞給新的 hello 進程。hello 進程終止後,操做系統恢復外殼進程的上下文,並將控制權回傳給它,外殼程序將繼續等待下一個命令行輸入。

  實現進程這種抽象概念須要低級硬件和操做系統軟件之間的緊密合做,這個實現原理以及應用程序如何建立和控制它們的進程的呢?做爲程序員的角度,這裏咱們講一下,一個進程其實是由多個稱爲線程的執行單位構成,每一個線程都運行在進程的上下文中,並共享一樣的代碼和全局數據,多線程比進程高效,多線程更容易共享數據。如何併發編程提升程序效率的要點後面咱們會詳細講解。

  

三、虛擬存儲器 

   虛擬存儲器是一個抽象概念,它爲每一個進程提供了假象,即每一個進程都在獨佔的使用主存。每一個進程看到的是一致的存儲器,稱爲虛擬地址空間。下圖是 Linux 進程的虛擬地址空間(其餘Unix 系統設計相似):

  

  在Linux系統中,地址空間最上面的區域是爲操做系統中的代碼和數據保留的,這對全部進程是一致的。地址空間的底部區域存放用戶進程定義的代碼和數據。上圖的地址從下往上是增大的。

  咱們從最低的地址,逐步向上介紹上面出現的區域名詞。

  ①、程序代碼和數據:對於全部進程來講,代碼是從同一固定地址開始的,分別爲0x08048000(32位)以及0x00400000(64位),緊接着是全局變量相對應的數據位置。

  ②、堆:代碼和數據區後緊隨的是運行時堆。代碼和數據區是在進程一開始運行時就規定了大小,而當調用malloc和free這樣的 C 標準庫函數 時,堆能夠在運行時動態的擴展和收縮。

  ③、共享庫:存放像C標準庫和數據庫這樣的代碼和數據的區域。

  ④、棧:位於用戶虛擬地址空間頂部,編譯器用它來實現函數調用,用戶棧在程序執行期間能夠動態的擴展和收縮。當咱們調用一個函數時,棧會增加;從一個函數返回時,棧會收縮。

  ⑤、內核虛擬存儲器:內核老是駐留在內存中,是操做系統的一部分,不容許應用程序讀寫這個區域的內容或者直接調用內核代碼定義的函數。

   關於全部進程代碼是從同一固定地址開始的,這裏咱們作個驗證,咱們在 Linux 64位系統上,在存放hello.c程序的目錄下輸入以下命令:運行前面寫好的 hello.c 程序,並查看地址信息

gcc -Wl,--verbose hello.c

  

 

四、文件

  文件就是字節序列,即由值0和值1組成的序列。全部的I/O設備,包括磁盤、鍵盤、鼠標、顯示器均可以當作是文件。

  文件這個簡單而精緻的概念嚮應用程序提供了一個統一的視覺來看待系統中全部的I/O設備。這帶來的好處顯而易見,好比同一個程序可使用不一樣磁盤技術的不一樣系統運行。

 

五、計算機系統中抽象的重要性

  抽象的使用是計算機科學中最重要的概念之一。例如,爲一組函數規定一個簡單的應用程序接口API就是一個很好的編程習慣。程序員無需瞭解它內部的工做原理即可以使用這些代碼。這在Java當中的典型好比類的定義,C語言中的函數原型。

  

 

六、本章總結

  本章主要介紹了抽象概念在計算機系統中的重要性以及操做系統的抽象概念,包括進程、虛擬存儲器以及文件。

  那麼深刻理解計算機系統第一章計算機系統的漫遊將到此結束。若是又不太理解的也不要緊,畢竟前面講的都是一些概念,後面咱們將會詳細講解。而下一章信息的表示和處理,多是與咱們平常編碼最相近的東西,各類數據類型在計算機老是如何存儲,它們之間作運算會有什麼意想不到的結果等等。若是好好理解了,相信在後面的編碼會更加駕輕就熟。

相關文章
相關標籤/搜索