系統記憶體管理簡介

来源:https://www.cnblogs.com/Franken-Fran/archive/2019/04/04/memory_manage.html
-Advertisement-
Play Games

系統記憶體管理簡介 <! TOC "系統記憶體管理簡介" "常見的名詞解釋" "單塊記憶體管理法" "分區管理法" "頁式管理法" "幀與頁" "小結" <! /TOC 系統以 字 為單位,將記憶體劃分為一個個存儲單位,每個存儲單位都有一個地址。指向地址的指針以字的大小為單位移動。目前常見的字單位為32位( ...


系統記憶體管理簡介

系統以為單位,將記憶體劃分為一個個存儲單位,每個存儲單位都有一個地址。指向地址的指針以字的大小為單位移動。目前常見的字單位為32位(4byte)或者64位(8byte)。

常見的名詞解釋

  • 邏輯地址(logical address):僅對程式可見,從0開始計量
  • 真實地址(physical addr):系統對記憶體的真實地址編號
  • 地址聯編(addr binding):將邏輯地址映射到真實地址

就地址聯編這一塊,不同的記憶體管理方式聯編的方式也不同。邏輯與物理兩套地址的規劃,使得記憶體管理有極大的自由。程式編譯階段,使用地址就是邏輯地址,當機器碼loading進系統開始運行的時候,系統才開始地址聯編。這使得程式中地址表示是一致的,具體真實占用哪些地址,到地址聯編的決定。

單塊記憶體管理法

想象這樣一種理想狀況,系統中除了操作系統(OS)只有一個APP。那麼除了OS占用部分記憶體,剩下的都是APP進程的記憶體。

單塊記憶體管理

圖1 單塊記憶體管理法

我們使用兩套地址管理,邏輯地址和物理地址。物理地址面向程式,從0開始計數,物理地址描述記憶體的實際地址規劃。

圖1中表示的是邏輯地址+基本地址=物理地址。基本地址A加上邏輯地址L,得到真實地址。

分區管理法

單塊記憶體管理中只允許單個APP運行,實際上記憶體可以容納多個APP同時運行。這時候的做法是將記憶體分為多個區,除了OS外,每一個APP占用一個連續、獨立的分區。

分區方式有:

  • 固定分區:引導OS初期就固定分好區間,以後不再變
  • 動態分區:根據需求動態分配區間,區間可以在記憶體中移動

無論單塊記憶體,還是分區記憶體,同樣遵循邏輯地址和真實地址兩套管理法。每個分區都有自己的一套邏輯地址,用於內部交流,但最終和系統交互的時候,都需要採用物理地址。即聯編方式,分區管理中地址信息存儲在寄存器中。基址寄存器存儲分區當前分區的起始位置,界限寄存器存儲分區的長度。當前進程的請求地址不可以超過分區長度。

分區管理

圖2 分區記憶體管理

那麼分區的大小如何決定,這取決於匹配進程的方式。總共有三種方式:

  • 最先匹配:驗證當前記憶體往下走,第一個符合進程需求的大小分配分區
  • 最佳匹配:尋找可用容器中最小的分區
  • 最差匹配:尋找最大的符合進城需求的分區

前兩者適用於固定分區,便於節省記憶體。

最後一個符合動態分區,動態分配要求儘量滿足當前需求,後期再進行調整。連續的小空分區,可以合併成一個大的空分區。並且作業也可以在記憶體中移動,以空出更大的空間,成為壓縮

最後,無論是固定分區還是動態分區,整個進程必須同時載入記憶體中,一個分區必須能夠容納整個APP。這也就可以看出頁式記憶體管理的優越性,他引出了虛擬記憶體的的概念。

頁式管理法

頁式管理同樣遵循邏輯地址和物理地址的概念,但是這裡啟用兩個新的概念,面向物理地址,面向進程地址。

頁式管理中,將進程(Process)以頁為單位分割,同時將記憶體劃分為一個個幀。頁和幀可以大小不同,為了方便起見,這裡將其視為相同。

總結下來,幀描述記憶體,頁描述進程。記憶體載入進程的方式是通過幀載入頁

程式面向的是頁地址,這時地址聯編需要找的是幀,這就需要一本字典,即PMT(page map table)。每一個進程都需要維護一張PMT,表中記錄每一個對應的

記憶體PMT設置

圖3 頁式記憶體管理法

這樣的規劃管理上增加了複雜度,但是好處也是巨大的。

無論是單塊記憶體管理還是分區管理,都需要整塊連續的記憶體用來存儲進程,相比頁式管理記憶體的利用率則相差太多。分區管理中,如果找不到能夠容納整個進程的連續地址,則無法載入進程。頁式管理中,記憶體和頁都是一塊塊的,他們分散在各處,無需專門開闢一塊連續的空間,記憶體可以見縫插針為頁分配可用的頁。

同時,分頁記憶體管理的方式也引入了請求分頁虛擬記憶體的概念。請求分頁意思是,由於CPU同一時刻只需要進程的部分數據,因此就不必將整個進程都載入進記憶體。當某些頁面被需要的時候,系統先訪問記憶體,如果該頁面不存在,則訪問二級存儲將信息載入進記憶體,與此同時,新的頁面加入使得原有的頁面退出該幀的使用,該過程稱為頁面交換

請求分頁的引入使得有時候,記憶體好像無限大一樣,記憶體載入的進程的總大小遠遠大於記憶體大小,這種現象稱為虛擬記憶體

頁面交互大大提高了記憶體的利用率,但是當頁面頻繁交換的時候,交換過程占用過多的時間,使得進程顯得不穩定,表現為使用不斷地卡頓,這個現象稱為系統顛簸

幀與頁

幀就是大小固定的記憶體塊,比如為1024。頁就是進程地址,表示為一個坐標<頁位置,偏移量>。系統中(邏輯地址/1024)的商為頁面位置,餘數為偏移量。因此,頁坐標不得大於幀大小。根據頁坐標和PMT就可找到物理地址(幀地址)。這就形成了從邏輯地址到物理地址的閉環。(僅憑記憶回顧,存疑

小結

最後總結一下頁式管理法。一個APP載入系統,在系統表現為進程,一個或者多個。系統為每一個進程分配記憶體,將Process分割成,將記憶體分割成。之後,根據情況為分配,同時給每一個進程維護一張PMT用於地址聯編。

參考


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

-Advertisement-
Play Games
更多相關文章
  • 對於學習python的人都有這樣的困惑 def foo(a=[]): a.append(5) return a Python新手希望這個函數總是返回一個只包含一個元素的列表:[5]。結果卻非常不同,而且非常驚人(對於新手來說): >>> foo() [5] >>> foo() [5, 5] >>> ...
  • 昨日內容補充: 1.字元串:'中國' 'Hello' 字元:中是一個字元,e是一個字元 位元組:中是3個位元組,e是1個位元組 位:01010101是8位,其中0或1分別是1位 unicode用於記憶體計算 utf-8用於網路傳輸、數據存儲 2.if的嵌套 如10086客服電話的例子: 3.pycharm ...
  • TCP連接 TCP是電腦網路中運輸層協議,是應用層協議http協議的支撐協議。兩台遠程主機之間可以通過TCP/UDP協議進行通信並交換信息,前提是,相互通信的兩台主機之間必須知道彼此的IP地址和埠號。 NodeMCU作為TCP客戶端實現區域網內點亮Led燈(通過路由器中轉) NodeMCU可以被 ...
  • 文章來源:centos7 Docker私有倉庫搭建及刪除鏡像 如果不想用私有鏡像庫,你可以用docker的庫 https://hub.docker.com 環境準備 環境:兩個裝有Docker 17.09.0-ce 的centos7虛擬機 虛擬機一:192.168.0.154 用戶開發機 虛擬機二: ...
  • 1. 第二個start.S 從 開始,在 中有包含 在config.h中: 在 中: 在 中,看到了 的巨集 查看u boot.map在這裡又來到了上一層的start.S中來,所以可以知道這兩個是由兩個文件組成的,一個是u boot.bin和reg_info.bin,就是說兩個不同的start.S的流 ...
  • 樹莓派中QT實現I2C 在QT中實現 I2C 使用的驅動為 wiringPi 庫的引入 代碼實現 widget.h 中 記得引入"wiringPiI2C.h"等 此處,我使用的是讀取感測器adxl345加速度計 widget.cpp 中 首先應該使用在命令行中 來獲取i2c設備文件的地址,比如 ​ ...
  • pssh提供OpenSSH和相關工具的並行版本。包括pssh,pscp,prsync,pnuke和pslurp。該項目包括psshlib,可以在自定義應用程式中使用。pssh是python寫的可以併發在多台機器上批量執行命令的工具,它的用法可以媲美ansible的一些簡單用法,執行起來速度比ansi ...
  • 安裝Aduino開發環境 在官網中下載Arduino開發環境,或者在網盤中下載: 網盤地址: https://pan.baidu.com/s/1OjMhYgKOYW69YC2dEwFgyw: 提取碼:ls15 安裝esp8266庫文件 為了在Arduino的IDE中開發NodeMCU,必須在IDE中 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...