操作系統-6-內存

文章目錄

內存

一、內存的基礎知識

在這裏插入圖片描述

內存是用於存放數據的硬件,程序執行前需要先放入內存中才能被CPU處理

思考:

  • 在多道程序環境下,系統中會有多個程序併發執行,也就是說會有多個程序的數據需要同時放在內存中,那麼如何區別各個程序的數據放在什麼地方的呢?

方案:給內存的存儲單元編地址。
每個內存地址都對應一個存儲單元。

在這裏插入圖片描述

一臺手機/電腦的內存有4G,是什麼意思?

  • 指的是內存中可以存放4*2^30個字節,如果按照字節編址的話,也就是有 4 * 2 ^30個小房間

1、進程的知識原理–指令

在這裏插入圖片描述
在這裏插入圖片描述

CPU能識別指令,這些指令會告訴CPU去內存的哪裏存/取數據,這個數據應該做什麼樣的處理。

在上面的例子中,指令中給出了變量X的實際存放地址(物理地址),但是實際在生成機器指令的時候並不知道進程的數據會放到什麼位置,所以編譯生成的指令中一般是使用邏輯地址(相對地址)

指令中的地址也可以採用這種思想,編譯的時候指令只關心“相對地址”,實際放入內存中時再想辦法根據起始位置得到“絕對地址”

在這裏插入圖片描述

裝入的三種方式(邏輯地址到物理地址的轉換)

1、絕對裝入(編譯時候就知道放到內存的哪個絕對地址)

絕對裝入:在編譯的時候,如果知道程序將放入內存中的哪個位置,編譯程序將產生絕對地址的目標代碼。裝入程序按照裝入模塊的地址,將程序和數據裝入內存。

2、靜態重定位(根據起始位置計算,裝入內存時,必須分配其要求的全部內存空間)

靜態重定位:又稱爲可重定位裝入,編譯、鏈接之後的裝入模塊的地址都是從0開始的,指令中使用的地址、數據存放的地址都是相對於起始地址而言的邏輯地址。可以根據內存的當前情況,將裝入模塊存放到合適的位置,裝入時對地址進行重定位。

在這裏插入圖片描述

特點:作業在裝入內存的時候,必須分配其要求的全部內存空間,如果沒有足夠的內存,就不能裝入作業,作業一旦裝入內存後,在運行期間不能再移動,也不能在申請內存空間。

3、動態重定位(地址轉換推遲到指令真正要執行時才進行)

編譯和鏈接的裝入模塊的地址都是從0開始的,裝入程序把裝入模塊裝入內存之後,並不會把邏輯地址轉換爲物理地址,而是把地址轉換推遲到程序真正要執行時才進行,因此裝入內存後所有的地址依然是邏輯地址,這種方式需要一個重定位寄存器的支持。

在這裏插入圖片描述

二、內存管理

  • 操作系統負責內存空間的分配和回收。
  • 操作系統需要提供某種技術從邏輯上對內存空間進行擴充
  • 操作系統需要提供地址轉換功能,負責程序的邏輯地址與物理地址的轉換
  • 操作系統需要提供內存保護,保證各進程在各自存儲空間中運行,互不干擾。

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

總結

在這裏插入圖片描述

三、覆蓋技術(不常用的段在需要時調入內存)

用來解決程序大小超過物理內存總和的問題
覆蓋技術的思想,將程序分爲多個段(多個模塊),常用的段常駐內存,不常用的段在需要的時候調入內存

常用的段放在“固定區”,調入內存就不再調出。不常用的段放在覆蓋區,需要用的時候調入內存,用不到的時候調出內存。

在這裏插入圖片描述

四、交換技術(把暫時不運行進程對應內存中的一些數據換出到外存)

內存空間緊張的時候,系統將內存中某些進程暫時換出外存,把外存中具有運行條件的進程換入內存(進程在內存和磁盤之間動態調度)

被換出的進程數據存在對換區。對換區主要追求換入換出的速度,文件區追求磁盤利用率/

在這裏插入圖片描述
在這裏插入圖片描述

總結

在這裏插入圖片描述

