next up previous contents
Next: Przydział i zwolnienie pamięci Up: Algorytm ``bliźniaków'' Previous: Rozwiązanie   Spis rzeczy

Struktury danych

Oto podstawowe struktury używane do obsługi systemu bliźniaków:

#define MAXORDER 10

struct free_area_t {            // bloki ramek o ustalonym rozmiarze
  struct list_head  free_list;  // lista wolnych obszarów o danym rozmiarze
  unsigned long*    map;        // mapa stanu `bliźniaków'
}

struct zone_t {                      // opis strefy
  (...) 
  unsigned long pages_min,           // progi ilości wolnych stron
                pages_low,
                pages_high;
  free_area_t   frea_area[MAXORDER]; // bloki o różnych rozmiarach 
  (...)
}

Aby sprawnie obsługiwać żądania przydziału i zwolnienia pamięci dla każdej grupy przechowywana jest mapa stanu bliźniaków (pole map ze struktury free_area_t). Dla każdych dwóch kolejnych bloków potrzebny jest 1 bit w tej mapie. Gdy jest on równy 0 oznacza to, że albo oba bloki są wolne, albo oba zajęte. Dzięki temu przy dealokacji pamięci wiemy czy nasz `brat bliźniak' jest wolny. Myślę, że lepiej wyjaśni to ilustracja:

\includegraphics{pic/figBuddy0.eps}
Ilustracja oranizacji bloków ramek o ustalonym rozmiarze
\includegraphics{pic/figBuddy1.eps}
Mapa stanu bliźniaków



Adam Koprowski 2001-12-18