標籤

2013年9月3日 星期二

link list-小專題-記憶體管理-best fit allocation

// allocate a memory in a linked list by best fit
MemInfo *best_fit_mem_alloc(unsigned size)
{
   MemInfo *best_fit = NULL, *data, *rush;
   // record the smallest difference
   int smallest_diff = INT_MAX;
   // assigned this from head node for un-used memory
   rush = head_free;
   // find out the best fit
   while (rush != NULL) {
      if (rush->size > size &&
                (rush->size - size) < smallest_diff) {
         smallest_diff = rush->size - size;
         best_fit = rush;
      }
      rush = rush->next;
   }
   // if we could find out the best fit
   if (best_fit != NULL) {
      // allocate a memory
      data = (MemInfo*) malloc(sizeof(MemInfo));
      data->begin = best_fit->begin;
      data->size = size;
      if (best_fit->size > size) {
         best_fit->begin += size;
         best_fit->size -= size;
      }
      else {
         // jusdge if this is head
         if (best_fit == head_free)
            head_free = best_fit->next;
         else
            best_fit->prev->next = best_fit->next;
         // if this is not tail
         if (best_fit->next != NULL)
            best_fit->next->prev = best_fit->prev;
         free(best_fit);
      }
   }
   return (data);
}
基本上best fit和first fit整體的程式邏輯是相同的,唯一不同的地方就是前面要尋找出最適合大小的size的node而已。因此這邊就導入了一個pointer: rush專門用來當成是迴圈從head跑到最後。唯有這種方式才能找到最適合大小的size。

因此我們修改下while的條件為rush != NULL表示rush要從頭跑到尾,然後best_fit的指標就是專門記載"目前最適合的node"的位置,我們並添加了一個smallest_diff就是專門記載"目前最適合的node"的size和我們需要大小的差異。差異越小的越是滿足最適合大小的要件:
   while (rush != NULL) {
      if (rush->size > size &&
                (rush->size - size) < smallest_diff) {
         smallest_diff = best_fit->size - size;
         best_fit = rush;
      }
      rush = rush->next;
   }
所以我們這邊就多添加了一個if就是專門記載best_fit以及smallest_diff,記錄最適合大小的pointer以及size差異值。如果目前的node: rush的size比我們要allocate的size還大,並且size的差異呢,還比上一筆best_fit的差異還小的話,那麼它就會比上一筆best_fit還更適合當最適合大小的node。這邊的邏輯便然是如此。

接下來的程式就會和first fit是一模一樣的做法,詳情就請參考上一篇的first fit allocation。

沒有留言:

張貼留言