【操作系統】記憶體分配

来源: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
  • Github / Gitee QQ群(1群) : 813100564 / QQ群(2群) : 579033769 視頻教學 介紹 MiniWord .NET Word模板引擎,藉由Word模板和數據簡單、快速生成文件。 Getting Started 安裝 nuget link : https:// ...
  • Array.Sort Array類中相當實用的我認為是Sort方法,相比起冗長的冒泡排序,它的出現讓排序更加的簡化 結果如下: 還可以聲明一個靜態方法用來專門調用指定數組排序,從名為 array 的一維數組中 a 索引處開始,到 b 元素 從小到大排序。 註意: a + b 不能大於 array 的 ...
  • 前言 在上一篇文章CLR類型系統概述里提到,當運行時掛起時, 垃圾回收會執行堆棧遍歷器(stack walker)去拿到堆棧上值類型的大小和堆棧根。這裡我們來翻譯BotR里一篇專門介紹Stackwalking的文章,希望能加深理解。 順便說一句,StackWalker在中文里似乎還沒有統一的翻譯,J ...
  • 使用過 nginx 的小伙伴應該都知道,這個中間件是可以設置跨域的,作為今天的主角,同樣的 反向代理中間件的 YARP 毫無意外也支持了跨域請求設置。 有些小伙伴可能會問了,怎樣才算是跨域呢? 在 HTML 中,一些標簽,例如 img、a 等,還有我們非常熟悉的 Ajax,都是可以指向非本站的資源的 ...
  • 什麼是Git Git 是一個開源的分散式版本控制系統,用於敏捷高效地處理任何或小或大的項目。 Git 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟體。 Git 與常用的版本控制工具 CVS, Subversion 等不同,它採用了分散式版本庫的 ...
  • 首先CR3是什麼,CR3是一個寄存器,該寄存器內保存有頁目錄表物理地址(PDBR地址),其實CR3內部存放的就是頁目錄表的記憶體基地址,運用CR3切換可實現對特定進程記憶體地址的強制讀寫操作,此類讀寫屬於有痕讀寫,多數驅動保護都會將這個地址改為無效,此時CR3讀寫就失效了,當然如果能找到CR3的正確地址... ...
  • 說明 onlyoffice為一款開源的office線上編輯組件,提供word/excel/ppt編輯保存操作 以下操作均基於centos8系統,officeonly鏡像版本7.1.2.23 鏡像下載地址:https://yunpan.360.cn/surl_y87CKKcPdY4 (提取碼:1f92 ...
  • 二叉樹查找指定的節點 前序查找的思路 1.先判斷當前節點的no是否等於要查找的 2.如果是相等,則返回當前節點 3.如果不等,則判斷當前節點的左子節點是否為空,如果不為空,則遞歸前序查找 4.如果左遞歸前序查找,找到節點,則返回,否繼續判斷,當前的節點的右子節點是否為空,如果不為空,則繼續向右遞歸前 ...
  • ##Invalid bound statement (not found)出現原因和解決方法 ###前言: 想必各位小伙伴在碼路上經常會碰到奇奇怪怪的事情,比如出現Invalid bound statement (not found),那今天我就來分析以下出現此問題的原因。 其實出現這個問題實質就是 ...
  • ###一、背景知識 爬蟲的本質就是一個socket客戶端與服務端的通信過程,如果我們有多個url待爬取,只用一個線程且採用串列的方式執行,那隻能等待爬取一個結束後才能繼續下一個,效率會非常低。 需要強調的是:對於單線程下串列N個任務,並不完全等同於低效,如果這N個任務都是純計算的任務,那麼該線程對c ...