【作業系統】作業系統的結構

朱痕染跡璧有瑕
12 min readApr 5, 2021

--

https://pixabay.com/photos/potsdam-castle-sanssouci-tea-house-2388157/

本文為清華大學開放式課程上課心得整理。

Nachos 介紹

Nachos 是一個虛擬的作業系統(VM),當我們在電腦上安裝 Nachos 時,事實上是在原本就有的作業系統上再安裝一個作業系統,來模擬真實的作業系統的運作。

由於 Nachos 的運作是模仿真實作業系統,因此如果想在上面執行程序,就必須自己撰寫 user programm,user programm 必須呼叫 Nachos 的 system call 才能執行請求,此時所執行的就是前面課程曾經提到的 interupt 流程。

Nachos 模擬的並非 x86 instruction,而是 MIPS,因此必須再透過 simular 做轉譯,才能在 Linux 上執行。

https://www.youtube.com/watch?v=eLQU3zlpoRQ&list=PL9jciz8qz_zyO55qECi2PD3k6lgxluYEV&index=14,3 分 22 秒截圖

Nachos 有幾個比較重要的資料夾:

同上,11 分 25 秒截圖

lib:Nachos 內部運作需要使用的函式庫。

machine:上述的 simular 執行設定在此。

threads:對電腦來說,Nachos 也是一隻裝在上面的程式,因此所有的程式執行設定都在這裡。

同上,14 分 18 秒截圖

test:User programs 放置的地方,最好能跟著原本的邏輯設置,避免混亂。

userprog:Nachos OS code 存放的地方,也是 threads 執行的程式碼來源。

同上,16 分 03 秒截圖

network:Nachos 也可以模擬 WebSocket、TCP/IP 等功能,所有相關設定都在這裡。

filesys:Nachos 支援兩種不同類型的 filesystem,一種是真實的,有就是真實存在於 Nachos 的資料夾;另一種是不存在的資料夾,在執行時由系統直接指向到電腦的真實資料夾做處理。當然這在真正的作業系統中並不會發生,這也是 Nachos 被稱為是不完整的作業系統的原因。

OS Services

由於使用者必須透過作業系統請求機器執行指令,因此我們將作業系統的功能稱為 services。

https://www.youtube.com/watch?v=bhrg7-YWuEA&list=PL9jciz8qz_zyO55qECi2PD3k6lgxluYEV&index=15,4 分 24 秒截圖

User Interface

User Interface 分為兩種:

・CLI(Command Line Interface):輸入文字下達指令,也是最早的電腦互動形式。

・GUI(Graphical User Interface):透過圖形介面引導使用者操作電腦,建立在 CLI 上。

透過 User Interface 下的指令,並不會直接到作業系統,而是透過一隻專門的程式(稱為 Shell)傳遞給作業系統,目前常見的 Shell 有 CSHELL 與 BASH。這是因為電腦會有很多使用者,每個使用者的習慣與喜好都不同,此時只要透過修改 shell 的設定,就可以滿足各種客製化需求。

Communication Models

Communication 可以在同一台電腦或是不同電腦上發生,透過記憶體的使用可以區分成兩大類:

・message passing:將訊息複製到 kernel 的 記憶體中,再讓另一個程序複製到自己被分配到的記憶體中使用。

・shared memory:兩隻程式共用某一塊記憶體,將需要分享的資訊直接放在共享記憶體中。之前曾經提過,為了保護系統,每個程式能使用的記憶體都被限制,因此要做到共享還是必須透過 system call 由作業系統協助完成。

message passing 因為要複製資訊,在執行上速度會比較慢;shared memory 則是死結(deadlock)議題出現的原因。

OS-Application Interface

System calls

作業系統提供的服務方式就稱為 System calls,也是電腦唯一的 interface。System calls 有幾個特性:

  1. 是 soft interrupt:如此才能改變 user mode。
  2. 考慮到效能,System calls 都是用 assembly language 寫成。

API

由於 System calls 是組合語言,為了方便使用者操作,因此會多一層介面,用以與 System calls 溝通,這就是 API。API 的形式通常為 library,大部分的 API 都是使用 C 語言寫成。

https://www.youtube.com/watch?v=iO2_YEdX6gY&list=PL9jciz8qz_zyO55qECi2PD3k6lgxluYEV&index=17,7 分 11 秒截圖

一個 API function call,可能必須由很多個 System calls 聯合完成,也可能不需要任何 System calls 就能完成,兩者的對應沒有絕對的關連性。

同上,14 分 23 秒截圖

與一般函示相同,System calls 也有傳送參數的需求,System calls 傳送參數的方法有以下幾種:

・Pass parameters in registers:將參數寫入暫存器供 CPU 存取。

・Pass parameters in a table memory:傳入 pointer。

・Push(store)parameters onto the stack:每個 process 都會有一塊記憶體(stack),可以將參數存到裡面,再 pop 出來使用。

同上,27 分 21 秒截圖

OS Structure

第一代作業系統由於只求順利執行,架構上比較粗糙,只大略分成驅動程式、作業系統以及 appilication 三個部分,也因為當時網路不發達,在資安的考量上比較沒那麼周全,所以容易出現安全性漏洞,也因為程式碼混在一起,所以不好維護。

