操作系統入門(四)存儲器管理

在這裏插入圖片描述

一學期的可也算是基本上完了,不知道大家學的怎樣。
應朋友之約,我來總結一下這學期學的操作系統課程,方便大家複習。
總綱:https://blog.csdn.net/qq_43762191/article/details/106411766 (帶思維導圖)

概述

存儲體系

-計算機系統中存儲器一般分爲內存儲器和輔助存儲器兩級
-內存可以分成系統區和用戶區兩部分,系統區用來存儲操作系統等系統軟件,用戶區用於分配給用戶作業使用

存儲管理目的

爲用戶提供方便、安全和充分大的存儲空間.

存儲管理的任務

地址轉換

邏輯地址
物理地址

內存的分配和回收

當用戶作業要裝入內存時,需向操作系統提出申請,操作系統按一定策略分配存儲空間,若某作業執行完畢,需歸還內存空間時。

內存儲器的地址保護

爲避免內存中若干道程序相互干擾,尤其是爲了防止用戶程序侵犯系統程序所在的內存區域,必須對內存採取保護措施 ,內存儲器的地址保護功能一般由硬件和軟件配合實現。

內存儲器的共享

爲提高內存利用率,需要進行內存空間的共享,包括兩方面的含義:
-共享內存儲器資源
-共享內存儲器的某些區域

內存儲器的擴充

內存儲器的擴充不是硬件設備上的擴充,而是用虛擬技術來實現的邏輯上的擴充,即虛擬存儲概念

程序的鏈接和裝入

程序的鏈接

靜態鏈接方式

在程序運行以前,將各個目標模塊及它們所需要的庫函數,鏈接成一個完整的裝入模塊,又可稱爲可執行文件,通常不再拆開。

裝入時動態鏈接

用戶源程序經編譯後所得的目標模塊,在裝入內存時,邊裝入邊鏈接,即在裝入一個目標模塊時,如果發生一個外部模塊調用事件,將引起裝入程序去找出相應的外部目標模塊,並將它裝入內存,進行鏈接。
優點:①便於修改和更新。②便於實現對目標模塊的共享。

運行時動態鏈接

這種鏈接方式是將對某些模塊的鏈接推遲到執行時才進行。在執行過程中,當發現一個被調用模塊尚未調入內存時,立即由操作系統去找到該模塊並裝入內存,再把它鏈接到調用者模塊上。

程序的裝入

絕對裝入方式

邏輯地址轉換成物理地址的過程發生在程序編譯或彙編時

可重定位裝入方式(靜態重定位)

邏輯地址轉換成物理地址的過程發生在程序裝入到內存時進行。

動態運行時裝入方式(動態重定位)

邏輯地址轉換成物理地址的過程推遲到程序真正執行時。

各種存儲管理方式

在這裏插入圖片描述

單一連續分配

基本思想:
內存的用戶區一次只分配給一個用戶程序使用
存儲保護機制:
基址寄存器和界限地址寄存器
特點:
這種管理方式的分配、去配算法非常簡單,內存的利用率很低

分區分配

分區分配的存儲管理是爲了適應多道程序設計技術而產生的最簡單的管理方式

固定分區

  • 基本思想
    系統預先把內存中的用戶區分成若干個連續的區域,每個區域稱爲一個“分區”。程序裝入時,根據它對內存大小的需求量,系統將按照一定的策略,把能滿足它要求的一個分區分配給該程序

  • 分配和回收
    固定分區分配表,內容包括分區號、起始地址、長度、佔用標誌等.

存儲保護機制

上、下限寄存器或基址、長度寄存器

優點

-優點:簡單易行,適用於專用系統
-缺點:內存利用不充分,作業的大小受到分區大小的限制

可變分區

系統並不預先劃分內存區間,而是在程序裝入時根據程序的實際需要動態地劃分內存空間。若無空閒的存儲空間或無足夠大的空閒存儲空間供分配時,則令該程序等待。
常用的數據結構有已分分區表和空閒分區表或空閒分區鏈表 。

分區分配算法

首次適應算法

要求空閒分區鏈以地址遞增的次序鏈接,在進行內存分配時,從鏈首開始順序查找,直至找到一個能滿足其大小要求的空閒分區爲止

循環首次適應算法

在爲程序分配內存空間時,不再每次從鏈首開始查找,而是從上次找到的空閒分區的下一個空閒分區開始查找。直至找到第一個能滿足要求的空閒分區

