# What is an Operating System?
一個特別管理電腦硬體與軟體資源的系統程式。
Permanent Software:電腦啟動後永遠存在,沒有它電腦就不會運作
Abstracts 硬體資源:把底層的各種資源變成一堆 API 給使用者方便使用
- OS 主要功能 / 系統觀點
- 資源分配者 (resource allocator) manages 和 allocates resources 來確保公平性和效率
- 是一套控制程式 (control program) 監控使用者與程式的行為防止不正常的運作造成對系統的危害
- 目標 / 使用者觀點
- 提供一個方便使用的環境
ex:PC - 有效率地使用電腦資源
ex:大系統,多使用者系統
- 提供一個方便使用的環境
- OS 的重要性
- 是 user program 和 hardware 之間 唯一 的 interface,一定需要經過它
- 一旦 crash 掉整台電腦就掛了,要求絕對不能有 bug
# 電腦的基本架構
由 Hardware、OS、Application、User 組成
- User:people、machines
- Application:使用 system resources 來解決問題的方式,像是各種軟體
- Operation System:controls 與 coordinates 資源的使用
- Hardware:提供基本的計算資源(CPU、memory、IO devices)
# General-Purpose Operating Systems

例子:user 呼叫 printf -> printf 呼叫 system call -> system call 呼叫 driver…
# Multi-tasking Operating System
- 管理資源與程序讓多個使用者程式使用
- 提供 API
![]()
# Computer-System Organization
-
一個或多個 CPU、Memory、IO Device 等連接一個共同的 Bus
-
存取共同記憶體。I/O 裝置和 CPU 可以同時執行並競爭記憶體
-
作業系統負責 Control 和 Coordinate
-
發生一個事件時,由硬體或軟體產生中斷來通知。近代的作業系統是中斷驅動 (Interrupt Driven)
![]()
# Device Controller (Hardware)
- 每一個 裝置控制器 (Device Controller) 負責一個特定型態的裝置
- Status reg:記錄現在 device controller 是 busy 還是 idle
- Data reg 和 buffer:用來存資料
- CPU 下指令後,裝置控制器就能夠去 access disk 資料到自己的 local buffer
- 會先寫到 reg 再寫到 buffer
- Memory 是 CPU 在用的,所以 CPU 負責 移入 / 移出 memory 的資料到 Device Controller 上的 local buffer
- 由於 Device Controller 上的 Buffer 空間是有限的,因此會需要用一些技巧來解決,像是 Busy/wait、Interrupt

# Busy/wait output
讀資料時 I/O Device 需要先和 Device Controller 做 I/O,跟 cpu 無關
但是後面因為 memory 是 cpu 在使用的,所以後半段的操作就需要 cpu 去下指令操作
那麼 cpu 那邊要怎麼控制呢?
一個早期大家想到的最簡單的方法就是 Busy Waiting,完全由 cpu 來控制,這邊舉個簡單的例子:
- 目標:把一串字串寫到 I/O Device 上,
- 挑戰:因為 buffer 空間大小,cpu、memory 的速度太快,不可能將資料一次性全塞進去
- 方法:如果 buffer 寫滿了就等到 buffer 寫到 Disk 上,清空後再寫下一批
- 缺點:中間花一段時間在等 buffer 清空,也就是 cpu 有某種程度的 idle,整個效率會很差
1 |
|
while ( *current_char != '\0')
檢查字串是否結束while ( peek( OUT_STATUS ) != 0 );
因為怕 buffer 還沒清空,是 busy 的狀態,所以會需要一個 while loop 去檢查 Status Register 的值:- 如果 status register 的值不是 0,表示 buffer 還是 busy 狀態,cpu 就會一直等在這邊
- 直到 status register 的值變成 0,表示 buffer 空了,cpu 才會繼續往下執行
# Interrupt I/O
Interrupt 的處理流程:
- 作業系統收到後,若該處理為必要時,則作業系統會暫停目前 Process 執行,且保存其 「Status」、「Register」(Context switch)
- 作業系統會依據「Interrupt ID」(Interrupt number)查詢「Interrupt Vector」以確認何種中斷被觸發,且找出其「Interrupt service routine」(ISR)在記憶體的位置
- 在處理器中的指令會跳至該服務程序位置,執行「Interrupt service routine」
- 完成「Interrupt service routine」後,將控制權返回給 Kernel
- 作業系統恢復(Resume)中斷之前 Process 的進行。
小備註:
- ISR (Interrupt Service Routine):中斷服務常式,當中斷發生時,系統會跳轉到這段程式碼來處理中斷事件
- Interrupt Vector:含所有 service routine 的 address (function pointer),儲存各種中斷對應的服務常式位址
- Context Switch:當中斷發生時系統需要保存當前程式的狀態,以便中斷處理完成後能夠恢復執行
- 在處理一個 interrupt 時禁止傳入其他 interrupt,以防 lost interrupt
# Hardware Interrupt (Signal)
- 時機:硬體任何時間都能發出信號給 CPU
- 特點:
- signal 都會有一個 singal number,根據這個 number 去找 vector 上的欄位
- 每個 port 的 hardware 有燒死的 singal number
裝 driver 的時候會 overwrite 那個欄位 fucntion pointer 的位置,去執行你要處理的程式碼
- Interrupt Service Routine
![]()
# Software Interrupt (Trap)
-
時機:
- (主動)user 對 OS service 的 request (system call)
- (被動)軟體發生 error (segmentation fault、除以零…)
-
特點:
- 用 switch case 而不是 array,因為軟體有無限的可能性,可以任意定義各種不同的 system call
- 根據 system call 的 number 去找尋對應的 function call,不過流程差不多
-
Interrupt Service Routine
![]()
# Storage-Device Hierarchy

