內存管理:算法
1. 單一分區分配:
性能
用於單用戶、單任務的操做系統,主存被分爲兩部分:駐留操做系統(內存低端)、用戶進程(內存高端)spa
2. 多分區分配:操作系統
知足多道程序的最簡單的存儲管理方案,將內存劃分紅若干個連續區域,稱爲分區;每一個分區只能存儲一個程序,而且程序也只能在它所駐留的分區中運行進程
分區方法分爲固定分區和動態分區,分區分配算法:First-Fit、Best-Fit、Worst-Fit、Next-Fit內存
這種分配策略會同時存在外部碎片和內部碎片,可經過緊縮減小碎片it
3. 頁式內存管理:
內存管理
容許進程的物理地址空間能夠是不連續的效率
邏輯地址空間中劃分爲頁(數據塊),物理地址空間劃分爲頁幀,從邏輯地址映射到物理地址空間使用頁表原理
所以,每一次的數據/指令訪問須要兩次內存訪問,可以使用快表(TLB),使訪問降到一次
頁表:分級頁表、哈希頁表、反向頁表
這種分配策略會同時存在外部碎片和內部碎片
4. 段式內存管理:
容許進程的物理地址空間能夠是不連續的
適應用戶的角度,使用段表映射地址
因爲段的長度可變(區別於頁),因此就面臨動態分配問題,一樣使用First-Fit、Best-Fit、Worst-Fit、Next-Fit算法
這種分配策略只會存在外部碎片
5. 段頁式內存管理:
先段式後頁式,Linux就是這樣,一個程序先被劃分爲若干程序段,對每一分段又分紅若干個固定大小的頁
虛擬存儲管理:
經過換入換出頁(段),使得進程的邏輯空間比實際佔有的內存空間大得多,從而使得內存中能夠駐留更多的進程(用戶)
但總的虛擬地址空間不大於物理內存和外存交換區容量之和
1. 如何知道一個進程的某個頁面在不在內存?
頁表項有一個有效-無效位,1表示在內存,0表示不在內存
2. 發現某個頁面不存在以後,有什麼響應?
產生缺頁中斷,要求熟悉缺頁中斷以後的響應流程(頁面置換過程)
3. 若是發生缺頁,但此時內存中無空閒塊,此時將哪一個頁面換出?(頁面置換算法)
這個頁面置換算法要求缺頁中斷的次數儘量的小
1. FIFO算法(先來先出):容易致使Belady現象,即內存中分配的頁幀越多,缺頁中斷的次數反而增長
2.Optimal算法:選擇將來再也不使用的,或在離當前最遠位置上出現的頁面被置換,因爲後面的數據實際不可知,因此這種算法不可實現,但一般用來做爲做爲對比,來衡量其餘算法的效率
3. LRU算法(最近最少使用):選擇內存中最久未使用的頁面被置換,這是局部性原理的合理近似,性能接近最佳算法,但因爲須要記錄頁面使用時間的前後順序,時間開銷太大
4. 近似LRU算法:
1. first chance 算法:利用頁表項的引用位,隨機選取該位爲0的頁面置換
2. second chance 算法(clock算法):一樣利用引用位,遇「1」置「0」,並依然留在內存中,遇「0」置換
3. ehanced second chance 算法:同時利用引用位和修改位,依據二者的組合淘汰頁面
5. 頁面緩衝算法: 對FIFO算法的改進,經過對被置換頁面的緩衝,有機會不經過訪問磁盤,就找回剛被置換的頁面(Windows和Linux的頁面置換算法就是基於頁面緩衝算法的)
4. 那麼一開始在內存中給每一個進程分配多少頁幀?
在爲進程分配幀時,首先應該考慮的問題是:能保證進程正常運行所需的最少幀數(也成最小物理塊)
內存中分配頁幀採用的算法:
1. 平均分配算法
2. 按比例分配算法:根據進程的大小按比例分配
3. 優先權分配算法:優先權高的進程適當增長份額
固然,分配策略也能夠分爲固定分配和可變分配策略
置換策略分爲全局置換和局部置換
系統抖動:進程忙於換入換出頁面,從而使進程的程序沒有往下執行或者執行得很慢(硬盤的指示燈一閃一閃)
解決方法:1. 掛起若干進程
2. 在CPU調度中引入工做集算法:選擇工做集窗口大小,例如10000條指令,進程Pi的工做集Wssi = 最近一次工做集窗口內頁面引用的總數,則頁幀總需求數爲All(Wssi),若是改數大於內存中頁幀總數,就掛起一個進程,從而防止系統抖動。