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