---
# System prepended metadata

title: OS structure
tags: [OS Note Pro]

---

# OS structure
###### tags: `OS Note Pro`

## 簡介
要細述作業系統的架構，首先要先來理解:作業系統能帶給使用者什麼樣的服務，進而才能知道，我們需要怎去設計一個作業系統。而要去設計一個作業系統，必須了解他與其他層的關係是如何，其中，本文先主要介紹:OS與user space(program、user)之間的interface，也就是**System calls** 與 **API**。最後再來介紹各種現有的作業系統架構。

[Toc]

## OS Service
常見的OS Services有:**User interface(CLI、GUI)**、**Program execution**、**I/O device management**、**File system management**、**Communication (process)**、**Hardware resourse allocation**、**Protection**。

### User interface
- <font color="blue">CLI (command line interface)</font>
這種由使用者直接下指令的純文字介面我們稱為**Shell**，shell的功用是將輸入的command line去interprete 成更底層的指令，作用就像compiler一樣。相較於GUI的優點是 : 他能夠更貼近使用者的習慣，且GUI本身就是建在CLI之上的，所以CLI能辦到的事更多。
- <font color="blue">GUI</font>
有鼠標、檔案的icon等等，優點是比較user friendly，但由於要多處理這些圖形化的東西，就需要多跑許多process，所以是比純文字介面慢的。
:::info
現今的電腦幾乎兩個介面都有，但對於一些研究導向、純計算用途的電腦就會為了效能而只用CLI。
:::

### Communication
這裡的Communication指的是，process與process之間。
因為只有OS有權利讀你的資料，所以所有的communication都必須透過OS。
- <font color="blue">Message passing</font>
當有一個process要將data傳給另一個process的時候，會先將data copy到kernel，然後另一個process再去kernel將data copy到自己的memory中。
- <font color="blue">Shared memory</font>
process間彼此有共用的memory空間，需要的時候就傳到這個memory就好，也可以直接從中讀取。
:::info
Message passing的缺點是 : 這樣copy來copy去太慢了。
Shared memory的缺點是 : 同時存取容易產生**dead-lock**，雖然比較快一些。
:::

## System call v.s. API
兩者並不是平行的對等關係，而是垂直的相依關係。要叫OS幫你做事，就要透過System calls，所以說System call 就是OS的interface。而API在system call的上層，是直接與program溝通的。
- <font color="blue">API</font>
簡單來說，API就是我們常見的function，普遍是以C library(或稱為 system language)構成。它能夠處理使用者的要求，與system call之間的關係有可能是一對多、一對一或甚至一對零都不一定，所以API並不是單純的interpreter。
- <font color="blue">System call</font>
可以透過**software interrupt**來與對kernel提出要求。而為了快速，system call都已assembly language來寫。(OS唯一的interface)
:::success
呼叫system call 後一定會進到kernel mode。
:::
:::info
API存在的意義是 : 最主要是因為呼叫system call都需要透過interrupt，這樣太慢了，每次都要打斷kernel，所以讓API先判斷你這個function call可不可以由他自己解決，也就是1對0的情況。再者API能夠方便使用者做programing。
:::

### Interface vs Library
Interface 是接口，給他你要的參數，就可以達到你想要的事，但你不會知道它內部是怎麼實作的。
Library就是它實作的部分，實作的方法有很多，但那是designer要知道的事。

### 常見的API
- Win32 : Windows
- POSIX : Linux、Unix、MacOS
:::success
在相同的API下，即使OS不同，程式也是相容的，只需要Compiler就可以，不需要更改程式碼。
**Compiler** : 是將program處理成底層的instructions for 不同的kernel(硬體架構)，所以在不同的kernel下compile 是必須的。
:::


## OS Structure
### Simple OS
- DOS
沒有甚麼分層架構，除了user application和driver，中間的部分都混在一起寫，所以安全性很差，管理debugger也難。
### Layerd system
以上下分層的方式建構的系統，上層能向下層指令，但下不能往上溝通。優點是debugger變方便。
### Microkernel
最小化核心，將其他功能都丟到user space，modulize的方式一個個在連到kernel。優點是 : 安全性高、debugger 方便，其中一個module crash，也不會連帶影響到其他module; 缺點是 : 每個module與kernel連接都有interface，傳遞變慢。
### Moduler system
與上者很像，只是全部都搬到kernel中了，彼此傳遞也因此變快，是目前最常見的kernel架構。
### Virtule machine
對於沒有hardware support(有VM mode 的bit)的硬體要達到"Full Virtulize"是很困難的，但VM ware做到了。VM是建立在"host kernel"上的virtule kernel，建立在user space中，所以system call 還是得靠host來處理，而這之間的協調是有些複雜的(VM -> hardware -> interrupt -> host os -> complete)。
- <font color="blue">Feature</font>
待補....
:::info
VM 最怕的是**critical instruction** : 在user space和kernel space執行的結果不同。
:::

:::spoiler BIOS補充
https://www.google.com/search?q=bios&rlz=1C1CHBF_zh-TWTW896TW896&sxsrf=ALeKk01ZRQT3SsASDlJ5q6q39V9sG0fz-A%3A1617959980281&ei=LBxwYMnaEM37-Qa1taa4DQ&oq=bios&gs_lcp=Cgdnd3Mtd2l6EAMyBAgAEEMyAggAMgQIABBDMgIIADICCAAyAggAMgUIABCxAzIICAAQsQMQgwEyAggAMgIIADoHCCMQ6gIQJ1CKxMEFWP3GwQVgkMjBBWgBcAB4AIABzAGIAa0FkgEFMS4zLjGYAQCgAQGqAQdnd3Mtd2l6sAEKwAEB&sclient=gws-wiz&ved=0ahUKEwjJoIrP6vDvAhXNfd4KHbWaCdcQ4dUDCA0&uact=5
:::
