# Chap. 02 - OS structure
> 課程內容 : 清華大學開放式課程 周志遠教授
> 參考書目 : Operating System Concepts (9th), Abraham Silberschatz, Peter Baer, Galvin, Greg Gagne
>
> 其他科目內容請參見 [[Here]](https://hackmd.io/@ChenZE/By4SOO6Jyl)
**Note:** [#system call](#Q-請簡述何謂系統呼叫system-call) [#API](#Q-請簡述何謂-API)
## Contents
* [OS services](#OS-services)
* [1. User interface](#1-User-interface)
* [2. Communication models](#2-Communication-models)
* [2.1 Message passing](#21-Message-passing)
* [2.2 Shared memory](#22-Shared-memory)
* [OS-Application interface](#OS-Application-interface)
* [1. System call](#1-System-call)
* [2. API](#2-API)
* [3. System call v.s. API](#3-System-call-vs-API)
* [OS structure](#OS-structure)
* [1. Simple OS architecture](#1-Simple-OS-architecture)
* [2. Layered OS architecture](#2-Layered-OS-architecture)
* [3. Microkernel OS](#3-Microkernel-OS)
* [4. Modular OS architecture](#4-Modular-OS-architecture)
* [5. Virtual machine](#5-Virtual-machine)
* [5.1 Usage of VM](#51-Usage-of-VM)
* [5.2 VM techniques](#52-VM-techniques)
## OS services
OS 可以看成是一個提供 service 的軟體,提供的服務內容有以下幾種
* **User interface**
* Program execution
* OS 會將程式(program)載入至 memory 做計算,若無法結束也會透過 OS 做停止
* I/O operations
* User program 不能直接進行 I/O 的計算,需要透過 OS
* File-system manipulation
* 檔案存取系統是一種 privileged instruction,因此需要 OS 函式給 user program
* **Communication**
* Error detection
* Resource allocation
* Accounting
* Protection and security
* 這邊的 protection 指的是對系統的保護,避免多人使用時各自操作的結果導致系統崩壞
後續內容針對粗體字項目做簡介
### 1. User interface
使用者介面(user interface)分為兩種: **Command Line Interface(CLI)** 與 **Graphic User Interface(GUI)**
CLI 是從使用者端擷取輸入的指令後執行,但**實際上 CLI 的指令並不是直接提供給 OS 執行**,而是**傳給 shell 後再做類似 compile 的動作**。
Shell 可以看成是一支**提供 interface 的程式**,主要進行 command line interpreter。此外 shell 可以根據 user 的習慣來更改 CLI 的設定檔,符合自己的風格。Ex: 文字顏色與粗體變化等,最常見的 shell 是 bash 與 cshell。
GUI 通常使用滑鼠、鍵盤的裝置,並使用小圖示表示檔案與程式。一般來說大部分的系統同時都會包含這兩種介面
### 2. Communication models
這邊的 communication model 指的是**兩個 process 之間的溝通方式**,分為兩種方式: **message passing** 與 **shared memory**
<img src="https://hackmd.io/_uploads/BJud8rS7kx.jpg" width=600>
#### 2.1 Message passing
先把資料從 process A 複製一份到 OS kernel,再從 OS kernel 移動到另一個 process B,如上圖左。
優點: protection OS kernel
缺點: too slow (因為有一堆複製與搬移的動作)
#### 2.2 Shared memory
透過 **system call** 的方式**讓 OS 分享一塊記憶體位址**提供兩個不同的 process 能夠互相溝通,如上圖右。
## OS-Application interface
### 1. System call
System call(系統呼叫)是**作業系統提供給 user program ==與核心互動的介面==**,因為 user program 無法直接操作底層硬體,因此需要**透過 system call 向 OS 請求某些服務**。
* Process control : 包含建立(create)、終止(terminate) process,或是分配(allocate)、釋放(free)記憶體
* File management : 包含建立(create)、刪除(delete)、開啟(open)檔案等
* Device management : 包含讀取(read)、寫入(write)等動作
* Information mainienance : 維護重要資訊
* Communication : 包含上節提到的傳送(send)與接收(receive)訊息(message)
> [!Tip] **Interview Ques.**
> ##### Q: 請簡述何謂系統呼叫(system call)
> System call 是使用者與 OS kernel 之間互動的介面,因為使用者無法直接操作硬體資源(Ex. 開啟檔案),必須使用 OS 提供的 system call 才能透過 kernel 間接操作。
### 2. API
API 是**建立在 system call 之上的服務**,它封裝了許多 OS 所提供的 function call 來**讓 user program 能夠使用硬體資源**。通常是使用程式語言實作。
雖然**不同的 OS 所提供的 system call 不一定相同**,但**提供的 API 定義大致相同(如果遵守 POSIX 協定的話)**,移植系統使用時只要重新進行編譯即可。

目前有 3 種常見的 API
* Win32 API for windows
* POSIX API for POSIX-based system(Unix, Linux, MAC OS X)
* Java API
:::info
Protable Operating System Interface for Unix, abbreviated **POSIX**
:::
以開啟檔案的函式為例:
* Linux 所提供的 API 為`open()` 函式
* 它遵守 POSIX 協定,實作在 C 語言中的 <fcntl.h> 函式庫中
* 會調用 Linux 系統提供的底層 system call
* Windows 所提供的 API 為 `createFile()` 函式
* 沒有遵守 POSIX 協定,實作在 C 語言中的 <windows.h> 函式庫中
* 會調用 Windows 系統底層的 system call
> [!Note]
> C 語言中另外一種開始檔案的函式為 `fopen()`,它是一種更高階的開啟檔案的方法,符合 ANSI C 的標準(C 語言標準函式庫)
使用 API 的好處有以下幾點:
* 程式的可攜性
* system call 對 user program 來說太過複雜
> [!Important] **Interview Ques.**
> ##### Q: 請簡述何謂 API
> API 是一組提供給應用程式使用的介面,封裝了底層的 system call 與實作細節,讓開發者可以更簡單的使用系統資源。通常是由程式語言的函式庫提供
### 3. System call v.s. API
* System call(系統呼叫)
* Syetem call 其實也是**屬於 OS 的一部份**
* 可以**透過 software interrupt 來明確==要求 kernel 提供服務==**
* 簡單來說就是 OS 提供一些 function call 讓 program 可以使用
* 為了追求效能,通常是使用 C 語言搭配 assembly language 實作
* 涉及到 kernel 的會使用 assembly language
* 是一種對電腦的硬體資源更細緻的操作,一般不會使用到這個層次
* **A**pplication **P**rogram **I**nterface(API,應用程式介面)
* 一種**建立在 system call 之上**,讓使用者能夠**間接使用 OS 的介面**
* API 存在的目的是幫助使用者更**有效率的撰寫程式**
* 與 system call 的差別是: **使用者通常是使用 API 而不是 system call**
* 通常是使用不同語言的 language library 實作
* 在 UNIX 與 Lunux 中都是以 C 實作,此函式庫稱為 libc
* 一個 API 通常會涉及到 **0 或 多個的 system call 組成**
* 例如在 C 語言中使用 `malloc()` 或 `free()` 都會牽涉到 `brk()` 這個 system call
* 數學的 API 函式,像是 `abs()` 就不會牽涉到 system call

User program,interface 與 library 差別如下
* User program
* 使用者的程式,只需要知道如何使用函式與其用意即可,不用瞭解是怎麼計算的
* Interface
* 程式設計的**抽象層**,用來定義某些函式或功能的名稱、參數或回傳值
* Interface 聚焦在如何與函式進行互動(或**如何使用**),而不是函式內部的實作原理
* Library
* 針對 interface 的**具體實作**,實現了 interface 定義的功能
* 一個 interface 可以有多種不同的方式實現
以 C 語言為例:
```c
// User program
printf("%d", exp2(x, y));
// Interface(API)
int exp2(int x, int y); // interface 定義了呼叫的方式
// Library: 以程式語言實作
int exp2(int x, int y){
for (int i = 0, i < y, i++)
x = x*2;
return x;
} // implement 1
int exp2(int x, int y){
x = x << y;
return x;
} //implement 2
```
:::info
**一些名詞定義與介紹**
libc 是 C 語言標準函式庫,它**定義了 C 語言所提供的所有標準函式**,這些函式是**依照 ISO C 標準**所制定,幾乎**所有平台都會實作自己的 libc**。
glibc 是由 GNU 專案所開發的 libc 實作,除了標準的 C 語言函式庫外還**擴充了 PISIX 協定**。
:::
## OS structure
OS 對於使用者或系統來說的需要與目的不一樣。對於使用者來說(user goals)
* OS 應該易於使用與學習
* 也須具備可靠、安全的性質
對於系統角度來說(system goals)
* OS 應該易於設計和實作維護
* 也須具備可靠、效率的性質
### 1. Simple OS architecture
最初始的 OS 系統只有一到兩層的架構,不安全,且也很難提升效率。如下圖所示,不論是 MS-DOS 或是 Unix,最開始的簡單架構設計下就是沒有任何架構,所有東西包在一起,不容易維護。

### 2. Layered OS architecture
第二代的 OS 架構開始有分層的概念,越高的階層可以往低階層做存取與服務

### 3. Microkernel OS
第三代個 OS 架構有以下特色:
* 將大部分的功能從 kernel 中移到 user space,讓 kernel 的程式碼越小越好
* 從 kernel 剝除的這些功能具備了模組化的概念,OS kernel 只具備最核心的功能,負責溝通不同模組的介面
* 易於擴充功能,但模組化的設計也導致效能更慢,因為每次的溝通都需要透過 system call

### 4. Modular OS architecture
現代的 OS 架構設計採用類似 micro kernel 的設計。但不同的是每個 module 都放入 kernel 之中,稱為 kernle module。
* 使用 OO 的方法
* 每個核心功能都是獨立分離的
* 可以載入其他的 kernel module

### 5. Virtual machine
虛擬機(virtual machine)採用 layered 的方法做設計,把既有的 OS 抽象化成 hardware,每個 user 都以為他是獨占 OS 的使用權。
技術的困難點在於 critical instruction
:::info
critical instruction 指的是相同指令在 user psace 和 kernel space 的執行結果不同
:::
如下圖所示,左邊是傳統 OS 的架構,右邊是 virtual machine 的技術。

VM 技術指的是在原本 hardware 之上新增加一個 virtual-machine implementation,並把原本的 hardware、virtual-machine implementation 與 OS 視為新的 hardware,在這之上再安裝其他 OS。
換言之,新的 user mode 與 kernel mode 都放在原來的 user mode 之中,但同時也會衍生出一些問題
:::danger
**問題:**
新的 kernel 的 privilege instruction 因為實際上是放在 user space 之中,所以不能夠執行
:::
:::success
**解決:**
傳一個 interrupt 給原有的 kernel,讓原始的 kernel 再執行一次。
:::
#### 5.1 Usage of VM
* Provides complete protection of system resources
* A means to solve system compatibility problems
* A perfect vehicle for operating systems research and development
* A mean to increase resource utilization in cloud computing
#### 5.2 VM techniques
目前有 3 種比較常用的 VM 技術
Full virtulization:
* 在 user mode 中以應用程式(application)的方式建立在 OS 之上
* 以 host 稱為原始的 OS
* 以 guest 稱為 VM 的 OS
* 每個 VM 都以為自己是裝在 hardware 之上,但實際上是裝在 user mode 之中

Para-virtualization:
* 具有一個 global zone 的角色,又稱為 master,類似管理者的角色,能夠看到其他的 OS

Java Virtual Machine:
Java 在編譯過後會有屬於自己的 instruction,能夠執行在自己的 VM 之上
