內存碎片的產生

內存碎片的產生:

內存分配有靜態分配和動態分配兩種。

   靜態分配在程序編譯鏈接時分配的大小和使用壽命就已經確定,而應用上要求操作系統可以提供給進程運行時申請和釋放任意大小內存的功能,這就是內存的動態分配。靜態內存分配不會產生內存碎片。

因此動態分配將不可避免會產生內存碎片的問題,那麼什麼是內存碎片?內存碎片即“碎片的內存”描述一個系統中所有不可用的空閒內存,這些碎片之所以不能被使用,是因爲負責動態分配內存的分配算法使得這些空閒的內存無法使用,這一問題的發生,原因在於這些空閒內存以小且不連續方式出現在不同的位置。因此這個問題的或大或小取決於內存管理算法的實現上。

空閒碎片的存在有兩種方式:a.內部碎片 b.外部碎片。

內部碎片的產生:因爲所有的內存分配必須起始於可被 4、8 或 16 整除(視處理器體系結構而定)的地址或者因爲MMU的分頁機制的限制,決定內存分配算法僅能把預定大小的內存塊分配給客戶。假設當某個客戶請求一個 43 字節的內存塊時,因爲沒有適合大小的內存,所以它可能會獲得 44字節、48字節等稍大一點的字節,因此由所需大小四捨五入而產生的多餘空間就叫內部碎片

外部碎片的產生:頻繁的分配與回收物理頁面會導致大量的、連續且小的頁面塊夾雜在已分配的頁面中間,就會產生外部碎片。

假設有一塊一共有100個單位的連續空閒內存空間,範圍是0~99。如果你從中申請一塊內存,如10個單位,那麼申請出來的內存塊就爲0~9區間。這時候你繼續申請一塊內存,比如說5個單位大,第二塊得到的內存塊就應該爲10~14區間。如果你把第一塊內存塊釋放,然後再申請一塊大於10個單位的內存塊,比如說20個單位。因爲剛被釋放的內存塊不能滿足新的請求,所以只能從15開始分配出20個單位的內存塊。現在整個內存空間的狀態是0~9空閒,10~14被佔用,15~24被佔用,25~99空閒。其中0~9就是一個內存碎片了。如果10~14一直被佔用,而以後申請的空間都大於10個單位,那麼0~9就永遠用不上了,變成外部碎片。

 實時操作系統對內存碎片的處理較好。如 OSE 實時操作系統已經備有避免內存碎片的良好工具,但個別程序員做出的選擇仍然會對最終結果形成影響。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章