五、內存空間的分配和回收

在這裏插入圖片描述

連續分配:指爲用戶進程分配的必須是一個連續的內存空間

1、單一連續分配(內存中只有一道用戶程序)

單一連續分配方式中,內存被分爲系統區和用戶區
系統區通常位於內存的低地址部分,用於存放操作系統相關數據,用戶區用於存放用戶進程相關數據。

內存中只能有一道用戶程序,用戶程序獨佔整個用戶區空間。

優點:實現簡單,無外部碎片,可以採用覆蓋技術擴充內存,不一定採取內存保護
缺點:只能用於單用戶、單任務的操作系統中,有內存碎片,存儲器利用率低。

2、固定分區分配(用戶空間劃分爲若干固定大小的分區)

爲了能在內存中裝入多道程序,且這些程序之間不會相互干擾,於是將整個用戶空間劃分爲若干固定大小的分區,在每個分區中只裝入一道作業,這樣就形成了最早的、最簡單的一種可運行多道程序的內存管理方式。

固定分區分配:

  • 分區大小相等
  • 分區大小不想等

在這裏插入圖片描述
分區大小相等:缺乏靈活性,但是適用於一臺計算機控制多個相同對象的場合。

操作系統建立了一個數據結構–分區說明表,來實現各個分區的分配與回收,每個表項對於一個分區,通常按分區大小排列,每個表項對應分區的大小、起始地址、狀態(是否已分配)。
在這裏插入圖片描述
優點:實現簡單,無外部碎片
缺點:

  • 1、當用戶程序太大的時候,可能所有的分區都不能滿足需求,此時不得不採用覆蓋技術來解決,但這又會降低性能。
  • 2、會產生內部碎片,內存利用率低。

3、動態分區分配(進程裝入時,根據進程大小動態建立分區)

這種分配方式不會劃分內存分區,而是在進程裝入內存的時候,根據進程的大小動態建立分區。

動態分區的三個問題?

  • 1、系統會用什麼樣的數據結構記錄內存的使用情況?
    空閒分區表或者空閒分區鏈
    在這裏插入圖片描述
  • 2、當很多空閒分區都能滿足需求的時候,應該選擇哪個分區進行分配?
    使用動態分配算法(下面會講)
  • 3、如何進行分區的分配和回收操作?
    再進行分區回收的時候,如果發現有一些分區是相鄰的,需要把相鄰分區合併。

內部碎片和外部碎片:

  • 1、內部碎片:分配給進程的內存區域中,如果有些部分沒有用上。
  • 2、 外部碎片:內存中的某些空閒分區由於太小而難以利用。

總結

在這裏插入圖片描述

六、動態分區分配算法

在動態分區分配方式中,當很多空閒分區都能滿足需求的時候,應該選擇哪個分區進行分配?

有四種算法:

  • 首次適應算法
  • 最佳適應算法
  • 最壞適應算法
  • 鄰近適應算法

1、首次適應算法(順序查找找到大小能滿足要求的第一個空閒分區)

算法思想:

  • 每次都從低地址開始查找,找到第一個能滿足大小的空閒分區

如何實現:

  • 空閒分區以地址遞增的次序排列,每次可以順序查找空閒分區鏈(或空閒分區表),找到大小能滿足要求的第一個空閒分區

在這裏插入圖片描述

2、最佳適應算法

優先適應更小的分區。

如何實現:

  • 空閒分區按容量遞增次序鏈接,每次分配內存的時候順序查找空閒分區鏈(或空閒分區表),找到大小能滿足要求的第一個空閒分區。

缺點:每次都選擇最小的分區進行分配,會留下越來越多的、很小的、難以利用的內存塊,因此這種方法會產生很多的外部碎片。

3、最壞適應算法

算法思想:空閒分區按照容量遞減的次序進行排列,每次·分配內存時按順序查找空閒分區鏈(或者空閒分區表),找到大小能滿足要求的第一個空閒分區。

缺點

  • 每次都選最大的分區進行分配,雖然可以讓分配留下的空閒分區更大,更可用,但是這種方式會導致較大的連續分區被迅速用完,之後有大進程到達的時候,就沒有內存分區可用了。

