# Operating System Ch 1 - Introduction [清大周志遠老師的課程錄影](https://www.youtube.com/playlist?list=PLS0SUwlYe8cxj8FCPRoPHAehIiN9Vo6VZ)的筆記。 contributed by <[`kaeteyaruyo`](https://github.com/kaeteyaruyo)> ## 什麼是作業系統? * 電腦系統由以下四個元件組成 * **使用者 (User)**:可能是人、機器,或是其他使用者 * **應用程式 (Application)**:利用計算資源來解決人類問題的那些軟體 * **作業系統 (Operating System)**:負責**控制**與**協調**硬體資源應該怎麼被應用程式使用的軟體 * **硬體 (Hardware)**:也就是計算資源,如:CPU、記憶體、I/O 裝置 ![image](https://hackmd.io/_uploads/SkpADVgyA.png) * 一支程式要在一台電腦上運作,必須經過以下流程 * 電腦要先裝有**硬體 (Hardware)** * 安裝好硬體的**驅動程式 (Driver)**,驅動算是 OS 的一部份 * 驅動上面就是完整的**作業系統 (OS)**,負責統整不同硬體的驅動 * 作業系統會提供**系統函式庫 (OS interface / system call)**,給上面的應用程式呼叫,來使用硬體資源 * 開發者所寫的程式碼在編譯之後,還需要**連結 (link)** 上系統函式庫,才能造出一個能正確執行在電腦上的**應用程式 (Application)** ![image](https://hackmd.io/_uploads/ByxgTEgyA.png) * 作業系統的各種定義 * 資源分配者 (Resource allocator):負責公平且有效率地管理和分配資源的軟體。例如:記憶體管理器就是在分配記憶體、檔案系統就是在分配硬碟中的可存取空間、CPU 排程器就是在分配 CPU cycle 給各個程式 * 控制程式 (Control program):透過驅動程式來叫各個硬體去做事情 * **核心 (Kernel)**:讓整台電腦可以正常運作的最核心的一支軟體程式(**「核心」是作業系統的別稱**) * 從不同面向來看作業系統的工作就會有不同的稱呼,並沒有一個統一的定義 * 開發作業系統的目標 * **方便**:讓使用者可以很容易使用,特別是小型電腦/個人電腦的使用者 * **效率好**:可以用很少資源/很少時間完成運算工作,特別是為了大型、多人分享的電腦系統 * 方便和效率很多時候是**互斥的 (contrdictory)** 兩個要求,例如:為了讓使用者方便操作應用程式,我們發明了圖形化介面,但是圖形介面需要 GPU 運算才能渲染出畫面,反而會吃掉更多資源而拖慢效能。在過去電腦還很昂貴,主要用來進行科學運算時,為了講求效率,文字化介面反而是主流 * 作業系統為什麼很重要 * 因為它是應用程式和電腦硬體之間**唯一的溝通介面** * 絕對不能有 bug,因為只要有 bug 整台電腦就會 crush 掉 * 控制 OS 的廠商可以控制上面的應用程式開發(因為這些應用程式被迫必須遵守 OS 提供的 API) * OS 和電腦硬體架構的演進會互相影響,因為不同的硬體裝置有不同的需求(例如個人電腦和手機的硬體就差很多),OS 當然也需要因應硬體的需求去做調整 * 現代常見的作業系統 * [x86 架構](https://zh.wikipedia.org/wiki/X86)(複雜指令集電腦) * Linux (CentOS, Redhat, openSUSE, Ubuntu, etc) * Windows (Windows10, XP, 2000, etc) * [PowerPC](https://zh.wikipedia.org/zh-tw/PowerPC)(精簡指令集電腦、早期的蘋果在用的) * Mac OS * [ARM 架構](https://zh.wikipedia.org/wiki/ARM%E6%9E%B6%E6%A7%8B)(進階精簡指令集機器,用在大多數的智慧型行動裝置) * Android(小知識:版本號常用甜點名稱) * Windows 10 Mobile * Ubuntu Touch(也支援 x86) * 嵌入式裝置 * Embedded Linux (Android, WebOS) * Windows CE * [Raspberry Pi OS](https://zh.wikipedia.org/wiki/Raspberry_Pi_OS) * Xbox 有專用的 OS ## 電腦系統組織 * [**馮紐曼架構 (Von Neumann architecture)**](https://zh.wikipedia.org/zh-tw/%E5%86%AF%C2%B7%E8%AF%BA%E4%BC%8A%E6%9B%BC%E7%BB%93%E6%9E%84) * 一到多個處理器,以及其他裝置的控制器 (controller),透過**匯流排 (Bus)** 連接,並**共享同一塊記憶體** * 執行程式時,指令會由 CPU 載入並運作,指令所需的資料會放在記憶體當中,工作完成後這些資料可能會被寫入其他的 I/O 裝置 * 一台電腦上可能會同時有很多支程式同時運作 (concurrent),各個程式共享記憶體,卻不能修改到彼此所佔用的記憶體的內容,這就是要由作業系統負責來協調的 ![image](https://hackmd.io/_uploads/rJWVGdxyC.png) ### [**中斷 (Interrupt)**](https://zh.wikipedia.org/zh-tw/%E4%B8%AD%E6%96%B7) * 如下圖所示,當資料要從 I/O 裝置讀進程式裡面時,由於這些裝置的讀寫速度很慢,所以通常會先由裝置的 controller 把資料寫進緩衝器 (buffer) 裏面,再由 CPU 下指令把 buffer 裡的資料載入記憶體 ![image](https://hackmd.io/_uploads/HJGMGOlk0.png) * 因為 buffer 大小有限,然後 I/O 裝置很慢,所以當 CPU 要讀寫 buffer 裡的資料時,他要先確定現在 I/O 那邊到底把 buffer 寫滿/清空了沒,因此會有一個**狀態暫存器 (status register)** 表示現在 buffer 的狀態 * **Busy waiting**: 早期 CPU 得知 buffer 能不能讀寫了沒的方式,就是透過一個 while 迴圈一直去讀狀態暫存器的值,直到讀到 ready 的值才去做讀寫的動作。這種作法某種程度上就是讓 CPU 在浪費時間,因為用 while 去讀狀態的時候 CPU 就沒辦法去做其他有意義的事 * **Interrupt I/O**: 現代的 OS 都是透過 event driven 的方式改變 CPU 的執行流程 (flow),也就是在 CPU 做某件事的時候突然把他打斷,叫他去做另一件事情,做完之後要有辦法讓 CPU 把狀態回復,回去做剛剛在做的事 * 透過中斷, CPU 的使用效率會變得更高,因為他不需要花時間去等待那些要做很久的事情,只需要在 I/O 裝置 ready 的時候分配一小段時間去處理跟搬運資料有關的事就好了 * 根據中斷的產生來源,可以分成以下兩種: * **硬體中斷 (Signal)** * 透過硬體產生訊號叫 OS 去做事情 * 每個硬體發出的訊號會有一個編號,對應到寫死在主記憶體裡面的**中斷向量 (interrupt vector)**,裡面會紀錄負責處理該中斷的函式的 function pointer * **軟體中斷 (Trap)** * 軟體自己觸發中斷(可能是因為有 Error 或是有需要用到硬體的 system call 等原因)把自己這個程式暫停,叫 OS 去做事情 * 軟體中斷發生時,程式執行流程會掉進 OS 某處定義的 **switch-case** 去找要負責處理該中斷的函式(因為軟體有無限的可能性,沒辦法用固定大小的燒死的 array 來紀錄) * 中斷發生時,OS 要負責把 CPU 當前工作的狀態(program counter 的值、return address 等)紀錄下來,以便稍後中斷完成可以回去做原來的工作 * 為了避免多個程式互相一直中斷對方,作業系統會在已經被中斷的情況下**無視**其他所有的(或是優先度較低的)中斷,確保系統處理中斷的速度夠快 ### 儲存裝置架構 (Storage-Device Hierarchy ![image](https://hackmd.io/_uploads/r19CmtZJR.png) * 電腦在儲存資料時採用的是**階層式的 (Hierarchical)** 架構 * 記憶體以上(含記憶體):愈上面的速度愈快、空間愈小、價格愈貴,電腦關機之後就沒了 * 記憶體以下:愈下面的速度愈慢,空間愈大、價格愈便宜,電腦關機後資料還在 * 儲存裝置從上到下大致可分為以下幾層: * **暫存器 (register)**:存在於 CPU 或 controller 當中,速度最快 * **快取 (cache)**:最接近處理器的儲存空間,現代電腦架構通常會有多層快取 * **主記憶體 (main memory)**:連接所有處理器的儲存空間,也是 CPU 可以直接存取的最後一層空間。快取和暫存器中的資料都只是為了加速而存在的複本,所有資料都要以主記憶體的內容為準 * **硬碟 (Disk)**:空間最大,但是讀寫最慢的儲存空間,也被稱為**次要儲存裝置 (secondary storage)** * **隨機存取記憶體 (Random Access Memory, RAM)** * 主記憶體以上的儲存裝置大多是以 RAM 製成的 * RAM 是一種**揮發性記憶體 (Volatile memory)**,斷電後資料就會消失 * 其特色為不論存取記憶體中的哪一個位址,**存取速度都是一致的** * **動態隨機存取記憶體 (Dynamic RAM, DRAM)** * 由**一個**電晶體構成,因此比較便宜 * 比較省電 * 當中的值會週期性地更新 (refreshed) * 存取速度: >= 30 ns,速度較慢 * **靜態隨機存取記憶體 (Static RAM, SRAM)** * 由**六個**電晶體構成,因此比較貴 * 比較耗電 * 存取速度: 10 ns ~ 30 ns * 用來製作快取或是暫存器 * 硬碟的運作機制 ![image](https://hackmd.io/_uploads/S1Lu2Y-kR.png) * **傳統硬碟 (Hard Disk Drive, HDD)** 由很多層的磁碟轉盤組成,主要有以下結構 * **磁頭 (Head)**:每一個磁盤都會有兩個,可以在正反兩面讀取資料 * **磁區 (Sector)**:磁盤上用來儲存一份資料的最小單位,**每一個磁區的儲存容量是一樣大的**,但因為磁碟的內圈和外圈半徑不同,在各磁區的弧度相同的情況下,內層的磁區會比較寬,外層的磁區會比較窄 * **磁軌 (Track)**:在一片磁盤上**同樣半徑的**磁區所形成的同心圓儲存區域。磁頭不需伸縮,只要磁碟轉一圈就能讀取完一整個磁軌。每一圈磁軌中有的磁區數量都是一樣的 * **磁柱 (Cylinder)**:不同磁盤上同樣半徑的磁軌組成的圓柱體 * 一個硬碟的儲存容量是:**磁區容量$\times$每磁軌的磁區數量$\times$每磁碟的磁軌數量$\times$磁頭的數量** * 傳統硬碟讀取資料的速度是以下三者的總和 * **找尋時間 (Seek time)**:把讀寫頭**伸縮到**資料所在**磁軌**上所需的時間,一般來說這是最耗時的部份 * **旋轉時間 (Rotational latency)**:讀寫頭定位到正確磁軌後,把磁盤**旋轉到**正確**磁區**所需的時間,跟硬碟轉速有關 * **傳輸時間 (Transfer time)**:資料大小 / 傳輸速率 * **固態硬碟 (Solid-state drive, SSD)** 以快閃記憶體製成,存取資料的方式比較接近主記憶體,不需要磁頭旋轉的動作,所以速度比傳統硬碟快上 200 倍 * 固態硬碟的優勢在於隨機存取的速度比傳統硬碟快,適合用來存放需要不斷跳轉存取位置的作業系統程式;而傳統硬碟在讀取連續的磁區時速度並不會比固態硬碟慢上多少,且壽命又較固態硬碟高,適合用來存放使用者資料 * **快取機制 (caching)** * (很熟了) ## 硬體保護 (Hardware Protection) * 不是指資安 (Security) 的保護,是在講說一台電腦上同時有很多使用者在共用資源時,為了讓各個程式不會互相影響到對方,所需要進行的保護措施 * Dual-Mode Operation * 雖然我們在邏輯上把 OS 的程式和一般的使用者應用程式當成兩種有不同權限的程式,但是實際上這些程式在 CPU 眼中都只是在執行指令,沒辦法從指令裡面看出現在是在執行 OS 程式還是一般的使用者程式 * 為了不讓使用者執行的程式有能力跳過 OS 去操作電腦硬體,造成天下大亂,我們透過在硬體上面設計一個[**模式位元 (mode bit)**](https://zh.wikipedia.org/zh-tw/%E7%A8%8B%E5%BA%8F%E7%8A%B6%E6%80%81%E5%AD%97) 來讓 CPU 知道現在電腦是 OS 丟下來的指令還是一般使用者丟下來的指令 * **User Mode (1)**: 使用者程式的模式 * **Kernel/Monitor/System Mode (0)**: OS 的模式, * 當 CPU 要去執行**特權指令 (Privileged instructions)** 時,會先去確認模式位元的值,如果現在不是在 kernel mode 的話,就不給執行 * 由於所有 OS 的程式都需要透過中斷的方式執行(無論是硬體中斷還是系統呼叫),因此中斷發生時電腦第一個動作其實就是去翻轉模式位元的值 ---- [<< Ch 0 - Historical Prospective](https://hackmd.io/@kaeteyaruyo/operating-system-0) | [目錄](https://hackmd.io/@kaeteyaruyo/operating-system-index) | [Ch 2 - OS Structure >>](https://hackmd.io/@kaeteyaruyo/operating-system-2)