操做系統--內存管理

內存管理:算法

  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),若是改數大於內存中頁幀總數,就掛起一個進程,從而防止系統抖動。          

相關文章
相關標籤/搜索