4、鄰近適應算法(每次從上一次查找結束的位置開始往後查找)

每次從上一次查找結束的位置開始往後查找,找到大小能滿足要求的第一個空閒分區。

在這裏插入圖片描述

總結

在這裏插入圖片描述

七、基本分頁存儲管理

考慮支持多道程序的兩種連續分配方式:

  • 1、固定分區分配:缺乏靈活性,會產生大量的內部碎片,內存的利用率低/
  • 2、動態分區分配:會產生很多的外部碎片,雖然可以用緊湊技術來處理,但是時間代價很高。

因爲連續分配算法要求進程佔用一整段連續內存區域。

  • 連續分配:爲用戶進程分配的必須是一個連續的內存空間

  • 不連續分配:爲用戶進程分配的可以是一個不連續的內存空間

分頁管理的基本概念

將內存分爲一個個大小相等的分區,每個分區就是一個”頁框“,或者叫“頁幀”、“內存塊”、“物理塊”。每個頁框有一個編號,即“頁框號”或者“內存塊號”、“頁幀號”、“物理塊號”,頁框號從0開始

將用戶進程的地址空間也分爲與頁框大小相等的一個個區域,稱爲==“頁”或者“頁面”==,每個頁面有一個編號,即“頁號”,頁號從0開始。

分頁之後如何實現地址轉換?

將進程地址空間分頁之後,操作系統該如何實現邏輯地址到物理地址的轉換?

重定位寄存器存放裝入模塊存放的起始位置。

最後存放的物理地址等於模塊在內存中的“起始地址”+目標內存單元相對於起始位置的“偏移量”
在這裏插入圖片描述

使用了分頁技術之後:
在這裏插入圖片描述
在這裏插入圖片描述
邏輯地址50對應的物理地址爲450,80即偏移量爲30,對應的物理地址爲450+30=480

步驟:

  • 1、算出邏輯地址對應的頁號
    頁號 = 邏輯地址/頁面長度(取除法的整數部分)
    比如上面的例子 頁號 = 80/50 = 1
  • 2、要知道頁號對應頁面在內存中的起始地址。
  • 3、算出邏輯地址在頁面內的偏移量,比如上面的邏輯地址80在頁面內的偏移量爲30.
    頁內偏移量 = 邏輯地址 % 頁面長度(取除法的餘數部分)
    80 % 50 = 30
  • 4、物理地址 = 頁面起始+頁內偏移量

如果一個頁的大小爲2的12次方即4kb
在這裏插入圖片描述

頁表

爲了能知道進程的每個頁面在內存中存放的位置,操作系統要爲每個進程建議一張頁表。

在這裏插入圖片描述

之所以說頁號是隱藏的是因爲頁號可以通過頁表的起始地址和頁表長度計算出現,比如下面表示頁表項需要三字節。
在這裏插入圖片描述

回顧

在這裏插入圖片描述

八、基本地址變換機構

基本地址變化機構可以藉助進程的頁表將邏輯地址轉變爲物理地址。

通常會在系統中設置一個頁表寄存器,存放頁表在內存中的起始地址F和頁表長度M

在這裏插入圖片描述

設頁面大小爲L,邏輯地址A到物理地址E的變換過程如下:

  • 1、計算頁號P和頁內偏移量W(如果用十進制數手算,則P = A/L,W = A%L,但是在計算機實際運行的時候,邏輯地址結構是固定不變的,因此計算機硬件可以更快的得到二進制表示的頁號、頁內偏移量。)
  • 2、比較頁號與頁表長度M,如果P>=M,則產生越界中斷,否則繼續執行。(注意:頁號是從0開始的,而頁表長度至少是1,因此P=M時也會越界)
  • 3、頁表中頁號P對應的頁表項地址 = 頁表起始地址F+頁號P*頁表項長度,取出該頁表項內容b即爲內存塊號。頁表項長度表示每個頁表項佔多大的存儲空間頁表長度指的是頁表中總共有多少頁表項
  • 4、計算E=b*L+W,用得到的物理地址E去訪存。(如果內存塊號、頁面偏移量是用二進制表示的,那麼把二者拼接起來就是最終的物理地址了)