https://www.youtube.com/watch?v=-C8f_ZIUKbE&list=PL9jciz8qz_zyO55qECi2PD3k6lgxluYEV&index=17,5 分 12 秒截圖

很快開發者就發現 simple 不是一個好的做法,因此便有人提出 Layered Os Architecture 的概念,將每個不同的 process 切割成一個一個的層級,level 高的可以呼叫 level 低的,反之則不然。

這樣做的好處是便於維護,缺點則在於作業系統的每個環節都可能互相呼叫,因此層級不好定義,同時也因為分了層級,必須一層一層往下呼叫,因此效能會比較差。

同上,9 分 42 秒截圖

除了上述架構,還有一種 MicroKernel OS,主張 kernel 的程式碼應該越少越好,同時也出現了 modulize 的概念,就是將 subsystem 模組化,kernel 只負責管理模組之間的傳輸和溝通。

MicroKernel 將在 kernel 外面 process 全部定義為 user space,縮減 kernel 的範圍,因此容易擴展,缺點是因為 subsystem 模組化,與 OS 的溝通必須透過 system call,同時使用 message passing 的方式利用記憶體,所以效能會比上述架構更差。

同上,11 分 08 秒截圖

Modular Os Architecture 是目前最常見的作業系統架構,也符合現今物件導向程式設計的概念。

Modular Os Architecture 也是將作業系統拆分成一個個的 subsystem,而且這些 subsystem 也必須先定義好 interface。與 MicroKernel 不同的是,Modular Os Architecture 將這些模組都歸進 kernel space,所以保留了比較大的彈性。

同上,16 分 03 秒截圖

Virtual Machine

虛擬機出現得相當早,幾乎是開始設計作業系統的架構時,就已經有人提出應該以虛擬機的概念管理硬體,但在當時的時空背景下,硬體與 CPU 無法快速處理這樣的運算,因為效能不好所以沒有變成主流。

Virtual Machine 的概念是抽象化,即使下面還有另一個作業系統存在,它還是能將它抽象化為另一個硬體。此外,作業系統在設計的時候,會對硬體做一些假設(assumption),這些假設為虛擬機的設計帶來難題,稱為 Critical Instruction。

由於虛擬機是在原本的作業系統上再架設一個系統去執行程式,它將原本的作業系統當成硬體管理,因此就產生了 user space/kernel space 的問題——對虛擬機自己來說,它是 kernel space,但對真正的作業系統而言它是 user space,因此當虛擬機要執行 Privileged instructions 時,就會被系統拒絕。

這個問題的解法便是利用 interrupt。當電腦接到虛擬機的指令,並認為它是違法的時候,會拋出一個 interrupt,這個 interrupt 會先回到 OS,OS 如果判斷這個請求來自虛擬機,便代替虛擬機執行這個 Privileged instruction。

上述問題也是虛擬機執行速度較慢的原因之一,不過現在有的 CPU 有 hardware support 的功能,可以直接判斷 Privileged instructions 是否來自虛擬機,省去中間重覆執行的過程,也能提升虛擬機的效能。

上述狀況還有一個延伸問題,即是 Critical Instruction,指的是虛擬機執行結果與 OS 執行結果不同。Critical Instruction 並不是 Privileged instructions,所以可以在 user space 執行,也因此 Critical Instruction 不會有 interrupt,在沒有硬體的支援下除錯會變得很困難,也是虛擬機的設計難題。

虛擬機也有其優點:

・Protection:虛擬機彼此分離,可以將系統被駭所造成的影響降至最低。

・compatibility:有些軟體必須安裝在指定的作業環境下,虛擬機可以根據需求設定不同環境供軟體使用。

・Research and Development:作業系統只要有錯誤便會崩潰,但若在虛擬機上做測試修改,就能避免電腦真的壞掉的可能。

・Cloud Computing:雲端計算崛起,為了達成資源共享的目的,虛擬機技術便開始被大量運用。

虛擬機的技術可以分為以下幾種類型:

・Full Virtualization:虛擬環境中會有兩個作業系統,即原生作業系統(host OS)與虛擬作業系統(guest OS),Full Virtualization 的概念便是:無論裝在什麼作業系統上,guest OS 的程式碼皆不需更動,就像虛擬機本來就在電腦上一樣。

同上,26 分 42 秒截圖

・Para-virtualization:除了 host OS 和 guest OS 外還有一個 global zone,用來執行特別的程式,這隻程式知道所有虛擬機的存在,guest OS 的程式碼也必須隨著作業系統做修改。

同上,28 分 54 秒截圖

・Java Virtual Machine:Java 是一個很特殊的程式,它建立在 Virtual Machine 的概念上。由於 JVM 只執行 instruction,所以比較單純,接近 Nachos。由於是在虛擬環境執行,對記憶體的使用都是獨立空間,也相對較安全。

Java 另一個特點是 Just-In-Time,也就是會記住曾經使用過的 function call,當遇到同樣的 function 時,編譯器不需再次編譯,只要從函式庫中取出,直接傳送給作業系統執行即可,用來優化 instruction 速度慢的問題。

同上,33 分 21 秒截圖

自主學習:

同上,35 分 06 秒截圖

--

--

No responses yet