---
# System prepended metadata

title: 作業系統筆記作業CH2

---

# 作業系統服務
 作業系統為程式和使用者提供程式和服務的執行環境，一組作業系統服務提供對使用者有幫助的功能有以下七種:
1. 使用者介面 - 幾乎所有作業系統都有使用者介面 (UI)。
2. I/O - 正在運行的程式可能需要 I/O，這可能涉及檔案或 I/O 設備
3. 程式執行 - 系統必須能夠將程式載入到記憶體中並運行該程序，結束執行，無論是正常還是異常（指示錯誤）
4. 文件系統操作－檔案系統特別令人感興趣。 程式需要讀寫檔案和目錄、建立和刪除它們、搜尋它們、列出檔案資訊、權限管理。
5. 通訊－進程可以在同一台電腦上或透過網路在電腦之間交換訊息（由作業系統移動資料包）
6. 錯誤檢測－作業系統需要不斷意識到可能的錯誤
7. 資源分配 - 當多個使用者或多個作業時並發運行，必須為每個執行緒分配資源
# 作業系統服務視圖
![OS.gif](https://hackmd.io/_uploads/SyisfzWXT.gif)
# 命令列解釋器
1. CLI 允許直接輸入指令，有可能在內核或系統程式裡執行。
2. 主要是從用戶那裡獲取命令並執行它，通常為內建指令或程式名稱
# 使用者作業系統介面 - GUI
 **通常有滑鼠、鍵盤和顯示器**
* 介面中物件上的各種滑鼠按鈕會導致各種操作（提供資訊、選項、執行功能、開啟資料夾）
* 發明於Xerox PARC(施樂帕洛阿爾托研究中心)
* 現在許多系統都包含 CLI 和 GUI 介面 EX:
    1. Microsoft Windows 是帶有 CLI「命令」外殼的 GUI
    2. Apple Mac OS X 是「Aqua」GUI 介面，底層有 UNIX 核心和可用的外殼
    3. Unix 和 Linux 具有可選 GUI 介面的 CLI
# 觸控螢幕介面
**不見得有滑鼠和鍵盤**
* 相較於前者多了虛擬鍵盤和語音輸入
# 系統調用
定義:指運行在使用者空間的程序向操作系统内核請求需要更高權限運行的服務。
* 通常用高階語言（C 或 C++）編寫
* 大多數程式透過高級應用程式介面（API）而不是直接使用系統呼叫來存取
# 系統呼叫的類型
* 過程控制
    1. 創建進程、終止進程
    2. 結束，中止
    3. 載入、執行
    4. 取得進程屬性、設定進程屬性
    5. 等待時間
    6. 等待事件、訊號事件
    7. 分配和釋放記憶體
    8. 如果錯誤則轉儲記憶體
    9. 用於確定錯誤、單步執行的調試器
    10. 用於管理進程間共享資料存取的鎖
* 文件管理
    1. 建立文件、刪除文件 
    2. 開啟、關閉文件
    3. 讀、寫、重新定位
    4. 取得和設定檔案屬性
* 設備管理
    1. 請求設備
    2. 讀、寫、重新定位
    3. 取得設備屬性、設定設備屬性
    4. 邏輯地附加或分離設備 
* 資訊維護
    1. 取得時間或日期、設定時間或日期
    2. 取得系統數據、設定係統數據
    3. 取得和設定進程、檔案或裝置屬性
* 通訊
    1. 建立、刪除通訊連接
    2. 如果訊息傳遞模型為主機名或進程名，則傳送、接收訊息
    3. 共享記憶體模型創建並存取記憶體區域
    4. 傳輸狀態訊息
    5. 連接和分離遠端設備
* 保護
    1. 控制對資源的訪問
    2. 取得和設定權限
    3. 允許和拒絕用戶訪問
# 系統服務
***大多數使用者對作業系統的看法是由系統程式定義的，而不是實際的系統調用***
系統程式為程式的開發和執行提供了便利的環境。 它們可以分為：
* 文件操作
* 程式語言支援
* 程式載入和執行
* 通訊
* 後台服務
* 應用程式
* 狀態資訊有時會儲存在檔案中
# 檔案系統執行(Implementation)
演變幅度很大
早期Algol、PL/1➙現在是C、C++ 
* 實際上通常是多種語言的混合
* 更高階的語言更容易移植到其他硬體，但速度較慢
* 虛擬機可以允許作業系統在非本機硬體上運行
# 作業系統結構
通用作業系統會是非常大的程式，因此有各種創造方法EX:
1. 簡單結構—MS-DOS
2. 複雜結構——UNIX
3. 微內核-Mach
# 整體結構—原始 UNIX
* UNIX 受硬體功能的限制，最初的 UNIX 作業系統的結構有限。 UNIX 作業系統由兩個獨立的部分組成:
    1. 系統程式
    2. 核心

# 傳統UNIX圖表
![OS2.png](https://hackmd.io/_uploads/HySEPQZXa.png)
# 分層法(Layered Approach)
* 作業系統分為多個層級，每層都建構在較低層之上。 最底層（第0層）是硬體，最高層（N 層）是使用者介面。
* 透過模組化，使得每層僅使用較低層的功能（操作）和服務
# 模組
許多現代作業系統都實作了可載入核心模組（LKM）
* 使用物件導向的方法
* 每個核心組件都是獨立的
* 每個人都透過已知的介面與其他人交談
* 每個都可以根據需要在內核中加載
***總體來說，和分層類似，但但更靈活***
# 混和系統
**大多數現代作業系統其實都不是純粹的模型
大部分都混合了多種方法來滿足效能、安全性和可用性需求**
EX:
1. Linux 和 Solaris 核心位於核心位址空間中，因此是整體的，並且是模組化的，用於動態載入功能
2. Windows 大多是整體式的，加上針對不同子系統特性的微內核
# 安卓
**主要**由google開發
有和ios類似的堆疊
Java 應用程式被編譯成可以在 Android RunTime ART（專為 Android 設計的虛擬機器）上執行的形式。
# 作業系統偵錯(debug)
debug是發現並修復錯誤或錯誤，**效能調優也是一個debug的問題。**
* 作業系統產生包含錯誤訊息的日誌文件
* 除了崩潰之外，效能調整還可以優化系統效能
    * 有時會使用記錄的活動追蹤清單以進行分析
    * 分析是對指令指標進行定期採樣以查找統計趨勢

***克尼根定律：「debug的難度是最初編寫程式碼的兩倍。 因此，如果你盡可能巧妙地編寫程式碼，那麼根據定義，你就不夠聰明，無法debug它。」***
# 追蹤(tracing)
收集特定事件的數據，例如係統呼叫呼叫中涉及的步驟，工具包括:
1. strace – 追蹤進程呼叫的系統調用
2. gdb——原始碼級偵錯器
3. perf – Linux 效能工具集合
4. tcpdump – 收集網路封包
# 本章重點
1. **系統調用（system calls）是供程式調用的，而系統程式（system programs）是供用戶使用的。**
2. **"守護程序"（daemons）是一個不斷執行其工作以實現特定目的的程式。**
3. **單體結構的缺點是整個程式的修改需要時間且不靈活。**
4. **在下層已經假設為正確。**