在這裏插入圖片描述

基於塊表的地址變換結構

在這裏插入圖片描述

在這裏插入圖片描述

總結

在這裏插入圖片描述

在這裏插入圖片描述

兩級頁表

某計算機系統按自己尋址,支持32位的邏輯地址,採用分頁存儲管理,頁面大小位4kb,頁表項長度爲4B。

4KB=2^12B,因此頁內地址要用12位表示,剩餘20位表示頁號。

因此,最多有2 ^ 20頁,相應的,一個進程的頁表中,最多有2^20 = 1M = 1048576個頁表項,所以頁表需要 2 ^ 20 *4B=2 ^ 22B,並需要2 ^ 22/2 ^ 12 = 2 ^ 10個頁框存儲該頁表。

存在的問題:

  • 頁表必須連續存放,如果頁表很大,需要佔用很多個連續的頁框。
  • 沒有必要讓整個頁表常駐內存,因爲進程在一段時間內可能只需要訪問幾個特定的頁面。

在這裏插入圖片描述

九、虛擬內存

在這裏插入圖片描述在這裏插入圖片描述

傳統存儲管理方式的缺點:

  • 作業一次性裝入內存後才能運行。

會造成兩個問題:

  • 1、作業很大的時候,不能全部裝入內存,導致大作業無法運行。
  • 2、當大量作業要求運行的時候,由於內存無法容納所有的作業,因此只有少量作業能運行,導致多道程序併發度下降。

駐留性:一旦作業被裝入內存,就會一直駐留在內存中,直到作業運行結束。實際上,在一個時間段內,只需要訪問作業的一小部分數據即可正常運行,這就導致了內存中會駐留大量的、暫時用不到的數據、浪費了寶貴的內存資源。

局部性原理

時間局部性

  • 如果執行了程序中的某條指令,那麼不久後這條指令很有可能再被執行,如果某個數據被訪問過,不久之後,這個數據可能會再次被訪問(因爲程序中存在大量的循環)。

空間局部性

  • 一旦程序訪問了某個存儲單元,在不久之後,其附近的存儲單元也很可能被訪問。(因爲很多數據在內存中是連續存放的,並且程序的指令也是順序存放在內存中的)

高速緩存技術的思想

  • 將近期被頻繁訪問到的數據放到更高速的存儲器中,暫時用不到的數據放在更低速的存儲器中。

在這裏插入圖片描述

  • ==基於局部性原理,在程序裝入的時候,可以將程序中很快用到的部分裝入內存,暫時用不到的部分留在外存,就可以讓程序開始執行。 ==
  • 在程序執行過程中,當所訪問的信息不在內存時,由操作系統負責將所需信息從外存調入內存,然後繼續執行程序。
  • 若內存空間不夠,由操作系統負責將內存中暫時用不到的信息換出到外存。
  • 在操作系統的管理下,在用戶看來似乎有一個比實際內存大的多的內存,這就是虛擬內存/

交換換的是進程?虛擬內存換的是內存中的頁等?

虛擬內存有以下三個主要特徵:

  • 多次性
    無需在作業運行時,一次性全部裝入內存,而是允許分成多次調入內存。
  • 對換性
    在作業運行的時候無需一直常駐內存,而是允許在運行過程中,將作業換入、換出
  • 虛擬性
    從邏輯上擴充了內存的容量,使用戶看到的內存容量,遠大於實際的容量

在這裏插入圖片描述

總結

在這裏插入圖片描述

十、請求分頁管理方式

請求分頁管理方式是在基本分頁存儲管理的基礎上進行擴展,進而實現了的一種虛擬內存管理技術
要實現請求分頁管理方式,操作系統要新增一些基本的功能:

  • 1、請求調頁的功能,系統需要判斷一個頁面是否已經調入內存,如果沒有,將頁面從外存調入內存。
  • 2、頁面置換:當內存暫時不夠用時,需要判斷將哪些頁面換入到外存。

在這裏插入圖片描述

1、頁表機制

