【操作系統】記憶體分配

来源:https://www.cnblogs.com/freeyw/archive/2022/07/29/16531031.html
-Advertisement-
Play Games

寫在前面 本系列的文章是博主邊學邊記錄的,可能不是特別的正確,因為會加上博主自己的理解,僅供參考。 正文: 為了能夠將用戶程式裝入記憶體,必須為它分配一定大小的記憶體空間。常見的分配方式有: 1.連續分配 連續分配方式是最早出現的一種存儲器分配方式,該分配方式為一個用戶程式分配一個連續的記憶體空間。常見的 ...


寫在前面

  本系列的文章是博主邊學邊記錄的,可能不是特別的正確,因為會加上博主自己的理解,僅供參考。

 

正文:

  為了能夠將用戶程式裝入記憶體,必須為它分配一定大小的記憶體空間。常見的分配方式有:

1.連續分配

  連續分配方式是最早出現的一種存儲器分配方式,該分配方式為一個用戶程式分配一個連續的記憶體空間。常見的連續分配方式有:

  1.單一連續分配

  單一連續分配適合早期的單道批操作系統,在用戶區中,僅裝入一道用戶程式。整個記憶體的用戶空間由該程式獨占。這樣的存儲器分配方式稱為單一連續分配。

  2.固定分區分配

  在多道程式系統中,為了在記憶體中裝土多道程式,且這些程式之間又不會發生相互干擾,於是將整個用戶空間劃分成若幹隔固定大小的區域。每個分區中只裝入一道作業。這樣形成了最早、也是最簡單的一種可運行多道程式的分區式存儲管理方式。

