CH2 OS 架構
作業系統服務 (OS Services)
- 使用者介面(User interface (UI):
- Graphics User Interface (GUI)
- Batch Interface
- Command-Line (CLI)
- 程式執行(Program Execution)
- 輸入和輸出作業(I/O Operations)
- 檔案系統的操作(File-system manipulation)
- 通信(Communications)
- 透過網路 (network)
- 錯誤偵測(Error Detection)
- 資源分配(Resource Allocation)
- 當有很多人在搶硬體資源的時候,OS 要給予妥善的分配
- 記帳(Accounting)
- 記錄哪些 user 用了哪些 resource
- 保護和安全(Protection and security)
- protection
- 確保系統內部資料的安全性,ex,非 root 不可讀取/etc/passwd
- security
- 保護系統不受到惡意攻擊的損害,ex,即使 root 讀取了/etc/passwd,這裡面的 passwd 也已經 hash 過,無法直接得到正確的密碼
- protection
使用者作業系統介面 (User OS Interface)
- Command-Line (CLI)
- 命令列,有時候在 kernel 中實作,有時候是以 system program 實作(例如使用者第一次登入)
- Bourne Shell
- Linux 使用的這一種版本就稱為Bourne Again SHell (簡稱 bash),這個 Shell 是 Bourne Shell 的增強版本
- C shell
- BSD 版的 Unix 系統中的 shell ,這個 shell 的語法有點類似 C 語言,所以才得名為 C shell ,簡稱為 csh
- Graphics User Interface (GUI)
- 圖形化介面,不在 kernel 裡
系統呼叫 (System call)
- 系統呼叫提供一個由作業系統服務的介面
- 這類呼叫一般以 C 或 C++寫成的常式
- 通常是用 high-level 的 API 而不是直接用 system call
- 把程序簡單化,並且保持可移植性(Program Portability),這樣在不同 system 才能 run
- 因為 system call 是用組語寫的
- win32 API: windows
- POSIX API: Linux, UNIX, Mac OS X
- Java API: Java virtual machine(JVM)
- 把程序簡單化,並且保持可移植性(Program Portability),這樣在不同 system 才能 run
system call 的實作
- system call 會對應到一個數字,處理 system call 的介面會維護一個管理這些數字的表格
- system call 會叫 os 跳到 kernel mode,做完以後再跳回來
- caller 不需要了解 system call 是怎麼實作的,他只要遵循 API 的呼叫過程和知道叫這個 system call 會得到什麼結果就好
- OS 把細節藏起來不給 progammer 知
System call 的參數傳遞
- 當然,呼叫 system call 的時候要給他多一點資料,OS 才可以做事
- OS 通常用這三種方式來傳遞參數:
- 利用 register
- 最簡單,不過有的時候參數會比 registers 多
- 利用 block or table
- 把資料放在 memory 裡面,然後把 memory 的 address 放在 register 裡傳過去
- 利用 stack
- 參數 placed 或 push 到 stack,program 再 pop 出來
- 利用 register
system call 的種類
行程的控制(process control)
- 正常結束、不正常中止執行(end, abort)
- 載入、執行(load, execute)另一程式
- 建立行程、終止行程(create process, terminate process)
- 獲取行程屬性、設定行程屬性(get process attributes,set process attributes) – 優先次序、最大容許執行時間
- 等待時間(wait for time)
- 等待事件、顯示事件(wait event, signal event)
- 配置及釋放記憶體空間(allocate and free memory)
- Dump memory if error
- Debugger for determining bugs, single step execution
- Locks for managing access to shared data between processes
File management
- 檔案的管理(File management) 建立檔案、刪除檔案(create file, delete file)
- 開啟、關閉(open, close)
- 讀出、寫入、重定位置(read, write, reposition)
- 獲取檔案屬性、設定檔案屬性(get file attributes, set file attributes) – 檔案名稱、檔案類型等等
裝置的管理(Device management)
- 要求裝置、釋回裝置(request device, release device)
- 讀出、寫入、重定位置(read, write, reposition)
- 獲取裝置屬性、設定裝置屬性(get device attributes, set device attributes)
- 邏輯上加入或移去裝置(logically attach or detach devices)
資訊維護(Information maintenance)
- 取得時間或日期、設定時間或日期(get time or date, set time or date)
- 取得系統資料、設定系統資料(get system data, set system data)
- 取得行程、檔案或裝置的屬性(get process, file, or device attributes)
- 設定行程、檔案或裝置的屬性(set process,file,or device attributes)
通信(communication)
- 建立、刪除通信連接(create, delete communication connection)
- 傳送、接收訊息(send, receive messages)
- Shared-memory model create and gain access to memory regions
- 傳輸狀況訊息(transfer status information)
- 連接或分離遠程裝置(attach or detach remote devices)
保護(protection)
- 設定權限、取得權限(set permission, get permission)
windows and unix system call
Standard C Library Example
MS-DOS
(a) At system startup (b) running a program
- Single-tasking
- Shell invoked when system booted
- Simple method to run program
- No process created
- Single memory space
- Loads program into memory, overwriting all but the kernel
- Program exit -> shell reloaded
FreeBSD
- Unix variant
- Multitasking
- User login -> invoke user’s choice of shell
- Shell executes fork() system call to create process
- Executes exec() to load program into process
- Shell waits for process to terminate or continues with user commands
- Process exits with code of 0 – no error or > 0 – error code
System program 會做什麼?
OS 提供 user 方便的作業環境,有些讓 system call 更簡單,不過有些讓他們更複雜了…
- 提供檔案系統的管理(File management)
- 創建、刪除、複製、更名、列印、刪除、列表,管理檔案與資料夾
- 維護狀態資訊(Status information)
- 有些程式會向作業系統詢問日期、時間、可用的記憶體或磁碟空 間、使用者數量或其它類似的狀態資訊。其它則較複雜,提供詳細的效能、登錄和除錯訊息。這類程式經格式化之後送到終端機或其它輸出裝置或檔案或者以視窗的圖形使用者介面顯示。有些系統也支援用來儲存和取回配置訊息的登錄( registry)
- 檔案的修改(File modification)
- 更改文字檔之類的
- 提供程式語言(Programming-language support)
- compiler, assembler, debugger, interpreter…etc
- 程式的載入與執行(Program loading and execution)
- 提供各種通訊(Communications)
- 這些程式提供產生虛擬連接於行程、使用者及不同電腦系統之間的功 能。它們允許使用者傳送訊息到其它的螢幕上,瀏覽網頁,傳送電于郵件,遠 端登錄或者從某一機器傳送檔案至另一機器。
- Background Services
- Run in user context not kernel context
- Known as services, subsystems, daemons
- Application programs
- Not typically considered part of OS
OS 的設計與實作
設計目標
- OS 的個別差異很大呢
- 設計一個作業系統的第一個問題是定義系統目標及規格
- 選擇的硬體也會影響 OS 的設計
- 可已大致分為兩種: user goals 與 system goal
- user goal:
- OS 要很親切(容易使用的意味),易上手,可靠,安全並快速(雖然窗戶曾經有過說當就當的年代(?))
- system coal:
- OS 要容易設計、容易實作、維護,有彈性,可靠,容易 debug,且有效率
- user goal:
方法與策略(Mechanisms & Policies)
一個重要的原則是從方法 (mechanism)中作策略(Policy)分離。方法決定如何做某些工作,相對的,策略決定做什麼事。
- Policy:
- 下一個要做什麼? ex, cpu schedule
- mechanism:
- 要怎麼做? ex, exec, suspend, resume…
製作(Implementation)
傳統上,作業系統是由組合語言寫成的。然而,現在已經不完全這樣做,作業系統現在可以用較高階的語言寫成,例如 C 或 C++。
OS 架構的例子:
- Simple structure
- 有誰在用? MS-DOS
- 構造? 沒有切成 modules,全部混一混包起來,硬體本身沒有分 mode
- 優點? 簡單
- 缺點? 沒有結構
- UNIX-monolithic
- UNIX OS
- 構造? kernel 裡面包含了所有在 System call 底下的東西
- 雖來聽起來和 simple structure 差不多,不過比較強大,這個提供了 file system, CPU scheduling, memory management 還有其他拉哩啦紮的 OS function
- 一層裡面包含了數量龐大的 functions!
- 優點? 跑起來有效率
- 缺點? 沒有結構性
分層方法(Layered Approach)
- 分層方式最主要的好處是結構簡單和除錯
- 層次選定之後,每一個層次只能使用較低層的功能與服務。
- 這種方式更容易做系統的除錯與驗證。
- 第一層改正時,不必考慮系統的其餘部份,它只用了基礎的硬體完成它的功能。
- 一旦第一層改正後,在第二層的工作可以假設它的功能正確。
- 在特定層次除錯時,可以知道錯誤必定在那一層,因為在它底下的層都已改正。
- 目前…沒有人在用
- 構造? 把 OS 切割成 N 層,最底層(layer 0)是硬體,最頂層(layer N)是使用者介面,高度模組化,只能存取底層提供的 function
- 優點? 容易 debug(只需要 de 這一層的 bug 就好了)和擴大規模(很有結構性)
- 缺點? 很難分層,Ex, storage system device 的 driver 需要 allocate memory,可是 memory management 可能需要將 storage 拿來當 virtual memory 來用
- 而且 performance 不好
Microkernel system structure
- 這種方法藉由移去核心所有非必要的元件將作業系統結構化,並且改以系統和使用者層次的程式來製作。
- Mac OS X
- Kernel 很小很小,只留必要的東西
- 用 message passing 的方式來溝通
- 可以想像成 kernel 的 kernel
- 優點? 容易擴張(在外圍加功能),更可靠(kernel mode 越小越穩定),更安全(kernel 小不好攻擊)
- 缺點? performance 不好
Modules
- Solaris
- 把所有的功能包成一個一個 module 來用
- 在 Linux kernel module 裡溝通
- 比 Layered kernel 更有彈性(modules 互相 call)
- 比 microkernel 更有效率(不用一直 mode switch)
- 比 monolithic kernel 更有結構性
Virtual Machine
- 完全模擬各種硬體環境
- 即使很多 user 在一台大的機器上用,每個 user 感覺好像都擁有一顆自己的 CPU 一樣
- 每個人的 VM 各自獨立,不會在硬體上互相侵犯
- 好處? 易於設計新的 OS,如果 crash 掉了可以有 snapshot 輕易復原
- 缺點? 畢竟是模擬的,跑得比較慢,而且很難實作
This post is licensed under CC BY 4.0 by the author.