Next: Realizacja
Up: Algorytm ``bliźniaków''
Previous: Struktury danych
  Spis rzeczy
Przydział pamięci realizowany jest przez funkcje:
unsigned long __get_free_pages(int gfp_mask, unsigned long
order);
Jest również zestaw makr będących rodzajem nakładki na tą funkcję i
ułatwiających jej wołanie w typowych przypadkach. Funkcja ta próbuje
przydzielić bajtów. Maska gfp_mask określa sposób szukania
wolnych ramek. Oto najważniejsze flagi:
Dotyczące stref przydziału:
- __GFP_HIGHMEM
- - strona z pamięci wyższej.
- __GFP_DMA
- - strona nadająca się do transferu DMA.
Dotyczące polityki przydziału:
- __GFP_WAIT
- - gdy ustawiona oznacza, że przy przydzieleniu pamięci
jądro może próbować zwolnić pamięć przez obudzenie wątku kswapd.
Wiąże się to oczywiście z przeszeregowaniem i w pewnych sytuacjach może być
niewskazane (obsługa przerwania, modyfikacja istotnych struktur jądra).
- __GFP_IO
- - czy w celu realizacji żądania można zainicjować
operację I/O w celu dokonania wymiany pewnych stron na dysk.
- __GFP_HIGH
- - żądanie najwyższego priorytetu (może uzyskać dostęp
do ramek ``rezerwowych'').
Na ogół używa się pewnych predefiniowanych masek złożonych z tych flag.
Najczęściej używane są:
- GFP_ATOMIC = (__GFP_HIGH)
- - nie zezwala na oczekiwanie i
zmianę kontekstu. Używane w procedurach obsługi przerwań i przy modyfikacji
krytycznych struktur danych.
- GFP_KERNEL = (__GFP_HIGH | __GFP_WAIT | __GFP_IO |
__GFP_FS)
- -
żądanie ze strony jądra z możliwością oczekiwania i zmiany
kontekstu. Używane w większości wypadków gdy ścieżka wykonania procesu
użytkownika jest w jądrze.
Analogicznie funkcje zwalniające przydzieloną wcześniej pamięć to:
void free_pages(unsigned long addr, unsigned long order);
void __free_pages(struct page *page, unsigned long order);
Oto jak obrazowo działa przydział i zwalnianie pamięci:
Realizacja prośby o przydzielenie bloku 4 ramek
Zwolnienie ramki o numerze 2
Next: Realizacja
Up: Algorytm ``bliźniaków''
Previous: Struktury danych
  Spis rzeczy
Adam Koprowski
2001-12-18