10 11 newssykernel PL

background image

aktualności

10

grudzień 2007

dział prowadzi: Remigiusz Modrzejewski l rem@o2.pl

Kernel

aktualności

11

www.lpmagazine.org

dział prowadzi: Remigiusz Modrzejewski lrem@o2.pl

Kernel

O dokumentacji

Michael Kerrisk, wieloletni opiekun

dokumentacji Linuksa, wygłosił cieka-

wą mowę na szczycie LinuxConf Europe

2007. Traktował w niej o pozytyw-

nym wpływie dokumentacji na jakość

kodu, a pisząc strony podręcznika do róż-

nych podsystemów znalazł w swojej ka-

rierze kilka poważnych błędów. Naj-

poważniejszym z nich był błąd w spli-

ce(), bo można było dzięki niemu zawie-

sić program w stanie, w którym nie dało

się go zabić. Dawało to łatwą możliwość

wykonania piorunującego lokalnego ata-

ku DOS. Większe znaczenie, a także bar-

dziej specyficzne dla piszących dokumen-

tację mają znalezione przez niego niedo-

ciągnięcia projektowe. Przykładem,

którym się posłużył były mlock()

i remap_file_pages(). Oba wołania syste-

mowe przyjmują, jako wielkość pamię-

ci dowolną liczbę, potem zaokrąglają do

pełnej strony. Problem polega na tym, że

mlock() zaokrągla w górę, a remap_fi-

le_pages() w dół. Niekonsekwencje

takie, jak ta utrudniają korzystanie z in-

terfejsów, co w efekcie może prowadzić

do błędów w korzystającym z nich ko-

dzie. Prawdą jest, że dokumentowanie

to jeden z podstawowych etapów każde-

go projektu, a Linux powstaje poprzez

burzliwe dyskusje i szybkie implemen-

tacje. Może warto jednak częściej przy-

siąść i opisać spokojnie, co zamierza się

wykonać.

Sysctl() znowu w niełasce

Już w jądrze 2.6.19 miało dojść do histo-

rycznego aktu – usunięcia wołania sys-

temowego sysctl(). Historycznego nie ze

względu na wagę tego wołania, lecz zła-

manie ABI przestrzeni użytkownika. To

według założeń powinno działać wiecz-

nie, ale samo sysctl() przegrało konkuren-

cję z podsystemem /proc/sys i praktycznie

nigdy przez nikogo nie było wykorzysty-

wane. Jako kod jest nieużywany

i rzadko przeglądany, a więc może

w przyszłości ulec jakiemuś przypadko-

wemu uszkodzeniu, a to może zaowoco-

wać poważnym błędem, szkodzącym ca-

łości jądra. Dlatego też Eric Biederman

podjął kolejną próbę uporania się z tą za-

szłością i zaproponował oznaczenie sy-

sctl(), jako przeznaczonego do usunięcia

w 2010 roku. I znowu spotkał się z pro-

testami osób, trzymających się kurczo-

wo zasad. Jak wypomniał Alan Cox, jeśli

ktoś ma praktyczny powód, by w ogóle

korzystać z sysctl(), to jest on na tyle po-

ważny, by nie móc z niego zrezygnować

cokolwiek by się nie działo.

Z drugiej strony Andrew Morton przeko-

nuje, że samo oznaczenie nie jest niczym

strasznym. Przez kilka lat osoby, używa-

jące tego wołania będą konfrontowane

z ostrzeżeniami o planowym usunięciu

– na na koniec zawsze się będzie można

wycofać. Choć dobrze byłoby mieć za

sobą te cykliczne burze w szklance wody.

Większe strony, większe problemy

J

ak powszechnie wiadomo, Linux bardzo
różni się od systemu Windows, a jedną

