---
# System prepended metadata

title: 作業系統服務(OS services)

---

* 用戶界面(User interface)

* 程序執行(Program Execution)
* I/O 操作(I/O operations)
* 文件系統操作(File-system manipulation)
* 溝通(Communication)
* 錯誤檢測(Error detection)
> 資源分配(Resource allocation)
會計(Accounting)
保護和安全(Protection and security)

* 保證系統本身的高效運行

![](https://hackmd.io/_uploads/SJ-6vztOh.png)

## 用戶界面(User interface)
是指人與電腦系統之間的溝通界面，用於協助使用者與系統進行互動、操作和控制。
* CLI（命令行界面）
 
    * 從用戶獲取命令並執行它
    * Shell：在命令行界面下運行的軟體程序（CSHELL、BASH）
        * 根據用戶行為和偏好進行調整
* GUI（圖形用戶界面）
    * 通常是鼠標、鍵盤和顯示器
    * 圖標代表文件、程序、操作等
    * 界面中對像上的各種鼠標按鈕會導致各種操作
    * 大多數係統都有 CLI 和 GUI

## 溝通模式(Communication Models)
 Communication 可以使用消息傳遞或共享Memory來進行。
![](https://hackmd.io/_uploads/BJICL_uun.png)

1. 因為Memory protection的關係，即便是傳遞資料的Memory距離很近，也必須先將process A的資料傳遞到OS，再傳到process B
2. 共享Memory的過程可以使用指標或變數來訪問共享記憶體中的數據，進行資料交換和通信。
## System call和API
* System call
    * 是作業系統提供給應用程式與硬體資源之間進行溝通的介面。
    * 正在運行的程序的作業系統接口
    * 通過軟件中斷向內核發出顯式請求
    * 通常可用作彙編語言指令
    * 請求作業系統服務
        * 進程控制-中止、創建、終止進程分配/釋放內存
        
        * 文件管理-創建、刪除、打開、關閉文件
        * 設備管理-讀取、寫入、重新定位設備
        * 信息維護-獲取時間或日期
        * 通訊-發送接收消息

* API：應用程序介面
> 是一組定義了軟體組件之間如何互相溝通的規範和工具。
> 提供了一種標準化的方式，使得不同的軟體系統、服務或庫可以彼此交互操作，進行資訊和功能的交換。
> 用戶主要針對API而不是System call進行編程
➤ 通常由語言庫實現，例如 C 庫
➤ 一個 API 調用可能涉及零個或多個System call
malloc() 和 free() 都使用System call brk()
• 數學API 函數，例如abs()，不需要涉及System call

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

## API：應用程序接口
三個最常見的API：
* 用於 Windows 的 Win32 API
    * http://en.wikipedia.org/wiki/Windows_API
    * http://msdn.microsoft.com/en-us/library/windows/desktop/ff818516%28v=vs.85%29.aspx

* 用於基於 POSIX 的系統的 POSIX API（包括幾乎所有版本的 UNIX、Linux 和 Mac OS X）
    * POSIX (Portable Operating System Interface for Unix) “Unix 的便攜式操作系統接口”
• http://en.wikipedia.org/wiki/POSIX
• http://www.unix.org/version4/GS5_APIs.pdf
* Java API for the Java virtual machine (JVM) 的 Java API

為什麼使用API？
■ 簡單
➤ API是為應用程序設計的
■ 便攜性
➤ API是統一定義的接口
■ 效率
並非所有功能都需要操作系統服務或涉及內核

## System call：傳遞參數
■ 三種通用方法用於在運行的程序和作業系統之間傳遞參數。
> 在register中傳遞參數
> 將參數以表單形式存儲在Memory中，表單地址作為參數傳遞到register中
> 由程序將參數壓入（存儲）stack，由作業系統彈出stack

## 通過表傳遞參數(Parameter Passing via Table)
![](https://hackmd.io/_uploads/HkoE-Btd2.png)