最佳適應算法

把既能滿足要求、又是最小的空閒分區分配給程序

最差適應算法

每次爲程序分配內存時,總是找到一個滿足程序長度要求的最大空閒分區進行分配

內存分區回收操作

當進程運行完畢釋放內存時,系統根據回收區的首址,從空閒分區表(鏈)中找到相應的插入點,進行回收,此時可能出現以下四種情況:

  -回收區與插入點的前一個分區相鄰接,兩分區合併 
  -回收區與插入點的後一個分區相鄰接 ,兩分區合併
  -回收區同時與插入點的前、後兩個分區鄰接 ,三分區合併
  -回收區與插入點前、後兩個分區都不相鄰 ,單獨一個分區

內存回收算法

假定進程歸還的分區起始地址爲S,長度爲L,則:
① 歸還區有下鄰空閒區
如果S+L正好等於空閒區表中某個登記欄目(假定爲第j欄)的起始地址,則表明歸還區有一個下鄰空閒區。這時只要修改第j欄登記項的內容:
起始地址=S;
第j欄長度=第j欄長度+L;

② 歸還區有上鄰空閒區
如果空閒區表中某個登記欄目(假定爲第k欄)的“起始地址+長度”正好等於S,則表明歸還區有一個上鄰空閒區。這時要修改第k欄登記項的內容(起始地址不變):
第k欄長度=第k欄長度+L;

③ 歸還區既有上鄰空閒區又有下鄰空閒區
如果S+L正好等於空閒區表中某個登記欄目(假定爲第j欄)的起始地址,同時還有某個登記欄目(假定爲第k欄)的“起始地址+長度”正好等於S,這表明歸還區既有一個上鄰空閒區又有一個下鄰空閒區。此時對空閒區表的修改如下:
第k欄長度=第k欄長度+第j欄長度+L;(第k欄起始地址不變)
第j欄狀態=“空”;(將第j欄登記項刪除)

④ 歸還區既無上鄰空閒區又無下鄰空閒區
如果在檢查空閒區表時,無上述三種情況出現,則表明歸還區既無上鄰空閒區又無下鄰空閒區。這時,應該在空閒區表中查找一個狀態爲“空”的欄目(假定查到的是第t欄),則第t欄的內容修改如下:
第t欄起始地址=S;
第t欄長度=L;
第t欄狀態=“未分配”

可變分區分配的優缺點

優點:有助於多道程序設計,提高了內存的利用率

要求硬件支持少,代價低
管理算法簡單,實現容易

缺點:必須給作業分配一連續的內存區域

碎片問題嚴重,內存仍不能得到充分利用
不能實現對內存的擴充

覆蓋技術

所謂覆蓋,是指同一內存區可以被不同的程序段重複使用。

-可以相互覆蓋的程序段叫做覆蓋
-可共享的內存區叫做覆蓋區
-把程序執行時並不要求同時裝入內存的覆蓋組成一組,叫覆蓋段,並分配同一個內存區

交換技術

所謂交換,就是系統根據需要把內存中暫時不運行的某個(或某些)作業部分或全部移到外存,而把外存中的某個(或某些)作業移到相應的內存區,並使其投入運行

分頁存儲管理方式

將程序的邏輯地址空間和存儲空間按相同長度爲單位進行等劃分。把每個程序邏輯空間分成一些大小相同的片段,叫做頁面或頁。把內存的存儲空間也分成大小與頁面相同的片段,叫做物理塊或頁框。分配的物理塊可以連續也可以不連續。

在這裏插入圖片描述

頁表

頁表的作用是實現從頁號到物理塊號的映射
系統在內存空間設置一片區域作爲頁表區,系統爲每個進程提供一個頁表。進程頁表的起始地址存放在進程PCB中。

存取控制

在頁表的表項中設置一存取控制字段,用於對該存儲塊中的內容進行保護。

在這裏插入圖片描述

地址變換

地址變換即通過地址變換機構把邏輯地址變換成相應的物理地址,實際上是將邏輯地址中的頁號,轉
換爲內存中的物理塊號。因爲頁表的作用就是用於實現頁號到物理塊號的變換,因此,地址變換任務是藉助於頁表來完成的
除此以外,系統設置了一個頁表寄存器PTR其中存放頁表在內存的始址和頁表的長度