這是最傳統的架構,現在有很多其他的 storage device 會插在中間
真正的大型的系統最後還是用 tapes,因為非常 reliable,不太容易壞,而且很便宜
- 考量點:speed, cost, volatility
volatile 關掉會遺失(memory 以上全部都是 volatile)
- Storage Structure:
- 主記憶體 (main memory)
- CPU 能夠直接 access 的唯一大型的 storage
- 例如:RAM(Random Access Memory)
- 輔助記憶體 (Secondary storage)
- memory 以下都叫做 secondary storage,代表 CPU 沒辦法直接讀取
- 是大型的 non-volatile storage
- 快取 (Cache):
- 使用中的資料暫時從較慢的存儲複製到較快的存儲
![]()
- coherency (連貫性) & consistency (一致性) 議題
若對上層的資料做了修改沒有更新到下層的資料,這時候兩邊的資料會不一致
必須保證任何一處的資料都一樣,否則就要保證 user 能找到最新的- Single task accessing:都用最上層的資料基本上沒問題
- multi-task accessing:需要處理大量這類的問題
- distributed system:更加複雜,因在不同電腦上且還要考慮到網路
![]()
- 使用中的資料暫時從較慢的存儲複製到較快的存儲
- 主記憶體 (main memory)
# Random-Access Memory (RAM):
- SRAM (Static RAM)
- 需要六個電晶體
- 消耗較多能量
- 讀取快
- 應用在快取
- DRAM (Dynamic RAM)
- 需要一個電晶體
- 消耗較少能量
- 體積小,速度比較慢
- 資料要定期更新
- 應用在主記憶體
# HW Protection
指很多程式在執行或是很多使用者在執行時,不會影響彼此
# Dual-Mode Operation
- OS 把影響重大的指令設為 ** 特權指令 (Privileged Instruction)** 以保護重要的資源,需要 Kernel mode 才能執行
- 需要硬體的額外支援,用一個 Mode Bit 記錄權限
Mode bit 被加到 HW 表示現在是什麼 MODE,如 kernel (0) or user (1) - User Mode (Mode Bit==1):一般模式
- Kernel Mode (Mode Bit==0):在此模式下才有權利執行特權指令
- 特權指令的種類:
- I/O 指令
- 與記憶體管理有關的暫存器之修改指令
- 與 Timer 設定有關的指令
- Enable/Disable 指令
- 系統停止指令
- 從 user mode 改變到 kernel mode 的指令
# I/O Protection
- 與 I/O 有關的 instruction 全都都是 privileged instructions ,因為 I/O 的資源是 share 的
像螢幕輸出都是同一個螢幕,硬碟儲存也是同一顆硬碟 - 其實還是有些漏洞,就算沒法繞過 I/O 但是可以繞 memory
像透過合法的 I/O 流程去修改原本應該要執行的函式讓它執行我們想要的事
# Memory Protection
- 保護以下
- Interrupt vector & the interrupt service routines
- 別的程式的資料存取和覆寫
- 保護的方式
- Hardware Support
使用兩個 register 來記錄能夠讀取的記憶體區間- Base register:儲存實體記憶體的位址,剛好指向虛擬空間的開頭
- Limit register:儲存整個虛擬空間的大小
- 定義範圍外的 memory 是被保護的,超過這段空間會有 Segmentation Fault
- Hardware Support
# CPU Protection
- 阻止某隻程式霸佔 CPU 無法歸還給作業系統,像是無窮迴圈
- 方式:Time sharing(有 Timer 計時)
- Timer 慢慢減少,當變成 0 時會送出 Interrupt
- 打斷原本的 Process 並執行 OS 的 Scheduler,控制權就會回到 OS
- OS 再決定是不是要繼續剛剛的 Process
Load time 到 register 的 instruction 也是 privileged instruction,只有 OS 可以調整 Timer 數的時間





