---
# System prepended metadata

title: 第十二週
tags: [計概]

---

---
title: 第十二週
tags: 計概
---

# 作業系統

主要功能：

- 監督/控制程式 (control program / monitor)
    - 控制程式的執行，以維持整個電腦正常運作
- 資源管理/分配者(resource manager / allocator)
    - 分配電腦的資源：CPU、記憶體、IO
    - 決定資源的有效利用和公平使用
- 使用者介面
    - 方便使用者使用電腦
    - 不一定所有 OS 都有，像是工控電腦

:::info
- 開機時 bootloader 會從磁區把系統讀進 RAM，然後把控制權交給系統
- 不會一次讀全部，會先讀一部分，然後那一部分知道從哪裡找到其他部分
- 所以以前寫病毒就是會寫在系統的儲存位置前面，因此 bootloader 會先讀進病毒，才讀進系統，這樣系統就在病毒掌控底下
:::

# 種類

## 單人單工作業系統 Single-User Single-Tasking System

- 同意時間只能讓一個人使用，且只能處裡單一程式
    - 如 MS-DOS
- 屬於早期的系統，現在已很少見

## 多工系統 Multi-Tasking System

- 同時可以處裡多個程式，或一個程式可以分多個部分執行
    - 例如 Windows、Linux、Mac OS、Unix 等等
    - 可分為單人多工與多人多工兩種方式
- 現在常見的系統

## 多程式系統 Multi-Programming System

- 系統中有多個程式彼此輪流進行
- 主記憶體在同一時刻有多個程式載入，並透過排程機制輪流使用 CPU 來執行程式
- 特色是「充分利用系統資源」，因為一個程式在執行時不可能會一直都在使用 CPU 像是執行輸出輸入工作時就會有閒置的時間，將這個閒置的時間給其他程式使用可以達到更大的效率

## 多重處理系統 Multi-Processing System

- 電腦存在兩個以上的 CPU ，且同時可讓不同工作在不同 CPU 執行
- 一架構分為兩種

### 緊耦合系統 Tightly Coupled

- 所有 CPU 共用記憶體、作業系統、時脈及系統匯流排頻寬

### 鬆耦合系統 Loosely Coupled

- 所有 CPU 有各自的記憶體、作業系統、時脈及系統匯流排頻寬
- CPU 之間的通訊是透過通訊線路達成，又稱為分散式系統
    - 將家裡電腦連上網路後，和其他電腦也透過網路分享彼此的資源，就是鬆耦合系統

## 分散式系統 Distributed System

- 上述

## 多執行緒系統 Multi-Thread System

- 每個程序(Process)可能會被分割成數個執行緒(Thread)，執行緒又稱為輕型程序(Light Weight Process)
- 在同意一間同一程序的不同執行緒可以同時執行，也因此執行緒是最小調度單位

## 分時系統 Time Sharing System

- 系統對每個程序(Process)都會分配一段時間配額(Time Quantum)給該程序用
- 時間配額用完，無論程序是否執行完畢，都必須將 CPU 的使用權交給下一個程序

## 即時系統 Real Time System

- 系統對某些特定事件必須在一定時間限制內做出反應
- 主要限制為程式段必須常駐在主記憶體內
    - 例如飛彈導航系統或核電廠的安全控制系統

## 整批處理系統 Batch Processing System

- 是指將資料收集成批後一次處裡
- 又可分為定時和定量兩種方法

## 交談式系統 Interactive System

- 使用者與系統會透過交談的方式來完成工作
- 特別重視反應時間(Response Time)
    - 例如自動提款機的金融交易系統

# 中斷 Interrupt

程式執行的過程發生特殊的情況，系統會停止目前的處裡動作來處理特殊情形

如果沒有「中斷」這項功能的話，系統會在執行輸入輸出的時候，CPU會不斷詢問是否完成輸出輸入
>當然如果是個非常精簡，周邊IO很少的電腦，就可以採用 Polling 的方式

因此改成輸出入裝置完成工作時，藉由中斷，自動將訊息傳給 CPU

## 處理步驟

1. 作業系統取得 CPU 控制權
2. 儲存目前的狀態，像是 Register Counter 等資訊
3. 取得中斷處理程式的地址
4. 執行中斷處理程式
5. 回復中斷發生前的執行狀態，並繼續執行該動作

## buffer cache spooling 

這三個很像

