操作系統
- shell 又稱作外殼,如gui 等,提供給外部服務,操作系統提供的對外可見的服務
- kernel 內核
- 操作系統管理三大資源
- cpu
- cpu調度
- 進程線程管理
- 內存
- 物理內存管理
- 虛擬內存管理
- 磁盤
- 文件系統的形式進行管理
- 中斷處理與設備驅動管理
- cpu
中斷與異常處理
- 中斷的處理過程, 軟硬件的結合
- 硬件:
- 標記中斷狀態
- 生成一個keyId
- 軟件:
- 保存當前程序的狀態
- 中斷服務程序,再硬件中有一個程序id,通過這個程序id在內存中找到程序地址,然後根據這程序所指定的中斷方式進行中斷程序
- 清楚中斷標記
- 恢復第一步保存的時候的狀態,類似於事務中的回滾操作
- 硬件:
- 異常處理過程:
- 保存現場
- 異常處理
- 殺死異常程序
- 重新執行異常指令
- 恢復現場
內存管理技術
- 覆蓋技術
- 較小的內存中運行較大的程序,與分區存儲管理配合使用
- 常用代碼和數據常駐內存(他決定哪部分數據會加載到內存中)
- 非常用代碼平時存儲在外存中,按需加載到內存
- 非調用關係的模塊(非協調性的程序),按需加載到內存
- 缺點:
- developer時間成本以及管理成本
- developer時間成本以及管理成本
- 較小的內存中運行較大的程序,與分區存儲管理配合使用
B,C,D,E,F都是互不相關的函數
- 交換技術:
- 將暫時不能運行的程序送到外村
- 具體是指: 將一個process的地址空間的內容保存到外存中,當需要的時候,在將某個進程的address讀入到內存中,換入換出內容的大小爲整個程序的地址空間
- 缺點:
-
粒度過大,以進程爲base單位
-
- 虛擬內存技術;
- 類似於覆蓋技術,但是非developer管理,交由os自己管理,核心:程序的所有內容並不會放在內存中
- 也能實現類似於交換技術,實現內存與外存之間的交換
頁面置換算法
- 定義: 當缺頁中斷髮生時,調入新的頁,而此時當物理內存已滿時,就需要頁面置換某個物理頁面
- 目標: 儘可能的減少頁面的換進換出次數
- 頁面鎖定技術: 既類似於lock,被lock的頁面,不會被換入換出
- 局部頁面置換算法
- 最優頁面置換算法:預測最長等待時間的頁面(既預測哪個頁面可能下次被訪問的時候間隔最久)
- 實現: 實際無法實現,
通常用作一個評價的標準,對比其他算法的性能依據
- 實現: 實際無法實現,
- 先進先出算法(FIFO): 將內存中駐入時間最長的頁面,將其淘汰
- 缺點: 性能最差,調出的頁面可能是經常要訪問的頁面
- 最近最久未使用算法(LRU): 當一個缺頁中斷髮生時,他太最久未使用的頁面
- 原理: 近似於最優置換算法,採取的局部性原理,若某些頁面被頻繁訪問,則其大概率在將來也會被頻繁訪問
- 時鐘頁面置換算法: LRU的近似,FIFO的優化,結合了FIFO和LRU
- 原理: 當頁面初始被載入時,將其初始化爲0,並且每個頁面組成一個環形鏈表,並且當前指針指向最早進入的頁面(FIFO的思路),當發生頁面置換的時候,先判斷當前指針是否爲0(既是否被訪問過),若0 直接淘汰
但判斷是否淘汰只通過0和1,並非與LRU一樣計算次數
- 二次機會法: clock算法的優化,充分運用其內部的bit ,access bit 和dirty bit (access代表讀,dirty代表寫),替換頁的標準爲2個bit都爲0,若access bit 0 而dirty bit 爲1 則只會將dirty bit 置爲0,相反也一樣,置爲0 ,但若是2個都爲1,則只會將access bit置爲0,dirty bit不變,然後指針繼續走 (使得dirty bit被使用的更有機會留在內存中!!,只讀的頁更大概率被置換)
- LFU(最近最少未使用算法),與LRU 的區別在於,LRU 強調時間,而LFU 強調的是次數
- Belady現象的原因: (
算法必須爲FIFO算法
)- 原因在於FIFO的核心與頁面置換算法的核心衝突,頁面置換的核心在於將不常用的頁面置換出去,而FIFO 並不在乎此種情況,只將最新進入的頁面直接置換
- 比較:
- FIFO是特殊的LRU ,當頁面進入內存之後就不再被訪問,則LRU並會退化爲FIFO
- 最優頁面置換算法:預測最長等待時間的頁面(既預測哪個頁面可能下次被訪問的時候間隔最久)
- 全局頁面置換算法
- 工作集和常駐集:
- 工作集: 既程序運行時間內的頁面訪問集合(可以認爲是也頁面地址集合,該頁面集合可能有些在內存中有些可能不在內存中)
- 常駐集: 指的是當前時刻,在內存中的頁面集合
- 工作集頁面置換算法: 程序運行可認爲是滑動窗口模式,使用的是部分頁面,而隨着程序進行,該算法會將不使用的頁面直接丟棄,並不管當前頁面是否充足,而是不在該時間窗口內就丟棄
- 影響因素: 工作集窗口的大小(也可以認爲是時間窗口大小)
- 缺頁率頁面置換算法:(基於常駐集,常駐集動態發生變更),缺失越多表明需要擴大常駐集,缺失率很低則表明可以壓縮常駐集
- 缺頁率: 缺頁數/內存訪問次數
- 工作集和常駐集:
- 抖動問題:
- 常駐集和工作集之間,當常駐集遠小於工作集時,內存中頻繁發生頁面置換,從而使得操作系統運行緩慢的現象
- 原因: 進程數目的增多,使得分給每個進程的物理頁面數減小,從而使得缺頁率增大
- 常駐集和工作集之間,當常駐集遠小於工作集時,內存中頻繁發生頁面置換,從而使得操作系統運行緩慢的現象
進程
- 程序=算法+數據結構
- 描述進程的數據結構: 進程控制塊(PCB:Process Control Block)
- PCB組成:
進程標識信息
: 類似於ID處理機狀態信息保存區
- 用戶可見寄存器: 用戶程序可以使用的數據,地址等寄存器
- 控制和狀態寄存器: 如程序計數器,程序狀態字
- 棧指針:
進程控制信息
- 調度和狀態信息: 用於系統調度
- 進程間的通信信息: 支持進程間的標識,信號等
- 存儲管理信息: 指向本進程存儲空間的數據結構: (既進程本身也可以存儲內容)
- 進程佔用的資源: 如文件資源等
- 有關數據結構鏈接信息: 進程可以連接到一個進程隊列中
- PCB的組織方式:
- 鏈表形式: 進程是動態的執行過程,添加刪除 鏈表性能更好
- 數組形式: 相同index 存放一起
- 進程的生命週期
- 進程創建:
- 創建的事件:
- 系統初始化
- 用戶請求創建一個新進程
- 進程創建進程(既運行中的進程調用系統函數創建進程)
- 創建的事件:
- 進程運行
- 進程阻塞 *只有進程本身才可以阻塞自己,無法阻塞其他進程
- 觸發條件:
- 等待系統服務
- 某種操作無法馬上完成
- 等待數據
- 觸發條件:
- 進程喚醒: 進程只能被其他進程或者操作系統所喚醒
- 觸發條件:
- 資源數據滿足
- 相應的事件到達
- 該PCB插入到就緒隊列中
- 觸發條件:
- 進程結束
- 結束分爲:
- 正常退出(自願)
- 錯誤推出(自願)
- panic錯誤(致命錯誤,非自願)
- 被其他進程殺死(非資源)
- 結束分爲:
- 進程創建:
- 進程結束前的三個基本狀態:
- 運行態:
- 就緒態
- 等待狀態:
線程
- 進程是資源分配的基本單位
- 線程是CPU調度的基本單位
- 爲什麼使用線程:
- 使用進程代替線程的缺點:
- 進程開銷大,需要創建PCB,同時進程之間需要共享數據,當回收進程之後需要銷燬PCB同時將進程中的資源進行回收
- 使用線程的原因,線程的優點:
- 線程共享進程的數據
- 線程實體之間可以併發的執行
- 線程之間也是數據共享的
- 線程的缺點:
- 當一個線程panic的時候,其所屬進程的所有線程也會直接panic(既當Thread A 因爲認爲的BUG使得數據發生錯誤,共享數據的其他線程獲取到髒數據也會因此而無效)
- 線程的定義:
進程當中的一條執行流程
- 線程相比進程的優點:
- 創建時間相對更短
- 進程需要創建內存去管理
- 線程直接從所屬進程中的內存創建
- 同一進程內的線程切換比進程快,原因在於進程內的線程同屬一個地址空間,也就意味着線程處於同一個內存頁表
- 創建時間相對更短
- 使用進程代替線程的缺點:
線程的實現:
- 用戶線程(
既操作系統看不到的線程
)- 缺點:
- 線程使用期間依然會佔據CPU時間片,因而若該線程阻塞,則會導致進程的其他線程也無法在運行
- 線程依賴於進程,進程獲取到的CPU時間片有限,因而進程所屬的線程獲取到的時間片相比會更加短,因而執行效率上會更低
- 缺點:
- 內核線程(
受操作系統管理的線程
)- 內核線程阻塞並不會影響該進程內的其他線程
- 輕量級進程: 內核支持的用戶線程,一個進程可以有多個輕量級進程,每個輕量級進程由一個內核線程所支持
上下文切換:
-
概念: 進程狀態的變更
-
OS會爲每個進程配置PCB,並且會將PCB放到合適的隊列中
- 就緒隊列:
- IO等待隊列
- 僵死隊列
-
進程的創建:
- fork的作用:
- 對子進程分配內存
- 將父進程的內存和cpu寄存器到子進程中(
這步操作其實是無用的,內存複製在這期間並沒有作用
) - 開銷巨大
- vfork的作用:
- 輕量級fork,不需要進行內存的映射
- Copy On Write技術
- fork的作用:
CPU調度
- 調度發生的條件:
- 當進程處於
等待就緒狀態的時候
- 或者是進程被終止了
- 當進程處於
- 不可搶佔條件
- 可以搶佔
調度算法
- FCFS(FIRST COME FIRST SERVE)先來先服務
- SRT() 短進程優先(短生命週期的率先調度)
- HRRN(Highest response Ratio Next) 最高響應優先
- RR(Round Robin) 輪詢
- 在這種模式下的調度算法,並不會管進程是否結束,而是隻會佔用一定的cpu時間片
- 缺點:
- 吞吐量低: 上下文切換佔據很長一部分時間
- cpu時間片值的定義
- MFQ(Multilevel Feedback Quees )??? 多級反饋隊列
- cpu密集型的進程,優先級會相對較低
- 而IO密集型的進程,優先級會相對較高
- FSS(Faire Share Schedual)公平策略
進程間通信方式
管道:
適用於進程間需要有點關係
- 管道中的數據是一種字節流
- ls | more 中的 豎線 | 既是管道的功能
- more是從 ls中獲取得到數據(通過管道),而非從其他獲取數據
-
- 創建管道
-
- 爲ls 創建一個進程,設置stdout爲管道寫端
-
- 爲more創建一個進程,設置stdin爲管道的讀端
消息隊列
- 按FIFO的形式管理信息
- 數據結構:
共享內存
- 每個進程內部都由共享內存地址
- 效率最快,但是但是需要控制同步