《操作系統》OS學習(五):連續內存分配 內存碎片、動態分配、碎片整理、伙伴系統

內存碎片

在沒有其他方式輔助的情況下,我們分配給一個進程的內存是連續的。在分配時候我們需要有動態分配與碎片處理。如何理解呢?就是每個進程需要一塊內存,我們要選取合適的位置的內存分配給它。當有的進程先結束了內存還給操作系統,此時可能就會產生內存碎片,要對碎片進行處理。首先對一些概念進行解釋。

  • 連續內存分配:給進程分配一塊不小于指定大小的連續的物理內存區域。
  • 內存碎片:不能被利用的空閑內存,內存碎片又分為外部碎片和內部碎片。
  1. 外部碎片:分配單元之間的未被利用的內存,比如兩個進程之間的進程結束后的空間,如果后續請求的大小都大于這一部分空間,這部分空間就不能被利用,也就形成了外部碎片。
  2. 內部碎片:分配單元內部的未被使用的內存,這是由于分配時可能只能分配2的冪次方大小內存比如512字節,而實際使用了510字節,那么就有2字節的內部碎片。

動態分配:

當程序加載執行時,需要分配給進程一個指定大小可變的分區,分區的地址是連續的。如圖中右側分給進程1到6內存空間。當進程3和進程5結束后它們所占有的位置重新變為空閑。操作系統要維護的數據結構就包含了內存中已分配區域與未分配區域。當有新的進程請求一定的內存空間時,則根據未分配空間進行一個動態分區分配。分配的策略是多種多樣的。比如:

  • 最先分配,空閑分區列表按照地址順序排序,遍歷空閑分區,遇到的第一個大小滿足需求的區域分配給進程。釋放內存使,查看附近是否有臨近的空閑區,有的話進行合并。優點是找和合并開銷較小,算法簡單,并且由于每次從小地址開始查找,可以在大地址處留有大塊的空閑分區,可以分配給需要大內存的進程。缺點是會有外部碎片,因為切完剩下的可能有很多小塊內存,也因此分配大內存時需要遍歷到最后時間較長。
  • 最佳匹配,空閑分區列表按照大小排序,尋找空閑區域中大小大于需求大小中最小的分配給進程,具體實現時可以對空閑分區按大小排序從最小開始尋找第一個大于需求的內存區即可,如果不排序則需要整個遍歷一遍。釋放時,也是與鄰近空閑區域合并。而合并時我們要找的是地址鄰近的而不是大小鄰近的,所以合并的開銷會大一些。優點大部分分配的內存尺寸較小時效果很好,因為可以避免較大的內存被拆分,同時減小外部碎片的大小,同時相對來說比較簡單。缺點是外部碎片還是較多,并且越小越無法被利用,容易產生很多無用的小碎片,此外如前所述釋放分區較慢,合并時算法復雜。
  • 最差匹配,空閑分區列表按照大小排序,尋找空閑去榆中大小最大的區域從中劃分出需要大小的內存分配給進程。釋放時尋找鄰近空閑分區合并。因此也存在最佳匹配的問題,釋放內存時合并算法開銷較大。優點是中等尺度內存分配較多時效果最好,可以避免產生太多小碎片。缺點是釋放較慢,也會有外部碎片,容易破壞大的內存區域,因此后續無法分配大內存。

碎片整理

系統運行過程中,碎片越來越多,很可能無法獲取需要的較大的內存空間。我們需要解決這個問題,這就是碎片整理的意義,可以通過碎片整理獲得更大的連續內存空間,以便于滿足進程的應用空間需求。碎片整理是通過調整進程占用的分區位置來減少或避免分區碎片的。碎片整理有很多種方式,比如碎片緊湊、分區對換。

碎片緊湊

  • 實現方式:通過移動分配給進程的內存分區,以合并外部碎片。
  • 條件:所有的應用程序可以動態重定位。這是因為程序中可能有很多地址引用,如果引用了絕對地址,移動分配的內存位置可能就會出錯。因此需要動態重定位,執行到命令的時候才生成內存地址。
  • 時機:進程處于等待狀態時搬動。
  • 開銷:移動已分配的內存分區是有開銷的,因此不會為了一小塊碎片就進行緊湊。具體開銷暫且按下不講。

分區對換

分區對換是通過搶占并回收處于等待狀態進程的分區,以增大可用內存空間。即將等待狀態進程的數據存儲到外存中,也就是對換到對換區。可以結合下面的圖示理解:假設系統運行到某個時刻處于如下第一張圖片的狀態,圖中下側為內存與外存狀態,上側為操作系統維護的進程狀態數據結構示意圖,即有三個進程P1、P2、P3占滿了內存區,而P1處于等待狀態,P2處于運行狀態,P3處于就緒狀態。此時又有第四個進程要運行,而內存是不夠的。則進行分區對換,對換后如第二張圖所示,將處于等待狀態的進程P1移動到外存,此時就有足夠的內存空間。通過這種方式,我們可以讓更多的進程在系統中交替進行。