- Buffer：是東西要送到別的地方去，待會有人會搬走，但是先放在特定地方等待
- Cache：是自己把東西刻意擺在特定的地方，以自己供快速使用，就不用每次都跟硬碟要
    - Caching 就是在儲存系統中，提升速度的一個重要的技巧
    - 在跟更慢的儲存設備要資料時，就先看 cache 有沒有資料，有的話就可以直接用
    - 網路也有所謂的Cache ，就是直接把最近很有可能有大量需求的資料，給搬進local的儲存設備

像鍵盤滑鼠的操作不會直接影響記憶體，而是先放進 buffer，發出 interrupt，CPU 從 buffer 拿指令
>CPU 當掉就會讓沒拿走的內容被新內容覆蓋掉，像滑鼠就會有瞬移的現象

不同的 interrupt 有不同的代號，有個 Vector table 可以查要讓程序跳到哪裡

那如果interrupt 又被interrupt ，就要有額外的限制等等，這就更細了



# 程序 Process

指證在執行過程中的程式 (Program)

# 分頁記憶體管理法

這是講義提到的，基本應該就是分頁記憶體管理法

允許程式載入主記憶體時，不占用連續的空間，因此

- 將實際記憶體分成固定大小的頁框(Frame)
- 將程序也分成多個跟頁框相同大小的頁(Page)

這樣一來，任何頁都可以塞進任何頁框

不過因此每個程式就需要一個分頁表(Page Table)用來記錄頁跟頁框的對應關係

可以用一維陣列實作

- 以頁的編號作為 index
- 頁框的編號就是 value

# 虛擬記憶體管理

允許程式執行實可不必將整個程式碼完整載入主記憶體中

利用「需求分頁系統(Demand Paging System)」的觀念

- 程式執行前儲存在輔助記憶體中
- 各分頁指在執行時需要的時候才將該分頁載入到主記憶體中

## 分頁錯誤 Page Fault

發生於程式要執行的程式分頁不在主記憶體中，處裡步驟如下

1. 要存取的程式分頁不在主記憶體中，發出 Page Fault 中斷
2. 將 CPU 的控制權交給中斷處理程式
3. 作業系統檢查此存取是否合法
    - 合法的話找尋該分頁在輔助記憶體的位置
    - 不合法則停止該程式之執行動作
5. 在主記憶體找尋一個可用的頁框
6. 將分頁由輔助記憶體載入到頁框中
7. 修改分頁表內容
8. 重新執行產生分頁錯誤的程序

## 分頁取代

當分頁錯誤發生時，主記憶體有可用的頁框，就可以直接將分頁載入到頁框中

但是若沒有可用的頁框，則需要執行分頁取代的動作，常見的有三種

### 先進先出 First In First OUT

就是將最早進入系統的分頁作為犧牲分頁(Victim Page)，也就是將主記憶體中最久的分頁會被取代掉

但是有可能該分頁是最常使用的分頁，因此使用此策略會使分頁錯誤的機率提高

### 最佳取代法

### 最近最久未用取代法 Least Recently Used / LRU

將最近最久(?未使用的分頁取代調，實作方法就是檢視分頁上次的使用時間

將上次被存取時間距離現在最久的分頁給取代掉

概念為「用過去程式執行的模式去模擬將來程式執行的模式」

:::warning
講義 Buffer Management 的部分應該就是上面的內容
:::


---

OS 恐龍版第一節 
這本是經典，想要go deeper可以去看

Distributed 分散式架構，像是AWS





寫driver 就要處理很多這些有關的事情
像是跟系統註冊查表的代號等等

進聯發科大都在寫driver 很少在寫演算法


---

# 網路





Pre fetch 就是去猜可能會用到的資料

LRU 可以看MysEQL


後面都不會考，

老師說虛擬化概念很重要，用在很多東西上


Local Area Network LAN
跨LAN之間是透過router 或 gateway

標準
Global：TCPIP
    用 IP address 
內網：IEEE
內網包括 WiFi ethernet
    用MAC Adress

IP address 就是像是140.112.1.0這類的
但是很難記，所以會用domain name
像是 www.ntu
也因此需要一個負責轉換的 Domanin Name Server 

Domain name 跟 IP 是多對多的關係
可以一個domain name 對多個 IP
或是同個 IP 對同個 domain name

Hub是比較笨的 switch是比較聰明的
現在大多是switch

packing sniffing 可以竊聽你的機密

送資料的時候，會把檔案分成很多的小packet，首先這樣子就不用因為其中某部分壞損導致整個都要重送

IP確定送達位置是對的

TCP確認送的內容是對的

TCP加上header後，就會把application 給切成多個封包送出去

Name Mask





