軟件測試之用戶層垃圾回收算法[2] 軟件測試方法
關鍵字:數據庫設計可不可以在GCPtr類里面直接定義一個變量來保存引用計數呢?答案是否定的。因為指針和內存并不是一一對應的關系,而是可能有多個指針指向同一塊內存。引用計數必須和分配的內存一一對應,如果GCPtr類里面直接定義一個變量來保存引用計數的話,當另外一個GCPtr對象指向一個已有GCPtr對象指向的內存時,如何去增加引用計數?這顯然是無法實現的,所以必須設計一個和分配內存一一對應的保存引用計數的地方。
首先想到的就是設計一張表來保存分配的內存地址及對應的引用計數,重點是考慮在操作引用計數時,如何快速通過分配的內存地址定位到對應的引用計數變量。
這時也許有人會想到用一個哈希表之類的能夠快速查找的數據結構來保存內存地址和引用計數,還有沒有更快的方法呢?
更快的方法就是通過內存地址直接就可以訪問引用計數,這就要求引用計數保存在和分配的內存連續的空間上。但問題又來了,系統提供的內存管理算法并沒有留下可以保留引用計數的位置,要實現這樣的功能就必須寫一個自己的內存管理算法。
由于是在應用程序層,寫一個內存管理算法實際上還是需要先向操作系統申請一大塊內存,然后使用自己的內存管理算法來管理這塊內存,問題是如何知道需要向操作系統申請多少內存呢?也許目前需要1兆內存,但下個版本也許又需要2兆內存,總之內存的需求是變化無常的,使用自己的內存管理算法在實際應用中必然存在浪費的情況,所以這種方法實現起來不能令人滿意。
難道又退回到用哈希表嗎?用哈希表在每次指針賦值時,增加引用計數需要進行哈希表的查找,對一個賦值語句來說,開銷實在太大了,自己寫內存管理算法也行不通,所以還是想想有沒有別的方法吧。那么,可不可以繼承系統的內存管理算法呢?
由于系統的內存管理沒有在管理上給分配的內存預留引用計數位置,但可以在分配給用戶使用的內存上自己預留引用計數的空間。比如在32位系統上,要想分配一個128 B的內存塊,那就應該分配一個132 B的內存塊,將內存塊前面4個字節留作引用計數,將第4個字節后的空間返回給程序使用。這樣當需要通過內存地址來操作引用計數時,直接就可以將指針地址向后移4個字節,然后在這4個字節上寫引用計數就可以了,這樣就可以設計一個用戶的內存管理函數如下。
#define INT_LEN 4
void *GC_Malloc(size_t size)
{
void *p = malloc( size + INT_LEN );
if ( p != NULL )
{
return (void *)((char *)p+INT_LEN);
}
return NULL;
}
當然還要設計一個對應的釋放函數如下。
void GC_Free(void *p)
{
void *pFree = (void *)((char *)p – INT_LEN);
free(pFree);
}
文章來源于領測軟件測試網 http://www.kjueaiud.com/