動態地址變換

邏輯地址可以分解成:頁號、頁內位移量(頁內地址)
物理地址可以分解成:物理塊號、物理塊內位移(物理塊內地址)
 p=邏輯地址/頁面大小      d=邏輯地址-p×頁面大小
p=邏輯地址/頁面大小 d=邏輯地址-p×頁面大小

地址變換過程

⑴ 根據邏輯地址計算出頁號p和頁內地址d,
p=邏輯地址/頁面大小 d=邏輯地址%頁面大小
⑵ 根據頁號p查頁表,得到對應塊號f
⑶ 塊內地址和頁內地址相同,計算物理地址
物理地址=f×塊大小+d
(塊大小等於頁大小)

 若頁面大小爲2的冪,則頁號和頁內地址可以直接取高位和地位部分獲得,物理地址可以用塊號和塊內地址拼接而成

分頁系統中的地址變換機構

在這裏插入圖片描述

快表

由於頁表存儲在內存中,所以當要按照給定的邏輯地址進行讀/寫時,需要兩次訪問內存:
第一次是根據頁號訪問頁表,讀出頁表相應欄中的塊號以便形成物理地址;
第二次是根據物理地址進行讀/寫操作。
這樣比通常執行指令的速度慢一倍。爲了提高存取速度,在地址變換機構中增設了一個具有並行查尋能力的特殊高速緩衝存儲器,又稱爲“聯想存儲器”或“快表”

利用快表的地址變換機構

在這裏插入圖片描述

兩級和多級頁表

現代的大多數計算機系統都支持非常大的邏輯地址空間,此時,頁表就變得非常大,要爲它分配一大段連續的內存空間將變得十分困難

解決辦法:
①採用離散分配方式來解決難以找到一塊連續的內存空間問題; 
②只將當前需要的部分頁表項調入內存,其餘的頁表項仍駐留在磁盤上,需要時再調入。

分段存儲管理

基本思想

 每個程序的地址空間按照自身的邏輯關係劃分成若干段(比如主程序段、子程序段、數據段、堆棧段等)每個段都有自己的名字,通常可用一個段號來代替段名,每個段都從0開始獨立編址,段內地址連續。段的長度由相應的邏輯信息組的長度決定,因而各段的長度不等。分配內存時,爲每個段分配一連續的存儲空間,段間地址空間可以不連續

段表

段表實現了從邏輯段到物理內存區的映射.系統爲每個進程建立了一張段映射表,簡稱“段表”。進程的每個段在段表中佔有一個表項,在其中記錄了該段在內存中的起始地址(基址)和段的長度

段與頁的差別

基本思想
每個程序的地址空間按照自身的邏輯關係劃分成若干段(比如主程序段、子程序段、數據段、堆棧段等)每個段都有自己的名字,通常可用一個段號來代替段名,每個段都從0開始獨立編址,段內地址連續。段的長度由相應的邏輯信息組的長度決定,因而各段的長度不等。分配內存時,爲每個段分配一連續的存儲空間,段間地址空間可以不連續
段表
段表實現了從邏輯段到物理內存區的映射.系統爲每個進程建立了一張段映射表,簡稱“段表”。進程的每個段在段表中佔有一個表項,在其中記錄了該段在內存中的起始地址(基址)和段的長度

段頁式

內存分成大小相同的塊,每個程序地址空間按照邏輯關係分成若干段,併爲每個段賦予一個段名,每段可以獨立從0編址,每段按內存塊大小分成頁,每段分配與其頁數相同的內存塊,內存塊可以連續也可以不連續。系統爲每段建立頁表記錄每頁對應的塊,同時還爲該程序建立段表記錄每段對應的頁表

在這裏插入圖片描述

地址變換

在這裏插入圖片描述

爲了實現地址變換,配置一段表寄存器,在該寄存器中存放段表的始址和段長

在這裏插入圖片描述在段頁式存儲管理方式中,執行一條指令需要三次訪問內存。第一次訪問段表,從中得到頁表的位置,第二次訪問頁表,得出該頁所對應的物理塊號,第三次按照得到的物理地址訪問內存
-爲了提高地址變換速度,同樣可以和分頁存儲管理方式和分段存儲管理方式一樣,設置一高速緩寄存器,利用段號和頁號去檢索該寄存器,得到相應的物理塊號

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