---
# System prepended metadata

title: Chap. 02 - OS structure
tags: [課堂筆記, 作業系統]

---

# 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 協定的話)**，移植系統使用時只要重新進行編譯即可。

![未命名](https://hackmd.io/_uploads/H1wy6rH7kg.png)

目前有 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

![未命名](https://hackmd.io/_uploads/ry05vrHXyl.png)

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，最開始的簡單架構設計下就是沒有任何架構，所有東西包在一起，不容易維護。

![image](https://hackmd.io/_uploads/rJOQaBHm1x.png)


### 2. Layered OS architecture

第二代的 OS 架構開始有分層的概念，越高的階層可以往低階層做存取與服務

![未命名](https://hackmd.io/_uploads/rysD6HH7Jx.png)

### 3. Microkernel OS

第三代個 OS 架構有以下特色：

* 將大部分的功能從 kernel 中移到 user space，讓 kernel 的程式碼越小越好
* 從 kernel 剝除的這些功能具備了模組化的概念，OS kernel 只具備最核心的功能，負責溝通不同模組的介面
* 易於擴充功能，但模組化的設計也導致效能更慢，因為每次的溝通都需要透過 system call

![image](https://hackmd.io/_uploads/rJFFpSSmyx.png)

### 4. Modular OS architecture

現代的 OS 架構設計採用類似 micro kernel 的設計。但不同的是每個 module 都放入 kernel 之中，稱為 kernle module。

* 使用 OO 的方法
* 每個核心功能都是獨立分離的
* 可以載入其他的 kernel module

![image](https://hackmd.io/_uploads/BkusRHHQye.png)

### 5. Virtual machine

虛擬機(virtual machine)採用 layered 的方法做設計，把既有的 OS 抽象化成 hardware，每個 user 都以為他是獨占 OS 的使用權。

技術的困難點在於 critical instruction

:::info
critical instruction 指的是相同指令在 user psace 和 kernel space 的執行結果不同
:::

如下圖所示，左邊是傳統 OS 的架構，右邊是 virtual machine 的技術。

![image](https://hackmd.io/_uploads/rkH1kUr7Jg.png)


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 之中

![未命名](https://hackmd.io/_uploads/r1snfUHm1l.png)


Para-virtualization：

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

![未命名](https://hackmd.io/_uploads/SJ8CfIBXkg.png)

Java Virtual Machine：

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

![image](https://hackmd.io/_uploads/SyDU7IrXyg.png)