由于對換是在內存與外存之間,對換速度是非常慢的,開銷很大,因此需要解決一個問題,就是到底要交換哪些進程。

伙伴系統

伙伴系統是連續存儲分配的一種辦法。它比較好地折中了分配和回收過程中分配塊的位置碎片和合并的問題。伙伴系統地概念如下圖:整個可分配分區大小為2的冪次方,當需要的內存空間大于當前塊的一半的時候就將整個分區分配給進程,如果小于當前分區的一半,就將當前分區對半分開,將其中一半繼續與需要的內存大小進行比較,遞歸進行下去,直到滿足所需內存大小大于分區一半。可以看到這種分配方式內部碎片最大為分區大小的一半減一。知道了伙伴系統的思想,下面我們看下具體實現。

伙伴系統的實現

數據結構:

  • 空閑塊按大小和起始位置組織稱二維數組;
  • 初始狀態時,只有一個大小為2^u的空閑塊;

分配過程:

  • 由小到大在空閑塊數組中找最小的可用空閑塊;
  • 如果空閑塊過大,對可用空閑塊進行二等分,一個放入空閑塊列表,另一塊繼續比較,直到得到合適的可用空閑塊

分配示例:

釋放過程:

  • 把釋放的塊放入空閑塊數組
  • 合并滿足合并條件的空閑塊

合并條件:

  • 大小相同2^i
  • 地址相鄰
  • 起始地址小的塊的地址必須是2^{i+1}的倍數。看起來有點抽象,其實就是地址較小的塊的起始地址必須是要合并的塊的大小的兩倍的倍數。因此上圖中三個256只有后面兩個可以合并。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454165.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454165.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454165.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GCC 中文手冊 - 摘自純C論壇

GCC Section: GNU Tools (1) Updated: 2003/12/05 Index Return to Main Contents NAME gcc,g-GNU工程的C和C編譯器(egcs-1.1.2) 總覽(SYNOPSIS) gcc[option|filename ]... g[option|filename ]... 警告(WARNING) 本手冊頁內容摘自GNU C編譯器的完整文檔,僅限于解釋選項的含義…

python如何實現支持中文

#codingutf-8print("我要python支持中文") 默認情況下,python是不支持中文的。 如果要實現python支持中文(我是從python3.6開始學習的),只要在python文檔的開頭加入:“#codingutf-8"就可以了。轉載于:h…

世界之窗瀏覽器刪除文本框信息_文本框——Excel里的便利貼

工作表里面的單元格應該是足夠我們來記錄數據和信息了。但是文本框這個功能在工作表中還是存在,可以理解為便利貼功能。插入文本框1.點擊“插入”選項卡。2.然后點擊“文本框”。3.在下拉菜單里面,有兩種可供選擇:橫排文本框和垂直文本框。在…

RHEL 5服務篇—常用網絡配置命令

常用網絡配置命令 在“Linux系統管理”的文章中,大家已經學習了Linux系統的基本管理命令和技巧,為了進一步學習Linux網絡服務打下了良好的基礎。所以我作者以后將陸續推出Linux網絡服務的相關文章。希望大家能給與我大大的支持。 今天我們就來學習一下…

清華大學《操作系統》(六):非連續內存分配 段式、頁式、段頁式存儲管理

背景 連續內存分配給內存分配帶來了很多不便,可能所有空閑片區大小都無法滿足需求大小,這個分配就會失敗。基于這種現狀,就有了非連續內存分配的需求。非連續分配成功的幾率更高,但也面對更多的問題,比如分配時是不是…

python監控文件內容變化_Python監控文件內容變化

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云文件存儲NAS是一個可共享訪問&#xf…

C語言第三次博客作業---單層循環結構

一、PTA實驗作業。 題目1 1.實驗代碼 int n,i; double height1,height2;//1為輸入身高&#xff0c;2為輸出身高。 char sex; //1<height1<3; //N<1; scanf("%d",&n); while(n--){getchar();scanf("%c%lf",&sex,&height1);switch(sex)…

函數和函數式編程

python的過程就是函數&#xff0c;因為解釋器會隱式地返回默認值None。 實際編程中大部分偏函數更接近過程&#xff0c;不顯示地返回任何東西。 當沒有顯示地返回元素或者如果返回None時&#xff0c;python會返回一個None。 * 元組 ** 字典 def子句的剩余部分包括了一個雖…

清華大學《操作系統》(七):虛擬存儲、覆蓋、交換

接下來幾節都是對虛擬存儲的講解。虛擬存儲是非連續存儲管理的擴展。通過將內存中的數據暫存到外存的方式&#xff0c;為進程提供更大的內存空間。虛擬存儲出現的主要原因是因為程序規模的增長速度遠遠大于存儲器容量的增長速度&#xff0c;導致內存空間不夠用。其實針對內存空…

