數(shù)據(jù)結構與算法:多任務下的垃圾收集3_第1頁
數(shù)據(jù)結構與算法:多任務下的垃圾收集3_第2頁
數(shù)據(jù)結構與算法:多任務下的垃圾收集3_第3頁
數(shù)據(jù)結構與算法:多任務下的垃圾收集3_第4頁
數(shù)據(jù)結構與算法:多任務下的垃圾收集3_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第第頁數(shù)據(jù)結構與算法:多任務下的垃圾收集[3]數(shù)據(jù)結構與算法:多任務下的垃圾收集[3]

發(fā)表于:2023-09-15來源::點擊數(shù):標簽:算法收集數(shù)據(jù)結構垃圾任務

數(shù)據(jù)結構與算法:多任務下的垃圾收集[3]數(shù)據(jù)庫設計關鍵字:數(shù)據(jù)庫設計/**支持多任務的垃圾收集函數(shù),遍歷哈希表,將所有引用計數(shù)為0的內存釋放@returnvoid——無*/voidMGC_Collect(){void*p;Lock(g_lock);HashTable_EnumBegin(g_pMTable);

數(shù)據(jù)結構與算法:多任務下的垃圾收集[3]數(shù)據(jù)庫設計

關鍵字:數(shù)據(jù)庫設計/**支持多任務的垃圾收集函數(shù),遍歷哈希表,將所有引用計數(shù)為0的內存釋放

@returnvoid——無

*/

voidMGC_Collect()

{

void*p;

Lock(g_lock);

HashTable_EnumBegin(g_pMTable);

while((p=HashTable_EnumNext(g_pMTable))!=NULL)

{

INT*pRef=(INT*)((char*)p-INT_LEN);

if(*pRef==0)

{

HashTable_Delete(g_pMTable,p,HashInt,IntCompare,NULL);

MGC_Free(p);

}

}

Unlock(g_lock);

}

注意:上面定義全局哈希表對象時使用了另外一個g_pMTable變量,主要是有別于支持單任務的哈希表對象,便于采取不同的策略進行管理。

3.使用單獨任務進行垃圾收集

實現(xiàn)多任務支持之后,如何進行垃圾收集呢?可以看出在上面實現(xiàn)的MGC_Collect()函數(shù)中,只是簡單地加鎖,然后收集,再解鎖。這樣做的缺點是當分配的內存數(shù)量比較多時,需要耗費大量的時間進行收集,并且在收集的過程中其他的內存操作全部都會被掛起,直到收集完成解鎖后,其他的內存操作才能繼續(xù),這就是目前實際應用中使用較多的收集方法。本書前面已經(jīng)介紹了多任務下如何遍歷的問題,所以這里要利用本書的多任務算法來實現(xiàn)更好的垃圾收集功能,使得在進行垃圾收集時不影響其他的內存操作,使得應用程序繼續(xù)運行,讓用戶感覺不到垃圾收集在運行。

要實現(xiàn)收集時不影響內存操作,必須使用支持多任務的哈希表??紤]到程序效率,就不再像多任務鏈表那樣單獨寫一個多任務哈希表模塊,若寫成單獨模塊,多任務哈希表自己得有一個鎖,加上引用計數(shù)使用的鎖g_lock總共有兩個鎖,需要進行兩次加鎖解鎖操作。而鎖的操作相對于內存讀寫操作是非常耗費時間的,所以還是讓哈希表共用g_lock鎖變量。另外還得發(fā)揮多任務的優(yōu)勢,特別是在使用多核CPU時,更應該發(fā)揮多任務的優(yōu)勢,尤其需要將垃圾回收放到一個單獨的任務里運行。下面我們就來實現(xiàn)用單獨的垃圾收集任務收集垃圾。

要支持多任務,首先必須定義一個多任務變量如下。

MTASKg_pMTask;

還得在MGC_Init()函數(shù)里創(chuàng)建MTASK對象,修改后的編碼如下。

/**多任務下的垃圾內存收集算法的初始化函數(shù)

@paramINTnBucketCount——哈希表的bucket的數(shù)量

@returnINT——成功返回CAPI_SUCCESS;失敗返回CAPI_FAILED

*/

INTMGC_Init(INTnBucketCount)

{

g_lock=LockCreate();

if(g_lock!=NULL)

{

g_pMTable=HashTable_Create(nBucketCount);

if(g_pMTable!=NULL)

{

g_pMTask=MTask_Create();

if(g_pMTask!=NULL)

{

returnCAPI_SUCCESS;

}

else

{

HashTable_Destroy(g_pMTable,NULL);

LockClose(g_loc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論