z poważniejszych niskopoziomowych róż-
nic jest zarządzanie pamięcią. Ostatnio
użytkownicy, kupujący komputery z komer-
cyjnymi systemami na pokładzie przekonu-
ją się, że mimo posiadania 4GB RAM-u
system ,,widzi” jedynie około 3GB. Co cie-
kawe problem ten występuje także w opar-
tym na Uniksie – Apple OSX. Jednak po-
ważniejszym problemem jest fragmentacja
pamięci. Użytkownicy Windows, którym
zdarza się trzymać system włączony całymi
tygodniami po pewnym czasie obserwują
coraz gorszą jego pracę. Ostatecznie nastę-
pują problemy z alokowaniem pamięci do
programów, mimo iż wolna jej ilość wie-
lokrotnie przewyższa potrzeby. Dzieje się
tak, dlatego że programy potrzebują dużych
i ciągłych obszarów pamięci, te jednak są
poszatkowane przez mniejsze zmienne,
a żaden z tych problemów nie dotyczy Li-
nuksa. Dzieje się tak ze względu na spo-
sób, w jaki Linux zarządza pamięcią. Me-
chanizm nazywa się pamięcią wirtualną,
co sugeruje od razu metodę jego działa-
nia. Programy egzystują w wirtualnej prze-
strzeni adresowej – niezależnej od rzeczy-
wistego rozkładu komórek pamięci w sprzę-
cie. Dzięki temu 32-bitowe programy nadal
są ograniczone do 4GB pamięci, ale każdy
program może zająć swoje osobne 4GB. Nie
grozi również brak ciągłej pamięci – pro-
gram zawsze ją dostanie. Programista nie
musi sobie zdawać sprawy, że to jądro skle-
ja ją z nieciągłych kawałków rzeczywistej
pamięci. Mechanizm jest stabilny i dzia-
ła poprawnie już od wielu lat, z pewnymi
zmianami praktycznie od początku. W prze-
ciągu tych lat ilość RAM-u jaką przecięt-
nie dysponujemy zwiększyła się tysiąckrot-
nie, lecz obsługiwana jest nadal tak samo.
W szczególności oznacza to wykorzysty-
wanie sprzętowych stron pamięci o rozmia-
rze 4 kilobajtów. Stronicowanie co praw-
da większości osób kojarzy się wyłącznie
z przestrzenią wymiany (ang. swap space
zarówno plik, jak i partycja), lecz w Linuk-
sie jest to właśnie podstawowy mechanizm
zarządzania wszelką pamięcią.

Mijają lata, a megabajty przekształci-

ły się w gigabajty, natomiast system zarzą-
dzania pamięcią zaczyna sapać. Nie tyl-
ko ze względu na samą obsługę pamię-
ci, która wciąż jest akceptowalnym narzu-

tem. Największym problemem są urządze-
nia wejścia/wyjścia. Karty sieciowe, prze-
znaczone do wysokich transferów w celu
ograniczenia liczby pakietów, a więc i prze-
rwań – stosują wielkie ramki. Aby przesłać
taką wielką ramkę potrzebny jest ciągły ob-
szar fizycznej pamięci, ewentualnie podzie-
lony na jakąś ograniczoną ilość mniejszych.
Systemy plików potrzebują większych blo-
ków na indeksy, aby zmniejszyć ilość ope-
racji wyszukiwania (ang. seek – najkosz-
towniejsza czasowo operacja wykonana
przez dysk) przy dostępie do dowolnego
pliku. Ostatecznie TLB (ang. Translation
Lookaside Buffer
– bufor, odwzorowujący
adresy wirtualne na fizyczne wykorzysty-
wane przez pamięć podręczną) w nowych
procesorach Intel ma zaledwie 128 wpisów.
Przy czterokilobajtowej stronie pozwala to
wykorzystać zaledwie pół megabajta cache-
'u, a procesory te posiadają go nawet osiem
razy więcej.

Rozwiązanie nasuwa się samo – pod-