遵義大數據中心項目工程概況_市委書記張新文到曹州云都大數據中心等項目現場調研建設情況...

4月25日&#xff0c;市委書記張新文到曹縣調研重點項目建設情況&#xff0c;研究推進措施。市委常委、秘書長任仲義參加活動。張新文首先來到曹州云都大數據中心項目建設現場&#xff0c;查看項目推進情況。曹州云都大數據中心&#xff0c;是涵蓋云計算區、研發辦公區、公寓生活…

linux 可執行文件的分析(gcc GUN BUILEIN)

1、GCC The History of GCC 1984年&#xff0c;Richard Stallman發起了自由軟件運動&#xff0c;GNU (Gnus Not Unix)項目應運而生&#xff0c;3年后&#xff0c;最初版的GCC橫空出世&#xff0c;成為第一款可移植、可優化、支持ANSI C的開源C編譯器。GCC最初的全名是GNU C Com…

Cassandra 的數據存儲結構——本質是SortedMapRowKey, SortedMapColumnKey, ColumnValue

Cassandra 的數據存儲結構 Cassandra 的數據模型是基于列族&#xff08;Column Family&#xff09;的四維或五維模型。它借鑒了 Amazon 的 Dynamo 和 Googles BigTable 的數據結構和功能特點&#xff0c;采用 Memtable 和 SSTable 的方式進行存儲。在 Cassandra 寫入數據之前&a…

清華大學《操作系統》(八):置換算法

功能&#xff1a;置換算法是指當出現缺頁異常時&#xff0c;需要調入新頁面而內存已滿時&#xff0c;置換算法選擇被置換的物理頁面。 設計目標&#xff1a; 盡可能減少頁面的調入調出次數&#xff1b;把未來不再訪問或短期內不訪問的頁面調出。 頁面鎖定&#xff1a; 了解具…

python email模塊詳解_python模塊之email: 電子郵件編碼解碼 (一、解碼郵件)

python自帶的email模塊是個很有意思的東西&#xff0c;它可以對郵件編碼解碼&#xff0c;用來處理郵件非常好用。處理郵件是一個很細致的工作&#xff0c;尤其是解碼郵件&#xff0c;因為它的格式變化太多了&#xff0c;下面先看看一個郵件的源文件&#xff1a;Received: from …

爛泥:通過vsphere給esxi添加本地硬盤

公司ESXi服務器的硬盤空間不夠使用&#xff0c;現在新加了一塊硬盤在ESxi服務器上。在服務器上添加完硬盤后&#xff0c;在Vsphere上是看不到新加硬盤的。 下面我們來通過虛擬機模擬該情況&#xff0c;先添加一塊硬盤。如下圖&#xff1a; 在Esxi添加完硬盤后&#xff0c;現在通…

清華大學《操作系統》(九):進程和線程

進程 定義&#xff1a; 進程是指一個具有一定獨立功能的程序在一個數據集合上的一次動態執行的過程。 組成&#xff1a; 代碼數據狀態寄存器&#xff08;正在運行的一個程序的所有狀態信息&#xff09;&#xff1a;CPU狀態CP0、指令指針IP通用寄存器&#xff1a;AX、BX、CX…

開始Flask項目

1.新建Flask項目。2.設置調試模式。3.理解Flask項目主程序。4.使用裝飾器&#xff0c;設置路徑與函數之間的關系。5.使用Flask中render_template&#xff0c;用不同的路徑&#xff0c;返回首頁、登錄員、注冊頁。6.用視圖函數反轉得到URL&#xff0c;{{url_for(‘login’)}}&am…

gcc交叉編譯的實現

gcc支持多種不同的語言&#xff0c;也支持多種不同的CPU架構。在它的實現上&#xff0c;不同語言編譯的實現是通過conststruct lang_hooks lang_hooks LANG_HOOKS_INITIALIZER;這個結構體的不同定義來實現的。比如c語言的編譯器就通過gcc/c-lang.c指定了lang_hooks這個結構體的…

爛泥:mysql數據庫使用的基本命令

1、連接數據庫的格式 mysql -h IP -u用戶名 -p密碼; 1.1連接遠程數據庫 mysql -h 192.168.1.214 -uroot -p123456 也可寫成&#xff1a; mysql -h 192.168.1.214 -u root -p 123456 1.2連接本地數據庫 mysql -uroot -p123456 也可寫成&#xff1a; mysql -u root -p 123456 2、…

mse均方誤差計算公式_PCA的兩種解讀:方差最大與均方誤差最小的推導

這張圖片很關鍵&#xff0c;來自統計學習方法的PCA插圖又要考試了&#xff0c;推導一下方差最大化與均方差最小化&#xff0c;老師上課講了一些均方差最小化&#xff0c;推導的過程很詳細不過自己沒有記下來&#xff0c;復習的時候再推一遍加深印象。感謝 耳東陳 老師的精彩課件…