劃分分區的方法:

  1.將用戶空間劃分成若幹個固定大小的分區

    這種分配方式缺乏靈活性。但是對於利用一臺電腦同時控制多個相同大小對象的場合,這種劃分方式比較方便和使用。

  2.將用戶空間劃分成若幹個大小不定的分區

    這種分配方式靈活性較高,通常式根據用戶的需求來進行劃分。為不同大小的進程分配不同的記憶體空間。

  分區表:

  為了便於記憶體的管理,通常將記憶體按照其大小進行排隊,併為之建立一張分區使用表。

  分區表包括每個分區的起始地址,大小、狀態等。

 

 

 

  3.動態分區分配

  為了實現動態分區分配,系統配置了相應的一些數據機構。用以描述空閑分區和已分配分區的情況。常見的數據結構有:

  1.空閑分區表

  在系統中設置一張空閑分區表,用戶記錄每個空閑分區的情況。包括分區號、大小、起始地址等。

  2.空閑分區鏈

  以鏈表形式組織空閑分區。

  3.動態分區分配演算法

  為了實現動態分配呢,通常將系統中的空閑分區鏈接成一個鏈。下麵介紹下基於順序搜索的動態分區分配演算法:

  所謂順序搜索,是指依次搜索空閑分區鏈上的空閑分區,去尋找一個其大小能夠滿足要求的分區。常見的演算法有:

  1.首次適應演算法 FF

  特點:

  空閑分區鏈以地址遞增的次序鏈接。

  流程:

  每次都從鏈首開始順序查找,直至找到一個大小能滿足要求的空閑分區為止。然後進行切割分配。

  優點:

  該演算法優先利用記憶體中低地址的部分的空閑分區,從而保留了高地址部分的大空閑區。為大作業分分配大的記憶體空間創建了條件。

  缺點:

  1.每次查找都從頭部開始,會增加查找可用空閑分區的開銷

  2.低地址部分不斷被劃分,會留下很多難以利用的小空間,也就是外部碎片。浪費記憶體空間。

 

  2.迴圈首次適應演算法 NF

  區別於首次適應演算法,NF不再是每次都從鏈首開始查找,而是從上次找到的空閑分區的下一個空閑分區開始查找,直至找到一個能滿足要求的空閑分區。

  3.最佳適應演算法 BF

  最佳適應演算法,每次分配空間的時候,總是把能滿足要求、又是最小的空閑分區分配給作業。避免"大材小用"

  同樣也是從遞增的方式形成空閑鏈表。每次分配完記憶體後,要進行及時的調整,保證鏈表的遞增性。

  該種分配方式,也同樣有可能造成碎片化。

  4.最壞適應演算法 WF

  以遞減的方式形成空閑鏈表,分配作業的時候,總是挑選一個最大的空閑分區,從中分割一部分存儲空間給作業使用。

  缺點:

  導致存儲器中缺乏大的空閑分區,所以稱為最壞適應演算法。

 

  提一個問題,BF和WF真的就是最好或者最壞的嗎?

  其實不然,BF看似每次分配的都是最佳的方式,但是每次分配後所切割下來的剩餘部分總是最小的。這樣會形成大量的碎片

  而WF,由於每次都是從大空間中切分出去要分配的空閑,可使剩下的空閑分區不至於太小,產生碎片的可能性小。對中、小型作業有利。WF查找效率也很高,查找的時候只需要看第一個分區能否滿足作業要求即可。

  可見,沒有最好和最壞一說,各有所長,也各有所短。

 

  4.動態可重定位分區分配

   首先在這裡面涉及一個"緊湊"的概念,就是將記憶體中不相鄰的作業移動,使得之間間距的空間碎片聚集到一起,形成一個空用的空間。看下圖應該就懂了.......

 

  可以看到後,緊湊後,空間得以重新利用。但是程式的地址也發生了改變。所以在每次緊湊後,都必須對移動的程式和數據進行重定位。但是這樣做,很是麻煩。於是引入了動態重定位:

  為了使得地址的轉換為不會影響到指令的執行速度,必須有硬體地址變換機構的支持。於是引入一個重定位寄存器。用它來存放程式在記憶體中起始地址。

 

 

  2.離散分配

  上面我們瞭解了連續分配會形成許多碎片,雖然可以通過緊湊方法將許多碎片拼接成可用的大塊空間,但是必須付出很大的開銷。如果允許將一個進程直接分散的裝入去多不相鄰接分區中,便可以充分的利用記憶體空間。而無須再進行緊湊。

  基於這一思想,產生了離散分配方式,根據離散分配時所分配地址空間的基本單位的不同,又可以將離散分配分為以下三種:

  1.分頁存儲管理方式

  分頁存儲管理方式,個人理解的是將用戶程式的離散的存入到不同的物理塊中,但是為了找到這些程式的地址,需要用一個數據結構來記錄。這個數據結構就是頁。當然一般情況下將頁組織起來,形成該程式的頁表。從而讓系統得知該程式分配在記憶體中的哪些物理塊中。

  補充一下分頁涉及的概念:

  1.頁面。分頁存儲管理將進程的邏輯地址空間分成若幹個頁,併為各頁加以編號。同時也將記憶體的物理地址空間分成若幹個塊。

  一頁對應一個塊。在進行分配記憶體的時候,以塊為單位,將進程中的若幹頁分別裝入到多個可以不相鄰的物理塊中。

  2.頁面大小:顧名思義,但是頁面大小要適中選擇,不能過大也不能過小。

  3.地址結構

  分頁地址中的地址結構:

  

 

 

  4.頁表

 

    為了保證進程能夠在記憶體中找到每個頁面所對應的物理塊,系統為每個進程建立了一張頁面映像表。簡稱為頁表。

 

  

 

 

   TLB(Translation Look aside Buffer) /快表:

  頁表是存放在記憶體中的,cpu每次存取一個數據的時候,都要訪問兩次記憶體。第一是訪問頁表,從中找到指定頁的物理塊號,形成物理地址。第二次是訪問該物理地址,並寫入或者取出數據。可見效率是比較低的。

  為了提高地址的變換速度,可以設置一個緩衝寄存器,也就是TLB。用來存放之前訪問的那些頁表項。再進行查找的時候,可以先查找TLB。如果命中,可直接讀出改頁對應的物理塊號,並寫入物理地址寄存器中。

  沒有命中的化,還是需要再次訪問頁表。後期把本次頁表項存入快表中。從而提高訪問的速度。

 

 

 

 

 

 

  2.分段存儲管理方式

  分段存儲管理方式主要是為了滿足用戶在編程和使用上多方面的要求。像主程式段、子程式段、數據段、堆棧段等等。因此分段存儲大小並不固定,因為每個段的大小並不是固定的。

  分段地址的結構:

  

 

 

   段表:和頁表的作用是一樣的,方便程式定址。看一下段表的組成:

    

 

 

  當採用分段的方式分配空間的時候,需要先比較分區的大小也就是段長是否合適,否則是不能夠分配的。

