操作系統(虛擬存儲器)

操作系統(虛擬存儲器)

筆者大三,最近在複習,爲明年的春招做準備,歡迎互關呀,共同學習,進步!

虛擬存儲器實現了內存擴充的功能,但是該擴充不是物理上實際的擴大內存容量,而是從邏輯上實現對內存容量的擴充,讓用戶感覺到的內存容量比實際內存容量大得多

在傳統的存儲器管理的方式中,他們都要求將一個作業全部裝入內存後方能運行,但是這樣會出現兩種情況:

  • 有的作業很大,其所要求的內存空間超過了內存總容量,作業不能全部被裝入內存,致使該作業無法運行
  • 有大量作業要求運行,但由於內存容量不足以容納所有這些作業,只能將少數作業裝入內存讓他們先運行,而降其他大量的作業留在外存等待

上面兩種情況都是由於內存容量不夠大,所以,虛擬存儲器的出現就是爲了從邏輯上擴大內存容量。

一,虛擬存儲器工作流程

局部性原理:

應用程序在運行之前沒有必要將之全部裝入內存,而僅須將那些當前要運行的少數頁面或段先裝入內存便可運行其餘部分暫留在外存。

工作流程:

程序運行時,如果他所要訪問的頁或段已經調入內存,便繼續執行下去;否則,便發出缺頁/缺段中斷請求,此時OS將利用請求調頁/調段功能將他們調入內存,以便進程能繼續執行下去,如果此時內存已滿,無法裝入新頁/段,OS還需要再利用頁段置換功能,將內存中暫時不用的頁或段調至外存,騰出足夠內存空間後,再將所需要的頁或段調入內存。

在這裏插入圖片描述

結果:

這樣便可以使一個大的用戶程序在較小的內存空間中運行,也可在內存中同時裝入足夠多的進程,使他們併發執行

二,分頁請求系統

本文只重點說說分頁請求系統

1.請求調頁

頁表數據結構

在請求分頁系統中,需要的主要數據結構是請求頁表,其基本作用仍然是將用戶地址空間中邏輯地址映射爲內存空間中的物理地址

頁表如下:

在這裏插入圖片描述

狀態位P:指示該頁是否已經調入內存

訪問字段A:用於記錄本頁在一段時間內被訪問次數

修改位M:標識該頁在調入內存後是否被修改過,如果未被修改過,在置換該頁時,就不需要將該頁寫回到外存上;如果修改過,則必須重寫到外存上。

外存地址:指該頁在外存上的地址

內存分配

最小物理塊數:

能保存進程正常運行所需的最小物理塊數,當系統爲進程分配的物理塊數少於此值時,進程將無法運行

先聊一聊什麼是固定和不可變分配,還有什麼是局部和全局分配

  • 固定分配

    指爲每個進程分配一組固定數目的物理塊,在進程運行期間不再改變

  • 可變分配:

    是指先爲每個進程分配一定數目的物理塊,在進程運行期間,可根據情況適當的增加或減少

  • 全局置換:

    如果進程在運行中發現缺頁,則將OS所保留的空閒物理塊取出一塊分配給該進程,或者以所有進程的全部物理塊爲標準,選擇一塊換出

  • 局部置換:

    如果進程在運行中發現缺頁,則只能從分配給該進程的N個頁面中選出一塊換出

內存分配策略

  • 固定分配局部置換
    • 缺點:難以確定爲每個進程應該分配多少個物理塊,太少,則會頻繁的出現缺頁中斷,太多,則內存中的進程數量會減少,進而造成cpu空閒或者其他資源空閒的情況
  • 可變分配全局置換
    • 缺點:採用這種策略僅當空閒物理塊中的物理塊用完,內存中的頁纔會調出,被調出的頁可能是系統中任何一個進程的頁,此進程所有擁有的物理塊會較少,導致其缺頁增加
  • 可變分配全局置換

物理塊分配算法

  • 平均分配算法

    每個進程分配的物理塊數量一樣

  • 按比例分配算法

    按照進程的大小根據比例分配

  • 考慮優先權的分配算法

    考慮到線程的優先級

調頁策略

調頁策略需要解決三個問題:

  • 何時調頁
  • 何處調頁
  • 如何調頁
何時調頁?
  • 預調頁策略

    將那些預計在不久之後便會被訪問的頁面預先調入內存

  • 請求調頁策略

    當發現所需頁面不在時,便立即hi提出調頁請求

何處調頁?
  • 系統如果擁有足夠的對換區空間,這時可以全部從對換區調入所需要的頁面,但是在進程運行前,需要將所有與該進程有關的文件從文件區拷貝到對換區
  • 系統缺少足夠的對換區空間,這時凡是不會被修改的文件,都直接從文件區調入;而當換出這些頁面時,由於他們未被修改,則不必將他們重寫到磁盤中,以後在調入時也是從文件區直接調入,對於可能被修改的部分,再將他們換出時必須換出到對換區,以後在需要時從對換區調入
如何調頁?

在這裏插入圖片描述

2.頁面置換

