Zadanie 16

Zadanie dotyczy przydziału pamięci dla jądra.

Dotychczas żadanie przydzielenia pamięci jest zaokrąglane do najmniejszego bloku o rozmiarze potęgi dwojki w jakim się mieści, pozostała część jest tracona. Proponuję zreorganizować algorytm przydziału pamięci dla jądra tak by, ramka przydzielona dla jądra zarządzana była zgodnie z tzw. strategią buddy. Dotyczy to żądań przydziału obszarów mniejszych od ramki, pozostałe proponuję realizowac tradycyjnie.

Szkic algorytmu buddy.

Obszar do zarządzania ( w naszym przypadku ramka ) jest dzielony na wzglednie małe bloki ( np. 64 Bajty ) i kazde żądanie jest zaokrąglane do minimalej liczby bloków w jakiej się mieści ( tracimy co najwyżej jeden blok niewykorzystanej pamięci ). Początkowo cała pamięć jest pusta ( jeden obszar zawierający wszystkie bloki). W dowolnym momencie po otrzymaniu żądania przydziału pamięci znajdujemy najmniejszy wolny obszar, w którym dane żądanie uda się pomieścić. Zajmujemy miejsce na jego początku. Jeżeli po wykonanej allokacji jakiś obszar jest częściowo zarezerwowany i częściowo pusty dzielimy go na połowy i rozpatrujemy powstałe części. Części całkowicie puste dopisujemy do listy wolnych obszarów odp. rozmiaru (całkowicie pełne do pełnych). Przy zwalnianiu obszaru rozpatrujemy fragmenty, które powstały w momencie jego allokacji. Jeżeli odp. pary powstałe wcześniej z rozbicia większego fragmentu są niezarezerwowane, łączymy je i dopisujemy na listę.

Przyklad.

Przypuśćmy że zarządzamy pamięcią wielkości 16 bloków, pamięć ta jest na razie niezarezerwowana. Po zrealizowaniu przydziału na 5 bloków powinny powstać następujące obszary:
obszar zarezerwowany rozpoczynający się od indeksu 0 o wielkości 5 bloków,
obszary wolne ( od indeksu 8 - o wielkości 8) , ( 6 - 2), (5 - 1)
W momencie zwalniania znów powinien być dostępny duży obszar o rozmiarze 16 bloków (jeżeli nie było innych allokacji).

Uwagi techniczne.

Nasz algorytm w razie potrzeby powinien przydzielać sobie ramki z przestrzeni użytkownika, a puste zwracać. Procedury przydziału pamięci dla jądra znajdują się w pliku 'mm/kmalloc.c'. Zadanie do wykonania to zmodyfikowanie procedur kmalloc(), kfree() oraz ewentualnie kmalloc_init().


autor: Grzegorz Zaprzałek