3.段頁式存儲管理方式

  分頁系統以頁面作為記憶體分配的基本單位,能夠有效的提高記憶體利用率。分段系統以段作為記憶體分配的基本單位,能夠更好地滿足用戶多方面地需求。所以,我們可以對這兩種存儲管理方式各取所長,則可形成一種新的存儲管理方式,也就是段頁式存儲管理方式。

分段和分頁是有很大區別的,下麵具體來看下它們的區別吧!!

  

 

 

 

 

 總結下分段和分頁的區別

  1.分頁是系統管理上的需要,完全是系統來進行管理的,對於用戶是不可見的。分段目的主要是更好地滿足用戶地需求。是信息邏輯上地單位。

  2.頁得大小固定且有系統進行決定。這裡指的是物理塊或者說頁面大小是固定的。但是分段則不是,每段的長度取決於用戶所編寫的程式。

  3.分頁的用戶程式地址空間是一維的。分段是二維的,因為程式員在編程的時候需要給出段名和段內地址

 

  以上就是本文的所有內容了,我們下篇再見

 

不驕不躁,保持學習

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一 創建對象時考慮實現比較器 假設有這樣的場景,有一個40個人的學生列表,業務中需針對學生的成績來進行排序。 可以考慮用IComparable介面和ICompare介面實現: class Program { static void Main(string[] args) { var stus = n ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 前言 由於CentOS7 2024年即將停止維護,我準備將伺服器重心從CentOS改為Rocky Linux,這篇文章分享一下Rocky Linux的安裝和優化,當然作為伺服器,肯定要安裝沒有桌面的伺服器版本。 本文用到的Rocky Linux的 ...
  • Disk Graph for Mac是一款非常值得推薦的mac磁碟空間分析、清理、釋放磁碟控制項的軟體。disk graph mac可以將磁碟可視化為響應式餅圖,並幫助您輕鬆找到占用磁碟空間的文件,輕鬆定位大文件! 詳情:Disk Graph for Mac(強大的磁碟空間分析工具) 功能介紹 可以選 ...
  • 如何對Linux進行擴容: 1、在VM上添加硬碟 2、使用lsblk,查看新增的磁碟 3、使用fdisk /dev/sdd,對新增磁碟sdd進行磁碟分區 依次輸入,n,p,w 4、查看新創建出來的分區 lsblk 5、對新創建出來的分區,創建PV,pvcreate /dev/sdd1 6、使用 pv ...
  • Linux系統基礎(一) Linux的基本原則: 由目的單一的小程式組成,組合小程式完成複雜任務; 一切皆文件; 配置文件保存為純文本格式。 1、shell 1.1 shell簡介 Shell俗稱殼(用來區別於核),是指“為使用者提供操作界面”的軟體(命令解析器)。它類似於DOS下的command. ...
  • 1、文件目錄結構 /:是Linux系統的根目錄 /bin:存放用戶經常使用的命令 /boot:啟動載入程式的靜態文件 /dev:設備文件目錄,不能單獨分區 /etc:系統配置文件目錄 /home:普通用戶的家目錄 /root:系統管理員的家目錄 /run:進程的運行數據存放的目錄 /sbin:存放系 ...
  • Logic Pro X Mac版是一款專業音頻製作軟體,作為Mac上功能完備的專業錄音室,Logic Pro X為音樂人提供了從創作第一個音符到完成最後的母帶所需的一切。它為您帶來的軟體樂器與音頻處理插件足以讓您製作任何風格的音樂! 詳情:Logic Pro X for Mac(專業級音頻製作軟體) ...
  • MDK ARM 5.28 之後包括 5.37 的版本. 這些版本即使勾選 Reset And Run, 在燒錄後也不會自動重啟執行 需要做以下設置 Debug -> ST-Link Debugger -> Settings 切換到 Pack 標簽頁, 取消勾選 Enable 點擊 OK 保存. 不能... ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...