【操作系統】記憶體分配

来源: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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...