現代操作系統
1. 概述
- 計算機有兩種運行模式:內核態和用戶態.操作系統,它運行在內核態中。操作系統具有硬件的訪問權,可以執行機器能夠運行的任何指令。軟件的其余部分運行在用戶態下。
- 計算機包含運算器、控制器、存儲器、輸入設備、輸出設備五個部分,是馮羅伊曼結構。各個部分通過總線相連。(CPU=運算器+控制器)
- 運算器最主要的功能是對數據和信息進行加工和運算。
- 控制器主要起到了控制命令執行的作用,完成協調和指揮整個計算機系統的操作。控制器是由程序計數器、指令寄存器、解碼譯碼器等構成。
- 總線(Buses),在整個系統中運行的是稱為總線的電氣管道的集合,這些總線在組件之間來回傳輸字節信息。通常總線被設計成傳送定長的字節塊(64或32位)。
2.進程與線程
- 進程(process)是程序的一次執行,是具有獨立功能的程序在一個數據集合上的運行過程,系統資源調配的獨立單位。
- 嚴格意義來說,在某一個瞬間,一個CPU 只能運行一個進程。
- 進程是某一類特定活動的總和,它有程序、輸入輸出以及狀態。
- 進程的創建
- 系統初始化(init):啟動操作系統時,通常會創建若干個進程。
- 正在運行的程序執行了創建進程的系統調用(比如 fork)。
- 用戶請求創建一個新進程。
- 一個批處理作業的初始化。
- 進程的終止
- 正常退出(自願的) : 多數進程是由於完成了工作而終止。這個調用在 UNIX 中是 exit ,在 Windows 中是 ExitProcess。
- 錯誤退出(自願的):比如執行一條不存在的命令,於是編譯器就會提醒並退出。
- 嚴重錯誤(非自願的)
- 被其他進程殺死(非自願的) : 某個進程執行系統調用告訴操作系統殺死某個進程。在 UNIX 中,這個系統調用是 kill。
- 進程狀態
- 運行態,運行態指的就是進程實際占用 CPU 時間片運行時
- 就緒態,就緒態指的是可運行,但因為其他進程正在運行而處於就緒狀態
- 阻塞態,除非某種外部事件發生,否則進程不能運行
- 進程的實現,
- 操作系統為了執行進程間的切換,會維護着一張表,這張表就是進程表(process table)。
- 該表包含了進程狀態的以下重要信息。第一列內容與進程管理有關,第二列內容與存儲管理有關,第三列內容與文件管理有關。
- 一個進程在執行過程中可能被中斷數千次,但關鍵每次中斷后,被中斷的進程都返回到與中斷發生前完全相同的狀態。
- 線程,cpu是調度和分派的基本單位,是程序執行流的最小單位。
- 多線程之間會共享同一塊地址空間和所有可用數據的能力,這是進程所不具備的。
- 線程要比進程更輕量級,由於線程更輕,所以它比進程更容易創建,也更容易撤銷。
- 線程必須在某個進程中執行。進程用於把資源集中到一起,而線程是cpu上被調度執行的實體。
- 線程之間的狀態轉換和進程之間的狀態轉換是一樣的。
- 線程實現分為三種類型
- 在用戶空間中實現線程,內核對線程一無所知,它不知道線程的存在。
- 在內核空間中實現線程,通過系統調用實現。
- 在用戶和內核空間中混合實現線程,采用了一種內核級線程的方式實現。
- 進程間通信(Inter Process Communication, IPC)
- 當兩個或兩個以上的進程/線程處於就緒狀態時需要采用一定的調度算法。因為不同的應用程序和不同的操作系統有不同的目標。也就是說,在不同的系統中,調度程序的優化也是不同的
- 批處理(Batch) : 商業領域
- 先來先服務、最短作業優先
- 交互式(Interactive): 交互式用戶環境
- 輪詢調度、優先級調度、多級隊列、最短進程優先、保證調度、彩票調度、公平分享調度
- 實時(Real time)分為硬實時(hard real time)與軟實時(soft real time)
- 批處理(Batch) : 商業領域
3.存儲管理
- 要使多個應用程序同時運行在內存中,必須要解決兩個問題:保護和重定位
- 可以使用動態重定位技術或者基址寄存器和變址寄存器解決
- 基址寄存器:存儲數據內存的起始位置。變址寄存器:存儲應用程序的長度。
- 每當進程引用內存以獲取指令或讀取、寫入數據時,CPU 都會自動將基址值添加到進程生成的地址中,然后再將其發送到內存總線上。同時,它檢查程序提供的地址是否大於或等於變址寄存器 中的值。如果程序提供的地址要超過變址寄存器的范圍,那么會產生錯誤並中止訪問
- 可以使用動態重定位技術或者基址寄存器和變址寄存器解決
- 交換技術,用於解決內存不足。即把一個進程完整的調入內存,然后再內存中運行一段時間,再把它放回磁盤。
- 虛擬內存,基本思想是每個程序都有自己的地址空間,這個地址空間被划分為多個稱為頁面(page) 的塊。每一頁都是連續的地址范圍。這些頁被映射到物理內存,但並不是所有的頁都必須在內存中才能運行程序。當程序引用到一部分在物理內存中的地址空間時,硬件會立刻執行必要的映射。當程序引用到一部分不在物理內存中的地址空間時,由操作系統負責將缺失的部分裝入物理內存並重新執行失敗的指令。
- 大部分使用虛擬內存的系統中都會使用一種分頁的技術。
- 程序生成的地址被稱為虛擬地址(virtual addresses) 並形成虛擬地址空間(virtual address space){包含虛擬頁號(高位部分)和偏移量(低位)},在沒有虛擬內存的計算機上,系統直接將虛擬地址送到內存中線上,讀寫操作都使用同樣地址的物理內存。在使用虛擬內存時,虛擬地址不會直接發送到內存總線上。相反,會使用MMU(Memory Management Unit)內存管理單元把虛擬地址映射為物理內存地址,像下圖這樣。
- 頁表給出虛擬地址與物理內存地址之間的映射關系。
- 虛擬頁號可作為頁表的索引用來找到虛擬頁中的內容。
- 由頁表項可以找到頁框號(如果有的話)。
- 然后把頁框號拼接到偏移量的高位端,以替換掉虛擬頁號,形成物理地址。
- 頁表的目的是把虛擬頁映射到頁框中。從數學上說,頁表是一個函數,它的參數是虛擬頁號,結果是物理頁框號
- 頁表項的結構
- 頁面置換算法,當發生缺頁中斷(內存不足)時,操作系統必須在內存中選擇一個頁面將其換出內存,以便為即將調用的頁面騰出空間。每次選用不常用的頁面會提高性能。
- 最優頁面置換算法
- 最近未使用頁面置換算法
- 先進先出頁面置換算法
- 第二次機會頁面置換算法
- 時鍾頁面置換算法
- 最近最少使用頁面置換算法
- 最好的頁面置換算法是老化算法和WSClock算法。他們分別是基於 LRU 和工作集算法。他們都具有良好的性能並且能夠被有效的實現
- 空閑內存管理
- 位圖(bitmap),位圖的大小取決於內存和分配單元的大小
- 空閑列表(free lists),維護一個記錄已分配內存段和空閑內存段的鏈表。
- 內存使用算法有首次適配(first fit)、下次適配(next fit)、最佳適配(best fit)算法等。
- 位圖(bitmap),位圖的大小取決於內存和分配單元的大小
4.文件系統
- 文件系統,便於OS存儲和管理文件信息,方便用戶對文件的存取、共享和保護等,有效提高系統資源的利用率。
- 文件是一種抽象機制,它提供了一種方式用來存儲信息以及在后面進行讀取。
- 在創建一個文件后,它會給文件一個命名。當進程終止時,文件會繼續存在,並且其他進程可以使用名稱訪問該文件。
- 內存與磁盤之間的數據交換(即讀/寫操作、磁盤I/O)都是以塊為單位進行的。即每次讀塊,或每次寫出一塊。類似於內存分頁。磁盤塊是文件系統讀寫數據的最小單位。
- 文件的物理實現
- 連續分配,實現簡單、讀取性能強,但會導致磁盤碎片化。
- 鏈表分配,每個文件構造磁盤塊鏈表,每個文件都是磁盤塊的鏈接列表。可以充分利用每個磁盤塊,但隨機訪問困難,指針也會占用一些字節。
- 索引組織,在內存中使用表進行鏈表分配。取出每個磁盤塊的指針字,把它們放在內存的一個表中,就可以解決上述鏈表的兩個不足之處。缺點是需要內存存儲文件分配表,不適合大磁盤。
- i節點
- 連續分配,實現簡單、讀取性能強,但會導致磁盤碎片化。
- 磁盤塊與頁的大小一般相等。
參考博客:
https://www.cnblogs.com/cxuanBlog/p/13297199.html
https://www.cnblogs.com/geaozhang/p/7041112.html