在這裏插入圖片描述

2、缺頁中斷機構

在這裏插入圖片描述

在請求分頁系統中,每當要訪問的頁面不在內存時 (比如狀態位爲0),便產生了一個缺頁中斷,然後由操作系統的缺頁中斷處理程序處理中斷。

此時缺頁的進程阻塞,放入阻塞隊列,等到調頁完成後將其喚醒,放回就緒隊列

缺頁發生時候的處理

  • 如果在缺頁的時候,內存中有空閒塊,則爲進程分配一個空閒塊,將所缺頁面裝入該塊,並修改頁表中相應的頁表項。
  • 如果沒有空閒塊,則由頁面置換算法選擇一個頁面淘汰,若該頁在內存期間被修改過,則要將其寫回外存,未修改過的頁面不用寫回外存。

缺頁中斷是因爲當前執行的指令想要訪問的目標頁面未調入內存而產生的,屬於內中斷。

在這裏插入圖片描述

3、地址變換機構

請求分頁存儲管理與基本分頁存儲管理的主要區別:

  • 程序在執行過程中,當鎖訪問的信息不在內存時,由操作系統負責將所需信息從外存調入內存,然後執行程序
  • 如果內存空間不夠,由操作系統負責將被內存中暫時用不到的信息換出到外存。

在這裏插入圖片描述

總結

在這裏插入圖片描述

頁面置換算法

頁面置換算法決定了當內存空間不足的時候,操作系統需要將哪些暫時用不到的頁面換出到外存

頁面的換入、換出需要磁盤IO,會有較大的開銷,因此好的頁面置換算法應該追求更少的缺頁率。

頁面置換算法

  • 1、最佳置換算法(OPT)
  • 2、先進先出置換算法(FIFO)
  • 3、最近最久未使用置換算法(LRU)
  • 4、時鐘置換算法(CLOCK)
  • 5、改進型的時鐘置換算法

1、最佳置換算法(OPT,選擇最長時間內不再被訪問的頁面)

最佳置換算法

  • 每次選擇淘汰的頁面將是以後永不使用,或者最長時間內不再被訪問的頁面,這樣可以保證最低的缺頁率。

例子:
假設系統爲某進程分配了三個內存塊,並考慮到有以下頁面號引用串(會依次訪問這些頁面),7、0、1、2、0、3、0、4、2、3、0、3、2、1、2、0、1、7、0、1

在這裏插入圖片描述

整個過程缺頁中斷髮生了9次,頁面置換髮生了6次(因爲前面三次內存中還有空閒內存塊)。

缺頁時,未必發生頁面置換。若還有可用空閒內存塊,就不用進行頁面置換。

缺頁率 = 9/20 = 0.45

最佳置換算法每次選擇淘汰的頁面將是以後永不使用或者在最長時間不再被使用的頁面,這樣可以保證最低的缺頁率。

最佳置換算法可以保證最低的缺頁率,但是實際上,只有在進程執行的過程中才能知道接下來會訪問到的是哪個頁面。操作系統無法提前預判頁面訪問序列。因此,最佳置換算法是無法實現的

2、先進先出置換算法(FIFO)

淘汰的頁面是最早進入內存的頁面。

實現方法:把調入內存的頁面根據調入的先後順序排成一個隊列,需要換出頁面時選擇隊頭的頁面即可。

例:假設系統爲某進程分配了四個內存塊,並考慮有以下頁面號引用串:
3、2、1、0、3、2、4、3、2、1、0、4

在這裏插入圖片描述

分配四個內存快的時候缺頁次數爲10次、分配三個內存快的時候缺頁次數爲9次。

Belady異常,當爲進程分配的物理塊數增大的時候,缺頁次數不增反減的異常現象。只有先進顯出會產生Belady異常

FIFO實現簡單,性能比較差。

3、最近最久未使用置換算法(LRU)

每次淘汰的頁面是最近最久未使用的頁面。

實現方法:賦予一個頁面對應的頁表項中,用訪問字段記錄該頁面自上次被訪問以來所經歷的時間t。

當要淘汰一個頁面的時候,選擇現有頁面中t值最大的,即最近最久未使用的頁面。

