0
我在C中構建了一個簡單的內存池,並且我還實現了在此池中實現內存塊的功能。在C內存池中對內存塊進行碎片整理
內存塊本身非常簡單,只是一個帶有空白標誌和大小屬性的雙向鏈表。
我現在要做的是創建一個函數,該函數需要一個指向我的內存池的指針並對內部的內存塊進行碎片整理,以便分配的(free == 0)塊朝向池的開始並釋放塊正朝着游泳池的盡頭。
舉例來說,如果我有記憶的塊結構喜歡這個之前,我打電話給我的碎片整理功能:
Block Size: 25 (41 w/ header), Free: 1
Block Size: 100 (116 w/ header), Free: 0
Block Size: 25 (41 w/ header), Free: 1
Block Size: 100 (116 w/ header), Free: 0
Block Size: 100 (116 w/ header), Free: 0
Block Size: 54 (70 w/ header), Free: 1
然後打電話給我的功能之後塊將被安排像這樣:
Block Size: 100 (116 w/ header), Free: 0
Block Size: 100 (116 w/ header), Free: 0
Block Size: 100 (116 w/ header), Free: 0
Block Size: 25 (41 w/ header), Free: 1
Block Size: 25 (41 w/ header), Free: 1
Block Size: 54 (70 w/ header), Free: 1
我已經試圖建立功能,但是我遇到了移動正確的塊周圍的問題似乎因爲這是我的輸出後函數被稱爲:
Block Size: 100 (116 w/ header), Free: 0
Block Size: 25 (41 w/ header), Free: 1
Block Size: 100 (116 w/ header), Free: 0
Block Size: 1744830464 (1744830480 w/ header), Free: 21
我並不確定函數執行的是不正確的操作,所以希望有人能爲我闡明一些。
我的碎片整理功能:
void defragment(Pool* pool)
{
if(pool && pool->root)
{
Block* current = pool->root;
while(current)
{
if(!current->free)
{
Block* current_prev = current->prev;
if(current_prev && current_prev->free)
{
Block* prev_prev = current_prev->prev;
int new_block_size = current_prev->size;
Block* moved_current = memmove(current_prev, current, sizeof(Block) + current->size);
if(!moved_current)
{
printf("couldn't move memory\n");
}
else
{
Block* new_block = initBlock((((char*)moved_current) + sizeof(Block) + moved_current->size), new_block_size);
new_block->prev = moved_current;
new_block->next = moved_current->next;
moved_current->prev = prev_prev;
moved_current->next = new_block;
if(prev_prev)
{
prev_prev->next = moved_current;
}
current = moved_current;
continue;
}
}
}
current = current->next;
}
//Join Contiguous Blocks
}
}
到initBlock函數的調用只是需要一個內存地址,將其視爲一個塊結構,然後設置自由屬性爲true和大小屬性爲給定大小。
我正在使用帶-std = C99標誌的GCC編譯器。
分配的塊的所有者在重定位後會做什麼? –
@WeatherVane目前,我並不需要擁有所有者持有的指針,因爲這是指向uni的指針。雖然擁有分配的中間目錄並且指針持續存在會使我獲得更高的分數,但它不是低分的要求。 –
碎片整理程序不知道用戶放置內存指針的位置,因此您無法更新它們。當然,你只能整理未使用的區域。就像您在整理硬盤時一樣,打開的文件無法移動。 –