nieść rozmiar tych stron i po kłopocie. Roz-
sądny rozmiar wydaje się oscylować, w za-
leżności od zastosowania, między 8 a 32KB.
Tu jednak niespodzianka – procesory x86
takich rozmiarów nie obsługują. Wielkość
strony ustawić można na kilka różnych
potęg dwójki, lecz nie ma nic między 4KB
a 2MB. Niestety, pomysł ten odpada w przed-
biegach. Alokując po 2MB niezależnie, czy
potrzebny jest megabajt czy kilobajt bar-
dzo szybko zmarnowalibyśmy cały dostęp-
ny RAM. Potrzebne jest rozwiązanie cał-
kowicie programowe, a do tego najlepiej
by było niezależne od tego, na jakiej ar-
chitekturze działa. Oczywiście osoby zaan-
gażowane w rozwój systemu zarządzania
pamięcią zdawały sobie z tego sprawę od
dawna. Spotkali się niedawno na szczycie
w Cambridge, gdzie ustalili kilka sensow-
nych wyjść z tej sytuacji. Jednak, jak się
okazało później, każdy ustalił swoje – bez
wspólnego consensusu – przybliżę te po-
ważniejsze.

Najświeższy pomysł pochodzi od czło-

wieka najdłużej zaangażowanego – Andrea
Arcangeliego, twórcy znacznej części aktu-
alnego kodu pamięci wirtualnej. Jego łatka
CONFIG_PAGE_SHIFT jest realizacją pro-
stego pomysłu, sugerowanego już wcze-
śniej do jądra 2.4, pod wiele mówiącą na-
zwą large PAGE_SIZE. Jak łatwo się do-
myślić, to chodzi o separację pojęcia strony

background image

aktualności

10

grudzień 2007

dział prowadzi: Remigiusz Modrzejewski l rem@o2.pl

Kernel

aktualności

11

www.lpmagazine.org

dział prowadzi: Remigiusz Modrzejewski lrem@o2.pl

Kernel

Sprytniejsze dławienie

Kiedy proces zapisuje coś na dysku, w rze-

czywistości oznacza jedynie pewną ilość

stron pamięci jako brudne (ang. dirty pa-

ges) – przeznaczone do transferu na fizycz-

ne urządzenie. Procesy mogą tworzyć brud-

ne strony w znacznie szybszym tempie niż

urządzenia je obsłużyć, stąd też pojawia się

konieczność dławienia zapisu (ang. write

throttling). Do tej pory działała ona na pro-

stej zasadzie – jeśli ilość brudnych stron w

systemie przekroczy jakiś z góry ustalony li-

mit, proces chcący zabrudzić kolejną stronę

zostaje uśpiony, aż trafi ona na dysk. Jednak-

że w praktyce często jest to zbytnie uprosz-

czenie. Najłatwiej sobie wyobrazić sytu-

ację, gdy mamy dwa dyski o różnych szyb-

kościach. Do jednego powstaje kolejka na

tyle potężna, że usypiane są procesy chcą-

ce pisać na prawie bezczynny drugi dysk.

Stąd też Peter Zijlstra zaproponował łatkę

wprowadzającą podział tego limitu na osob-

ne dla każdego urządzenia. Stworzył ponad-

to mechanizm adaptujący te limity do rze-

czywistych prędkości urządzeń – jeśli ja-

kieś urządzenie transferuje brudne strony

szybciej/wolniej niż to by wynikało z jego

przydziału pamięci, to zostaje on odpowied-

nio zwiększony/zmniejszony. Łatki trafiły do

testów w gałęzi

-mm

, gdzie ponoć wykaza-

ły skłonność do zawieszania systemów. Jed-

nak pomysł wydaje się dobry i jak wykazały

testy – skuteczny, więc po poprawieniu błę-

dów pewnie wejdzie do gałęzi stabilnej.

C++ jest straszne

Linus Torvalds (tłumaczenie własne):

,,C++ to straszny język. Najstraszniej-

szy ze względu na wielu poniżej-przecięt-

nych programistów w nim programują-

cych. [...] Szczerze, nawet gdyby wybór C

miał służyć jedynie odstraszeniu programi-

stów C++, to samo w sobie byłoby wystar-

