記憶體碎片產生原因
記憶體分配有靜態分配和動態分配兩種,動態分配將不可避免會產生記憶體碎片的問題。記憶體碎片即「碎片的記憶體」描述乙個系統中所有不可用的空閒記憶體,這些碎片之所以不能被使用,是因為負責動態分配記憶體的分配演算法使得這些空閒的記憶體無法使用。
記憶體碎片分為:內部碎片和外部碎片。
外部碎片就是已經被分配出去(能明確指出屬於哪個程序)卻不能被利用的記憶體空間;
內部碎片是處於區域內部或頁面內部的儲存塊。占有這些區域或頁面的程序並不使用這個儲存塊。而在程序占有這塊儲存塊時,系統無法利用它。直到程序釋放它,或程序結束時,系統才有可能利用這個儲存塊。
單道連續分配只有內部碎片。多道固定連續分配既有內部碎片,又有外部碎片。
外部碎片指的是還沒有被分配出去(不屬於任何程序),但由於太小了無法分配給申請記憶體空間的新程序的記憶體空閒區域。
外部碎片是出於任何已分配區域或頁面外部的空閒儲存塊。這些儲存塊的總和可以滿足當前申請的長度要求,但是由於它們的位址不連續或其他原因,使得系統無法滿足當前申請。
記憶體碎片解決辦法
不要動態分配記憶體,盡量使用棧。
根據使用場景定製記憶體分配策略。比如如果你發現你常常分配同一種大小的資料結構,那麼就一次分配乙個陣列從裡面挨個取,用完了扔回旁視列表裡以備重用。再如你發現記憶體分配具有週期性,那麼你可以週期性的分配大塊記憶體,用完了釋放整塊記憶體。
不手動管理記憶體,改用具有分代記憶體管理、增量垃圾收集和記憶體整理功能的垃圾收集器。比如你要是用了j**a,那麼你就再也不用操心記憶體碎片了(代價是你的程式占用的記憶體會比用c語言時翻幾倍)。
夥伴系統演算法:基於索引搜尋的動態分割槽分配演算法,已分配分割槽和空閒分割槽大小都是2的k次方,當需要分配長度為n的儲存空間時,從n開始找最接近2的i次方大小的分割槽,若沒有就不斷向上找分割。
頁式儲存
記憶體管理方式主要分為:頁式管理、段式管理和段頁式管理。
優點:沒有外碎片,每個內碎片不超過頁的大小。
段式管理的基本思想是把使用者程式的位址空間分成大小不同的段,每段可定義一組相對完整的資訊。段式管理程式以段為單位分配記憶體,然後通過位址對映機構把段式虛擬位址轉換為實際記憶體實體地址。
缺點:會產生碎片。
段頁式管理,系統必須為每個作業或者程序建立一張段表以管理記憶體分配與釋放、缺段處理等。另外由於乙個段又被劃分為若干個頁,每個段必須建立一張頁表以把段中的虛頁變換為記憶體中的實際頁面。顯然與頁式管理時相同,頁表也要有相應的實現缺頁中斷處理和頁面保護等功能的表項。
段頁式管理是段式管理和頁式管理相結合而成,具有兩者的優點。
由於管理軟體的增加,複雜性和開銷也增加。另外需要的硬體以及占用的記憶體也有所增加,使得執行速度下降。
儲存器管理
通用計算機有三層儲存器 cpu暫存器,主存,輔存。為了緩和各儲存器之間處理速度的差異,在暫存器和主存之間加入了快取記憶體,而在主存和輔存之間加入了磁碟快取。模組裝入方式 1 絕對裝入方式 將目標模組裝入到記憶體事先指定的位置。記憶體的分配方式 一 連續分配方式。1 單一連續分配 只能用於單使用者單任...
儲存器管理
一 單一連續分配 分為系統區和使用者區,系統區僅提供給os使用,通常放在低位址,使用者區出系統區以外的全部記憶體空間,供使用者使用。二 固定分割槽分配 把記憶體劃分為大小不一的分割槽,有幾個分割槽便只允許幾道作業併發。會造成內碎片 內碎片 乙個分區內的剩餘空間 三 動態分割槽分配 根據程式大小需要多...
儲存器管理
1 編譯compiler 編譯程式 將使用者源 編譯成若干個目標模組。1 邏輯位址 相對位址,虛位址 使用者的程式經過彙編或編譯後形成目標 目標 中的指令位址是相對位址。一般首位址為0,其餘指令中的位址都相對於首位址來編址。不能用邏輯位址在記憶體中讀取資訊 2 實體地址 絕對位址,實位址 記憶體中儲...