大家都知道,我們malloc的時候作業系統維護著一張雙鏈表記錄堆裡面的空閒記憶體塊情況,每個節點對應一塊記憶體。
最佳適應法:分配記憶體(大小為size)的時候,從表頭開始搜尋,找那塊比size大的最小空閒記憶體塊,進行分配,餘下的部分變成一塊空閒記憶體塊插入到鍊錶中
迴圈首次適應法:該演算法是首次適應演算法的變種。在分配記憶體空間時,不再每次從表頭(鏈首)開始查詢,而是從上次找到空閒區的下乙個空閒開始查詢,直到找到第乙個能滿足要求的的空閒區為止,並從中劃出一塊與請求大小相等的記憶體空間進行分配,餘下的部分變成一塊空閒記憶體塊插入到鍊錶中,並成為下一次分配搜尋的起始記憶體塊。
它們的**如下(我們分配記憶體的單位是1kb):
//記憶體塊首位址為56000(假定記憶體空間的低址部分56mb(即0~56m-1)作為系統區和不參與分配過程),總大小為200000
enum ;
struct node
;typedef struct node block;
void init ();
int request ();
int cycle ( int size );
int best ( int size );
/*occupied:占用的記憶體總量
count:占用的記憶體塊數目
compare:比較次數
algo:演算法
head:表頭
tail:初始時的表尾
*/int occupied = 0, count = 0, compare = 0, algo = cycle;
block *head = null, *tail = null, *last = null;
//初始化鍊錶
void init ()
free(head);
} //初始化鍊錶頭尾指標
head = (block*)malloc(sizeof(block));
tail = (block*)malloc(sizeof(block));
last = tail;
head->prev = tail;
head->next = tail;
tail->prev = head;
tail->next = head;
head->addr = 0;
head->size = addr;
head->status = full;
tail->addr = addr;
tail->size = total;
tail->status = free;
}//請求分配記憶體
int request ()
else if ( algo == best )
printf("嘗試申請一塊大小為%dkb的記憶體",size);
if ( (addr = (*fp)(size)) == 0 )
else }
//迴圈首次適應演算法
int cycle ( int size )
++compare;
//大小超過要分配的記憶體,當前記憶體塊被分配,多出來的一部分變成空閒記憶體塊插入到被分配的記憶體塊之後,讓last指向它
if ( work->size > size )
else
if ( temp == work )
else
}++count;
occupied += size;
return work->addr;
}//最佳適應演算法
int best ( int size )
++compare;
//無法找到滿足要求的記憶體塊,返回0
if ( work == head )
return 0;
//當前記憶體塊大小滿足要求
fit = work;
//尋找大小滿足要求的最小空閒記憶體塊
while ( work != head )
//大小超過要分配的記憶體,當前記憶體塊被分配,多出來的一部分變成空閒記憶體塊插入到被分配的記憶體塊之後
if ( fit->size > size )
//大小正好,只改變當前記憶體塊狀態
else
//占用記憶體塊數目+1
++count;
//占用記憶體塊總大小增加
occupied += size;
//返回申請到的記憶體首位址
return fit->addr;
}
記憶體**:這裡用於測試,我們隨機**一塊記憶體,如果記憶體前後有未占用記憶體,則合併。
void recycle ()
else
else
else if ( prev->status == free && next->status == full )
else if ( prev->status == full && next->status == free )
else
--count;
return;
} else
}} while ( n > 0 );
}}
作為乙個剛接觸記憶體管理的菜鳥,滋生如下問題,望牛人指教:
1. 我覺得在自己的專案裡新增乙個記憶體模組是不是整個專案的記憶體分配要合理一些(先malloc一塊大記憶體,再對其管理)?
2.記憶體分配會產生碎片,那對於碎片如何**呢,如果我規定分配的記憶體塊大小都必須是2k的倍數(2k,4k,8k),對於每個請求的記憶體分配給它最相近的記憶體大小(如請求3k,分配4k的記憶體塊給它),產生的記憶體碎片是不是會少很多?
3.如果我的專案最多隻需要分配幾個不同大小的記憶體塊(如3個12k,乙個43k,2個6k),是不是先malloc(3*12+42+2*6)k記憶體,再分割成3個12k,乙個43k,2個6k的記憶體塊,然後每次要分配的時候去fit,是不是分配的效率會提公升很多?
4.最後,也是最關鍵的一點,求記憶體管理方面的經典書籍?555。。。急求!!!
初窺記憶體管理(三)夥伴演算法
假設系統的可利用記憶體空間容量為2m個字 位址從0到2m 1 則在開始執行時,整個記憶體區是乙個大小為2m的空閒塊,在執行了一段時間之後,被分隔成若干占用塊和空閒塊。為了在分配時查詢方便起見,我們將所有大小相同的空閒塊建於一張子表中。每個子表是乙個雙重鍊錶,這樣的鍊錶可能有m 1個,將這m 1個表頭...
Scrapy 初窺筆記
scrapy startproject yourprojectname 建立scrapy專案 開始爬蟲 scrapy crawl spidername 開始執行爬蟲 以上仿麻煩 根目錄新建執行檔案 from scrapy.cmdline import execute execute scrapy c...
初窺Shell 指令碼
1 shell是什麼 shell指令碼就是利用shell的命令解釋的功能,對乙個純文字的檔案進行解析,然後執行這些功能,也可以說shell指令碼就是一系列命令的合集。shell可以直接使用在win unix linux上面,並且可以呼叫大量系統內部的功能來解釋執行程式,如果熟練使用並掌握shell指...