[OSy] Shrnuti OSu
Martin Decky
decky at d3s.mff.cuni.cz
Wed May 19 21:51:32 CEST 2010
Vazeni kolegove,
predmet Operacni systemy je (alespon co se tyce semestralnich praci) pro
tento akademicky rok uzavren. Proto bych se s Vami jeste rad podelil o
komentar ke trem prohreskum, ktere jsme jednotlivym skupinam v hodnoceni
praci vytykali nejcasteji.
Nemohu ale zacit negativne, protoze hned dvema skupinam se letos
podarilo dosahnout plneho poctu bodu (a dve dalsi se teto mete vyrazne
priblizily), coz je urcite duvod k pochvale. Nyni tedy k tem mene
prijemnym poznamkam:
1) Nedodrzovani jednotneho coding stylu, nekonzistentni pojmenovavani
identifikatoru, nekonzistentni zpusob komentovani, neuklizeny kod
"zableseny" zakomentovanym mrtvym kodem
V pripade jednoclennych projektu nemusi byt dodrzovani vhodneho coding
style a uhlednych zdrojaku tak zasadni problem, ale u tymove prace
rozsahu semestralky z OSu uz bylo patrne, ze neprehlednost zdrojaku
vyrazne rostla prave tam, kde byly v implementaci nejvetsi problemy.
Pochopitelne nelze rici, ze by subjektivne horsi esteticke kvality
zdrojaku nutne vedly k vetsimu poctu chyb, ale neprehledne zdrojove kody
urcite zpusobuji, ze se chyby hure hledaji. Zatimco krasne upraveny,
opticky prehledny a na prvni pohled pochopitelny zdrojak (kratke
"samovysvetlujici" funkce, rozumne popisne nazvy promennych, dodrzovani
konvenci atd.) se snadno cte a snadno se o nem rozhoduje, zda je
spravne, neprehledny zdrojak muze vest na efekt "hledani jehly v kupce
sena".
2) Netestovani argumentu systemovych volani
Nesvar, ktery se objevoval bohuzel i u jinak bezproblemovych skupin.
Jeden z hlavnich duvodu rozdelovani softwaru na jadro operacniho systemu
a uzivatelske procesy je prave "opevneni" nejkritictejsich casti celeho
softwaroveho stacku pred zamernymi i nahodilymi chybami. Bez nutnosti
tohoto "opevneni" by v mnoha pripadech davalo mnohem vetsi smysl mit
pouze jeden rezim procesoru, usetrit tak na overheadu systemovych volani
a vubec zadne komplikovane rozdeleni kernel/uspace nemit. Systemova
volani predstavuji vstupni branu z "nebezpecneho sveta" uzivatelskeho
prostoru do "bezpecneho sveta" kernelu a jako takova musi byt nalezite
ochranena. Bez toho nema vubec cenu vynakladat celou tu namahu.
Neni proto dost dobre mozne predavat pomoci systemoveho volani nejaky
ukazatel na datovou strukturu a ten potom v kernelu bezelstne pouzivat,
aniz by si kernel vubec overil, zda ukazatel miri na dostatecne velkou a
spravne namapovanou pamet procesu (a ne napriklad nekam do kernelove
pameti, kde se muze neco prepsat, nebo na nenamapovanou pamet, coz pri
naslednem pristupu zpusobi pad celeho kernelu).
I pokud tento zakladni test provedete, stale to nestaci k tomu, aby bylo
mozne verit, ze datova struktura s kernelovymi daty ulozena v
uzivatelskem prostoru obsahuje konzistentni zaznamy, se kterymi
uzivatelsky proces zamerne/nahodne nejak nemanipuloval. Mimochodem,
porovnani nejake magic hodnoty sice vypada na prvni pohled OK, ale
skutecnou konzistenci cele struktury to stale nezarucuje.
Jeden z mala temer neprustrelnych zpusobu ochrany pred temito problemy
je predavat do uzivatelskeho prostoru pouze ciselne identifikatory
(handlery) kernelovych dat. Je-li to jen trochu mozne, tak by tyto
handlery mely zit v izolovanem jmennem prostoru pro kazdy proces
(alternativne je mozne overovat spravneho vlastnika handleru) a mely by
byt unikatni v case.
3) Extremne slozite mechanismy synchronizace
Mnohe skupiny jakoby dovedly az do extremu obecny poznatek, ze spravna
synchronizace nad sdilenymi daty je slozita vec. I jednoduche pripady,
ktere se daly vyresit naprosto elegantne s pouzitim jednoho nebo dvou
mutexu, pripadne za pouziti atomickych citacu (treba klavesnicovy
buffer), doslova utopily v neproniknutelne zmeti uspavani a probouzeni
vlaken, manualniho vkladani a vytahovani vlaken z ruznych planovacich
front a obcas dokonce pouziti aktivniho cekani.
Pokud vite, ze Vase sychnronizacni primitivum (mutex, semafor,
podminkova promenna apod.) je naimplementovano spravne a ma rozumne API,
potom je jeho pouziti v miste, kde je fakticky potreba neco
synchronizovat, typicky velmi jednoduche, primocare a predevsim
prehledne. Lze doslova na prvni pohled poznat, ze se synchronizuje
spravne, protoze veskera slozitost problemu je odabstrahovana pryc, mimo
business kod.
Je to podobne jako z estetikou zdrojaku: Slozite a tezko pochopitelne
synchronizacni konstrukce v kodu, ktery neslouzi primarne k
synchronizaci (ma jen tu "smulu", ze nejakou synchronizaci pristupu ke
sdilenym datum potrebuje), zpusobuji, ze je velmi slozite rozhodnout
(natoz "videt na prvni pohled"), zda je vse v poradku. Snadno se do
takoveho kodu nejakym rutinnim zasahem zanese chyba a i pri podrobnem
zkoumani muze dlouho unikat pozornosti.
Zaverem pevne doufam, ze i pres netrivialni mnozstvi prace, ktere jste
museli na dokonceni semestralek z OSu vynalozit, Vam tato zkusenost neco
pozitivniho dala. Preji Vam hodne uspechu v dalsim studiu!
M.D.
More information about the NSWI004
mailing list