czającym powodem by wybrać C”. Następ-

nie wypomina niestabilność i nieprzeność

STL i Boost oraz kiepską wydajność mode-

li abstrakcyjnych. Czyżbym ja też był poni-

żej przeciętnej?

http://article.gmane.org/

gmane.comp.version-control.git/57918

Kto napisał 2.6.23

Na pierwszym miejscu wypływa Ingo Mol-

nar z 152 przyjętymi łatkami. W znacznej

części jest to, dość szybko przyjęty, opisy-

wany już wcześniej CFS oraz... Natychmia-

stowe w nim poprawki. Najwięcej zmienio-

nych linijek przypadło Adrianowi Bunko-

wi, który zajmuje się usuwaniem z jądra ko-

du już niepotrzebnego. Jeśli chodzi o firmy,

na pierwszym miejscu plasuje się niezmien-

nie Red Hat, odpowiadający za około 12%

zmian w jądrze. Więcej linijek zmieniają

jednak hobbyści – 9% łatek, jednak aż 15%

zmian w liniach należy do nich. Sumarycz-

nie do jądra przybyło 430 000 linijek kodu,

ubyło zaś 406 000. Według uproszczonego

modelu COCOMO (http://pl.wikipedia.org/

wiki/COCOMO) samo stworzenie nowych

linijek powinno zająć 2670 osobomiesięcy.

w jądrze od strony w procesorze. Realizacja
ma być prosta – kilka sąsiednich stron fizy-
cznych tworzy jedną stronę logiczną, a wszyst-
kie rozmiary są stałe. W sposób łatwy, lekki
i przyjemny rozwiązuje to wspomniane pro-
blemy (poza niedoborami TLB w Intelach).
Prowadzi jednak do nadmiernego marno-
trawstwa i wewnętrznej fragmentacji. Pro-
blemy te mają być pominięte poprzez me-
chanizm dzielenia mało używanych stron,
lecz nie ma jeszcze do niego ogólnego
przekonania.

Od dawna zaimplementowane jest w ją-

drze trzymanie grup stron, jako sąsiadów
w pamięci fizycznej, a jest to wykorzysty-
wane w niektórych sterownikach, lecz ra-
czej nieśmiało – nikt nie gwarantuje moż-
liwości utworzenia takiej grupy (informa-
cje o aktualnie istniejących znajdziemy
w pliku /proc/buddyinfo). Stąd też Mel Gor-
man od jakiegoś czasu pracuje nad unika-
niem fragmentacji, a ponad dotychczasowe
rozwiązania wnosi pomysł odróżniania tych
stron, które nie mogą być przeniesione od
tych, które mogą być. W momencie alokacji
grupy stron, jeśli zabraknie na nią sąsied-
nich stron wolnych, to system spróbuje po-
szukać sąsiednich stron wolnych i reloko-
walnych, a zrezygnuje dopiero nie znajdu-
jąc takich. Efekty jego pracy są sukcesyw-
nie, bo po kawałku wprowadzane do kolej-
nych wersji jądra.

Uzupełnieniem pracy Gormana ma być

zestaw łatek Cristopha Lametera, ponie-
waż zaimplementował mmap(), operują-
cy na blokach większych niż jedna stro-
na. Rozwiązuje to większość problemów
z wejściem/wyjściem i systemami plików.
Rozwiązanie to zostało poważnie oprote-
stowane. Do poprawnej pracy wymaga cią-
głej dostępności wielokrotnych stron pa-
mięci, której nikt nie gwarantuje. Nawet z
uwzględnieniem unikania fragmentacji sys-
tem może dojść do stanu, w którym nie bę-
dzie mógł przenieść nic więcej by utworzyć
nową grupę.

Łatwo sobie wyobrazić wykorzystanie

