程式設計訓練 記憶體管理

2021-10-23 18:54:55 字數 1824 閱讀 8205

記憶體管理
離第乙個作業系統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將向作業系統核心請求...