第三章-----作業系統基本概念

飄過的小熊發表於2016-09-01

第三章—–作業系統基本概念

標籤(空格分隔): 作業系統之哲學原理



計算機硬體基本知識

結構非常簡單:先佈置一根匯流排,然後將各種裝置掛在匯流排上。所有的裝置都有一耳光控制裝置,外部裝置都由這些控制器與CPU通訊,而所有裝置之間需要通過匯流排。

為了提高計算機的效率(一說吞吐量),人們設計出流水線結構,為了進一步提高計算機的效率,在流水線的基礎上發明了多流水線,超標量計算和超長指令發射機制。
(讓我們回憶計組的中斷)


抽象

作業系統提供的是一個抽象。所謂的抽象就是在根本上存在但現實中不存在的東西。抽象不只是作業系統提供給使用者的一個存在,也存在於作業系統內部,作業系統內部分為不同的模組,不同的功能塊之間互相提供的也是抽象。


核心態和使用者態

作業系統作為計算機的管理者,自然不能和被管理者享受一樣的待遇,他應該享受更多的許可權,為了區分不同的程式的不同許可權,人們發明了核心態和使用者態的概念。

核心態:就是擁有資源多的狀態,或者訪問資源多的狀態,稱為特態權。如果一個程式執行在核心態就可以訪問計算機的任何資源。
使用者態:就是非特權態,在這種狀態下訪問的資源將受到限制。

核心態和使用者態各有優勢:執行在核心態的程式可以訪問呢更多的資源,但是可靠性和安全性要求更高,維護和管理都比較複雜。使用者態訪問的資源有限,但是可靠性安全性要求都比較低,自然很好維護。一個程式到底是在哪種狀態下執行取決於對資源和效率的需求

一般來說,凡是牽扯到計算機本體執行的事情都應該在核心態中執行,只與使用者資料和應用有關的東西則放在使用者態執行。另外,對時序要求較高的操作,也應該在核心態完成。

  • CPU的管理和記憶體管理都應該在核心態實現
  • 診斷與測試程式也需要在核心態實現
  • 對於檔案系統,一部分可以放在核心態,一部分可以放在使用者態。檔案系統本身的管理必須放在核心態,否則任何人都能夠破壞檔案系統。使用者資料的管理則可以放在使用者態。
  • 編譯器。網路管理的部分功能編輯器使用者程式等,自然都可以放在使用者態下執行。

態勢的識別

做一個標誌,這個標誌就是處理器的狀態位。這個狀態位是CPU狀態字裡面的一個字位。其實所謂的核心態,使用者態實際上是處理器的狀態而不是程式的狀態,一個程式執行時,CPU是什麼狀態,這個程式就是執行在什麼狀態。

核心態與使用者態的實現

對訪問的限制是如何實現的?
要限制一個程式對資源的訪問,需要對程式執行的每一條指令進行檢查,而這種檢查就是地址翻譯。通過對地址翻譯的控制,就可以限制程式對資源的訪問。換句話說,當系統處於核心態時核心程式可以繞過記憶體地址翻譯而直接執行特權指令。


作業系統結構

早期沒有什麼意識,就是幾個庫函式。當然當時也沒有將這幾個庫函式叫做作業系統,想到了什麼功能就加,沒有一個統籌兼顧。顯然當時是雜亂的,無結構的。
後來人們逐漸意識到這樣不行。於是將各個功能分成不同的功能塊,相互獨立,又經過固定的介面相互聯絡。功能塊之間可以相互呼叫。整個作業系統是一個巨大的單一體執行在核心態下。
再後來人們發現單一體的作業系統有很多的缺點:功能塊之間關係複雜,修改功能牽一髮而動全身。同時很容是造成迴圈呼叫,形成死鎖。於是想到像人類社會一樣進行層次關係分開。同樣作業系統的所有功能都在核心態下執行。這樣的作業系統同樣有問題:

  • 所有服務都要進入核心態才能使用,而從使用者態進入核心態是需要時間成本的,造成作業系統的效率低下
  • 隨著作業系統越來越大,安全問題得不到保證

再後來人們又想了一個辦法:微核心結構。只將作業系統的核心中的核心放在核心態執行,其他功能都轉移到使用者態執行。同時提高了效率和安全性


程式,記憶體和檔案

一個程式一旦執行起來就成為一個程式,作業系統對程式的管理通過程式表來實現。程式表裡放的是關於程式的一切資訊。在任何時候,程式所佔的全部資源,包括分配給該程式的記憶體,核心資料結構和軟資源形成一個程式核。核快照代表的是程式在某一特定時刻的狀態。

如果在LInux或者UNIX作業系統下編寫程式,在出現分段錯誤的時候作業系統會自動進行核倒出。核倒出把所有的計算機狀態儲存在一個檔案中,通過閱讀這個檔案的內容可以得知溢位時的程式狀況。

  • 程式與程式之間可以通訊,同步,競爭。並在一定情況下可能形成死鎖
  • 記憶體是作業系統裡面的另一個核心概念,是程式的存放場所。如何對記憶體進行管理,使得資料的讀寫具有高效率,高安全,高空間利用率和位置透明的特性是記憶體管理所要達到的目的。
  • 檔案是作業系統提供的外部儲存裝置的抽象,是程式和資料的最終存放地點。如何讓使用者的資料存放更容易方便,可靠和安全是檔案系統要解決的問題。

系統呼叫

系統呼叫就是作業系統提供的介面。(API)使用者通過呼叫這些API獲得作業系統的服務。

系統呼叫劃分

  • 程式控制類
  • 檔案管理類
  • 裝置管理類
  • 資訊維護類
  • 記憶體管理類
  • 通訊類

系統呼叫三階段

  • 引數準備階段
  • 系統呼叫階段
  • 系統呼叫執行階段

系統呼叫中的引數傳遞

  • 暫存器,效率最高

殼(shell)

API呼叫需要程式設計,於是作業系統接過工作,使其變得簡單的原則,提供了一個殼(shell)來與使用者互動。每個系統都提供某種殼。這個殼既可以是圖形介面又可以是文字介面。使用者不能直接呼叫作業系統服務,用C的庫函式來實現這個問題。

一個殼的具體功能

  • 顯示提示符,如Linux中的%
  • 接受使用者命令並執行
  • 實現輸入輸出間接
  • 啟動後臺程式
  • 進行工作控制
  • 提供偽終端服務

殼做的事情很簡單

  • 顯示命令提示符
  • 等待使用者輸入命令
  • 使用fork建立子執行緒
  • 使用exexve在建立的子執行緒裡執行使用者輸入的命令。

具體實現過程在書上。

相關文章