takiej podatności w ataku DOS, prowadzą-
cym do całkowitego paraliżu kluczowych
części jądra. Dlatego też, jeśli ten zestaw
łatek zostanie włączony do stabilnego ją-
dra, to będzie od początku dyskryminowa-
ny i obarczony poważnymi ostrzeżeniami
o wszystkich niebezpieczeństwach. Dlatego
pewne nadzieje na dziś wiąże się z fsblock
Nicka Piggina. Wśród zmian przez niego
wprowadzanych znajduje się umożliwienie

systemom plików korzystania z większych
bloków. Nie ma tu jednak wymogu dostęp-
ności ciągłych grup stron. Zamiast tego uży-
wane jest vmap(), aby udostępnić wirtualnie
ciągłą przestrzeń dla vmalloc(). Technika ta
wykorzystywana jest już przez XFS. Jednak
vmap() jest kosztowne samo w sobie, nie
oferując nic by usprawnić wejście/wyjście.
Dlatego też Nick planuje wykorzystywa-
nie rzeczywistych grup stron, zostawiając
vmap(), jako wyjście awaryjne w razie ich
niedostępności. Jednak łatka, którą przygo-
tował do tej pory już jest przerażająco wiel-
ka. Do tego są to zmiany fundamentalne
i dotykające bardzo wielu miejsc w kodzie
jądra. Jedynym systemem plików, dostoso-
wanym do pracy z nią jest do tej pory naj-
prostszy Minix, co i tak wymagało dość du-
żo pracy. Mimo relatywnie ciepłego przy-
jęcia minie dużo czasu zanim zobaczymy
ostateczną wersję fsblock.

Powstają i upadają inne pomysły, będą-

ce bardziej lub mniej podobnymi do przed-
stawionych. I choć dyskusja na LKML-u
(ang. Linux Kernel Mailing List, miejsce
dyskusji twórców jądra) w ostatnich dniach
ciągnęła się przez kilkaset postów, nadal
nie wiadomo, który kierunek będzie osta-
tecznie obrany. Sprawy nie ułatwia sam
Linux, a można powiedzieć, że staje oko-
niem. Przekonuje, że to na konstruktorach
procesora leży obowiązek wyposażenia go
w TLB odpowiedni do wielkości pamięci
podręcznej.

Aktualne podejście z czterokilobajto-

wymi stronami, czasami grupowanymi w pa-
ry, wydaje mu się słuszne i stabilne. Proble-
my z wydajnością powinno się rozwiązy-
wać, przechodząc na architekturę x86_64.
Na koniec, jak zawsze nie przebierając
w słowach, nazywa ludzi propagujących no-
we pomysły szaleńcami, bo nie powinno
się opierać projektów na sugestiach sza-
leńców. Z przyczyn obiektywnych należy
przypuszczać, że jakaś wariacja, któregoś
z przedstawionych pomysłów wejdzie kie-
dyś w życie. Nie stanie się to za szybko,
a nawet bez sprzeciwu Torvaldsa drobne
zmiany w systemie pamięci wirtualnej nig-
dy nie są przyjmowane szybko. Zmiana tak
fundamentalna będzie potrzebowała wielu
miesięcy testów zanim zostanie zaakcep-
towana.

http://lwn.net/Articles/250335/
http://lwn.net/Articles/250466/


Wyszukiwarka

Podobne podstrony:
Dobrostan zwierząt 5 10 11 5fantastic pl
elektromag pytania 10 11 www przeklej pl
TI 10 01 11 20 T pl
TI 10 01 11 09 T B pl
TI 10 98 11 18 B pl
2004 10 11 prawdopodobie stwo i statystykaid 25166
Dietetyka wd9,10,11 Otyłość
Harmonogram 10 11 Lab MWNE
25 10 11
Zad 25 10 11, AGH Imir materiały mix, Studia
10.11.2010, prawo administracyjne ćwiczenia(2)
10.11.2009, semestr 1, makro i mikro ekonomia
MP 10-11 Z dz w0. Istota MP
test dla IIIr sem letni 10 11
Psychologia społeczna wykład$ 10 11
10,11,12
Kolokwium MzS I P 10 11
Anatomia 10 11 02

więcej podobnych podstron