頁面置換就是從內存中調出一頁送到外存中

頁面置換算法

置於怎麼選擇哪一頁調出,則需要頁面置換算法來決定

目前有這幾種頁面置換算法

  • 最佳置換算法

  • 先進先出置換算法

  • 最近最久未使用LRU算法

  • 最少使用置換LFU算法

    1.最佳置換算法

(理想置換算法):從主存中移出永遠不再需要的頁面;如無這樣的頁面存在,則選擇最長時間不需要訪問的頁面。於所選擇的被淘汰頁面將是以後永不使用的,或者是在最長時間內不再被訪問的頁面,這樣可以保證獲得最低的缺頁率。 即被淘汰頁面是以後永不使用或最長時間內不再訪問的頁面。

最佳置換算法可以用來評價其他算法。假定系統爲某進程分配了三個物理塊,並考慮有以下頁面號引用串:
7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1
進程運行時,先將7, 0, 1三個頁面依次裝入內存。進程要訪問頁面2時,產生缺頁中斷,根據最佳置換算法,選擇第18次訪問才需調入的頁面7予以淘汰。然後,訪問頁面0時,因爲已在內存中所以不必產生缺頁中斷。訪問頁面3時又會根據最佳置換算法將頁面1淘汰……依此類推,如圖所示。從圖中可以看出釆用最佳置換算法時的情況。
可以看到,發生缺頁中斷的次數爲9,頁面置換的次數爲6。

在這裏插入圖片描述

2.先進先出置換算法

是最簡單的頁面置換算法。這種算法的基本思想是:當需要淘汰一個頁面時,總是選擇駐留主存時間最長的頁面進行淘汰,即先進入主存的頁面先淘汰。其理由是:最早調入主存的頁面不再被使用的可能性最大。 即優先淘汰最早進入內存的頁面。

在這裏插入圖片描述

這裏仍用上面的實例,釆用FIFO算法進行頁面置換。進程訪問頁面2時,把最早進入內存的頁面7換出。然後訪問頁面3時,再把2, 0, 1中最先進入內存的頁換出。由圖可以看出,利用FIFO算法時進行了 12次頁面置換,比最佳置換算法正好多一倍。

3.最近最久未使用(LRU)算法

種算法的基本思想是:利用局部性原理,根據一個作業在執行過程中過去的頁面訪問歷史來推測未來的行爲。它認爲過去一段時間裏不曾被訪問過的頁面,在最近的將來可能也不會再被訪問。所以,這種算法的實質是:當需要淘汰一個頁面時,總是選擇在最近一段時間內最久不用的頁面予以淘汰。 即淘汰最近最長時間未訪問過的頁面。

在這裏插入圖片描述

LRU算法的性能接近於OPT,但是實現起來比較困難,且開銷大;FIFO算法實現簡單,但性能差。所以操作系統的設計者嘗試了很多算法,試圖用比較小的開銷接近LRU的性能,這類算法都是CLOCK算法的變體。
簡單的CLOCK算法是給每一幀關聯一個附加位,稱爲使用位。當某一頁首次裝入主存時,該幀的使用位設置爲1;當該頁隨後再被訪問到時,它的使用位也被置爲1。對於頁替換算法,用於替換的候選幀集合看做一個循環緩衝區,並且有一個指針與之相關聯。當某一頁被替換時,該指針被設置成指向緩衝區中的下一幀。當需要替換一頁時,操作系統掃描緩衝區,以查找使用位被置爲0的一幀。每當遇到一個使用位爲1的幀時,操作系統就將該位重新置爲0;如果在這個過程開始時,緩衝區中所有幀的使用位均爲0,則選擇遇到的第一個幀替換;如果所有幀的使用位均爲1,則指針在緩衝區中完整地循環一週,把所有使用位都置爲0,並且停留在最初的位置上,替換該幀中的頁。由於該算法循環地檢查各頁面的情況,故稱爲CLOCK算法,又稱爲最近未用(Not Recently Used, NRU)算法。

3.抖動和工作集

抖動

在頁面置換過程中的一種最糟糕的情形是,剛剛換出的頁面馬上又要換入主存,剛剛換入的頁面馬上就要換出主存,這種頻繁的頁面調度行爲稱爲抖動,或顛簸。如果一個進程在換頁上用的時間多於執行時間,那麼這個進程就在顛簸。

抖動產生的原因:

  • 同在系統中運行的進程太多,由此分配給每一個進程的物理塊太少,不能滿足進程正常運行的基本要求,致使每個進程在運行時,頻繁出現缺頁,必須請求系統將所缺的頁調入內存,這會使在系統排隊等待頁面調入調出的進程數目增多,造成每個進程的大部分時間都處於頁面的換進換出,而幾乎不去做任何有效的工作

工作集

工作集(或駐留集)是指在某段時間間隔內,進程要訪問的頁面集合。經常被使用的頁面需要在工作集中,而長期不被使用的頁面要從工作集中被丟棄。爲了防止系統出現抖動現象,需要選擇合適的工作集大小。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章