記憶體管理離第乙個作業系統hnu-os發布已經沒有多少時間了,但它的一些元件還沒有完成,記憶體管理器就是其中之一。根據開發人員的計畫,在第乙個版本中,記憶體管理器將非常簡單和直觀。它將支援三個操作:
alloc n —— 分配n個位元組記憶體,返回已分配塊的正整數識別符號x(x初始值為0,每次分配增長1)
erase x —— 刪除識別符號x所在的塊
defragment —— 整理空餘記憶體碎片,將所有塊盡量靠近記憶體的開始位置,並保持各自的順序
在此情況下,記憶體模型非常簡單,它是乙個m位元組的序列,為了方便起見,從第乙個位元組到第m位元組進行編號。
第乙個操作alloc n有乙個引數n,表示被分配的記憶體塊大小。在處理此操作時,記憶體中將分配n個連續位元組的空閒塊。 如果這些塊的數量超過乙個,則優先選擇最接近記憶體開始(即第乙個位元組)的塊。 所有這些位元組都被標記為非空閒,記憶體管理器返回乙個32位整數數字令牌,代表該塊的識別符號。 如果不可能分配這樣大小的空閒塊,則返回null。
第二個操作erase x以x為引數,表示某個塊的識別符號。此操作釋放系統記憶體,將此塊的位元組標記為空閒以供進一步使用。 如果此識別符號沒有指向先前分配的塊(該塊尚未被釋放),則返回illegal_erase_argument。
最後乙個操作defragment沒有任何引數,只會使占用的記憶體部分更接近記憶體的開始,而不會更改它們各自的順序。
在當前的實現中,將使用從1開始的連續整數作為識別符號。每個成功的alloc操作過程都應該返回接下來的編號。不成功的alloc操作不影響計數。
編寫記憶體管理器的實現,為每個alloc命令輸出返回的值,為所有失敗的erase命令輸出illegal_erase_argument。
輸入資料的第一行包含兩個正整數t和m(1<=t<=500, 1<=m<=105),其中t表示需要記憶體管理器來處理的操作個數,m表示有效的記憶體位元組大小。接下來的t行每一行代表乙個操作。
輸出有多行,每行或者是alloc操作的結果,或者是失敗的erase操作的結果illegal_erase_argument。其順序與輸入的操作次序一致。
6
10alloc 5
alloc 3
erase 1
alloc 6
defragment
alloc 6
1
2null
3
(10/10分,c++)
// 31.記憶體管理
#include
#include
#include
#include
using
namespace std;
struct memory //記憶體塊};
bool
cmp(
const memory &a,
const memory &b)
return a.usable < b.usable;
//(已被占用)不可用false(0)<(未被占用)可用true(1)
}int
main()
}if(succ ==
false)if
((m - sum)
>= number)
//末尾剩餘空閒記憶體位元組數》=number
else}}
else
}else
//刪除識別符號number所在的塊}if
(eff ==
false
)//若命令無效}}
else
//是defragment,不需要數字}}
}return0;
}
Object C程式設計記憶體管理
記憶體管理的範圍 任何繼承了 nsobject 的物件,對其他基本資料型別 int char float double struct enum 等 無效 物件的基本結構 1.每個 oc物件都有自己的引用計數器,是乙個整數,表示 物件被引用的次數 即有多少人正在使用這個 oc物件 2.每個 oc物件內...
高階記憶體管理程式設計指南 記憶體管理政策
協議中定義的方法和標準方法命名約定的組合提供。的nsobject類也定義了一種方法,dealloc即自動當物件被釋放呼叫。本文介紹了在 cocoa 程式中正確管理記憶體所需了解的所有基本規則,並提供了一些正確用法的示例。記憶體管理模型基於物件所有權。任何物件都可能擁有乙個或多個所有者。只要乙個物件至...
C 程式設計記憶體管理器(記憶體池)
c語言中的標準庫函式malloc free calloc和realloc,以及c 中的new new delete和delete 操作符,是這兩種語言中記憶體管理的關鍵之處。注意一下c語言裡面的是函式,在c 裡面是操作符,這個據說在面試裡面被問到過。在執行時,malloc和new將向作業系統核心請求...