在這裏插入圖片描述
在手動做題的時候,如果需要淘汰頁面,可以逆向檢查此時內存中的幾個頁面號,在逆向掃描過程中最後一個出現的頁號就是要淘汰的頁面。

4、時鐘置換算法(CLOCK,最近未使用算法)

時鐘置換算法是一種性能和開銷均衡的算法,又稱CLOCK算法,或最近未用算法(NRU)

簡單的CLOCK算法實現方法:爲每個頁面設置一個訪問位,再將內存中的頁面都通過鏈接指針鏈接成一個循環隊列。

當某頁被訪問的時候,其訪問位置爲1,當需要淘汰一個頁面的時候,只需要檢查頁的訪問位置,如果是0,就該懸着該頁換出,如果爲1,則將它置換爲0,暫不換出。

在這裏插入圖片描述

5、改進型的時鐘置換算法(優先淘汰沒有被修改過的頁面,因爲不需要寫回外存)

簡單的時鐘置換算法僅僅考慮一個頁面最近是否被訪問過,事實上,如果被淘汰的頁面沒有被修改過,就不需要IO操作協會外存,只有被淘汰的頁面被修改過的時候,才需要寫回外存。

避免IO操作,這就是改進型時鐘置換算法的思想,修改爲=0,表示頁面沒有被修改過,修改位=1,表示頁面被修改過

爲方便討論,用(訪問位,修改位)的形式表示各頁面狀態,如(1,1)表示一個頁面近期被訪問過,且被修改過。

在這裏插入圖片描述

頁面分配策略

駐留集:指的是請求分頁存儲管理中給進程分配的物理塊的集合。

駐留集太小,導致缺頁頻繁。駐留集太大會導致多道程序的併發度下降,資源利用率降低,所以應該選擇一個合適的駐留集大小。

駐留集大小的分配

  • 1、固定分配
    操作系統爲每個進程分配一組固定數目的物理塊,在進程運行期間不再改變,即駐留集大小不變。
  • 2、可變分配
    先爲每個進程分配一定數目的物理塊,在進程運行期間,可根據情況做適當的增加或者減少,即駐留級大小可變。

置換範圍:

  • 局部置換:
    發生缺頁的時候只能選擇進程自己的物理塊進行置換
  • 全局置換
    可以將操作系統保留的空閒物理塊分配給缺頁進程,也可以爲別的進程持有的物理塊置換到外存,再分配給缺頁進程。

在這裏插入圖片描述

1、固定分配局部置換

系統爲每個進程分配一定數量的物理塊,在整個運行期間都不改變,若進程在運行中發生了缺頁,則只能從該進程在內存中的頁面中選出一頁換出,然後再調入需要的頁面,這種策略的缺點是:很難在一開始就確定應該爲進程分配多少個物理塊纔算合理。

2、可變分配全局置換

開始會爲每個進程分配一定數量的物理塊,操作系統會保持一個空閒物理塊隊列,當某進程發生缺頁的時候,從空閒塊中找出一塊分配給該進程。如果無空閒物理塊,可選擇一個未鎖定的頁面換出,再將該物理塊分配給缺頁進程。採用這種策略的時候,只要某進程發生了缺頁,都將獲得新的物理塊,僅當空閒物理塊用完的時候,系統才選擇一個未鎖定的頁面調出,被選擇調出的頁面可能是系統中任何一個進程的頁,因此這個被選中的進程擁有的物理塊會減少,缺頁率會增加

3、可變分配局部置換

剛開始爲每個進程分配一定數量的物理塊,當某進程發生缺頁的時候,只允許從該進程自己的物理塊中選出一個進行換出外存,如果進程在運行中頻繁的發生缺頁,系統會爲該進程多分配幾個物理塊,直到該進程缺頁率適當,反之,如果進程在運行中缺頁率特別的低,則可以適當減少分配給該進程的物理塊。

可變分配全局置換:只要缺頁就給分配新物理塊
可變分配局部置換:要根據缺頁的頻率動態增加或減少進程的物理塊。

在這裏插入圖片描述

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