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: