[OSy] Hodnoceni OSu
Martin Decky
decky at dsrg.mff.cuni.cz
Tue May 27 15:44:24 CEST 2008
Vazeni kolegove,
zhruba polovina skupin jiz obdrzela hodnoceni sve semestralni prace
z OSu, zbyle skupiny jiz mame take ohodnocene, zbyva jen hodnoceni
rozeslat. Vzhledem k tomu, v jak dlouhem casovem intervalu hodnoceni
probihalo, tak se mohlo ojedinele stat, ze jsme prehledli nejakou
skutecnost, na ktere jsme se napriklad ustne domlouvali pri odevzdani.
V takovem pripade se samozrejme ozvete.
Obecne jsme se snazili neohybat pravidla nastavena jiz na zacatku
semestru, tedy doplneni semestralky po datu odevzdani jsme akceptovali
jen v pripade chybejicich casti dokumentace ci drobnych oprav (nektere
skupiny mely tendenci za drobnou opravu vydavat i pomerne razantni
prepsani znacne casti kodu ..).
Naopak jsme se snazili kladnymi body ohodnotit to, co jste udelali nad
ramec zadani nebo obzvlaste hezky. Kladne body jsme pridelovali zhruba
4x vetsi nez jsme meli puvodne v planu, coz mnohym skupinam
vykompenzovalo bodovou ztratu.
Zakladnim cilem bylo, abyste se na semestralkach neco naucili. Proto
prikladam strucny seznam nejcasteji se opakujicich chyb:
1) Nedodrzovani jednotneho coding style, konzistentniho pojmenovavani
identifikatoru, neprehledny strom zdrojaku apod.
V pripade malych jednoclennych projektu toto nemusi byt problem, ale u
prace tohoto rozsahu uz bylo patrne, ze clovek, ktery kod sam nepsal, se
v neprehledne adresarove strukture (mnohdy byly kernelove i user
zdrojaky v jednom adresari) a jednotne uprave zdrojaku slozite
orientuje. Mala cast skupin vsak mela upravu zdrojaku vzorovou a dokonce
meli svuj coding style dokumentovany.
2) Opakovana implementace spojovych seznamu.
Stale se opakujici implementace logiky spojovych seznamu pro kazdou
novou strukturu, kterou je potreba v seznamech udrzovat, byla mnohdy az
zarazejici. Pritom postupy, jak elegantne vytvaret genericke datove
struktury, existuji -- at uz to je metoda generujicich maker (obdoba
sablonovych STL kontejneru z C++) nebo klasicka (ale velmi prehledna)
implementace v jadre Linuxu (viz
http://isis.poly.edu/kulesh/stuff/src/klist/).
3) Netestovani argumentu systemovych volani
Nesvar, ktery se opakoval u velke casti skupin. Prestoze jsme v zadani
nepozadovali nejakou skutecnou "security", kazdy kernel musi byt napsan
tak, aby byl odolny vuci nahodnym nebo zamernym chybam v uzivatelskem
prostoru.
Neni proto dost dobre mozne predavat systemovemu volani nejaky ukazatel
na datovou strukturu a ten potom v kernelu bezelstne pouzivat, aniz by
si kernel vubec overil, zda ukazatel miri na korektne namapovanou pamet
procesu (a ne napriklad nekam do kernelove pameti, kde se muze neco
prepsat). I pokud tento zakladni test provedete, stale to nestaci
k tomu, aby bylo mozne verit, ze datova struktura s kernelovymi daty
(ovsem ulozena v uzivatelskem prostoru) obsahuje konzistentni zaznamy
(porovnani nejake magic hodnoty je sice hezke, ale stale nezarucuje, ze
uzivatelsky proces data nepodvrhl). To, ze pro user space je pointer na
kernelovou pamet jen logicky handle, take nic nevyresi, protoze i handle
se da podvrhnout.
Jedna z mala rozumnych cest je tedy ta, ze user space bude od kernelu
dostavat pouze ciselne identifikatory kernelovych struktur (skutecne
handle) a kernel si bude u kazdeho procesu evidovat, ktere
identifikatory mu patri. V pripade predavani ukazatelu na pole, retezce
atd. je potreba upravit spravu pameti, aby "vybehnuti" kernelu
z namapovane uzivatelske pameti zpusobilo pouze "potrestani" zleho
procesu a ne pad kernelu.
(Z podobneho soudku byly pripady, kdy prepnuti z kerneloveho do
uzivatelskeho rezimu procesoru pri spousteni procesu nebylo provedeno uz
v kernelu, ale az v ramci uzivatelske knihovny librt. Asi neni potreba
dopodrobna rozvadet, co to dovoluje procesu, ktery se nechce nechavat
omezovat uzivatelskym rezimem ..)
4) Prevod thread_sleep() na thread_usleep() nasobenim milionem
Prestoze to na prvni pohled bude fungovat, tak smysl existence funkce
thread_sleep() je ten, aby se dalo cekat treba den nebo tyden (coz neni
zas tak neobvykly pozadavek). V takovem pripade by ten trivialni prevod
sekund na mikrosekundy zpusobil preteceni.
Moralni pouceni je to, ze v API operacniho systemu vetsinou nejsou
zbytecne veci, ktere lze trivialne nahradit necim jinym. Proto je
potreba zamyslet se i nad implementaci na prvni pohled jasnych veci.
5) Dokumentace -- chybejici provazanost
Bez ohledu na kvalitu rucne psane a referencni dokumentace jsme se casto
setkavali s tim, ze tyto dve casti byly naprosto oddelene, jakoby ani
nepopisovaly stejny projekt. Smysl rucne psane dokumentace je pohled na
architekturu celeho systemu "z prvniho patra", ale mely by z ni vest
odkazy na casti referencni dokumentace, kde se clovek dozvi konkretni
podrobnosti.
M.D.
More information about the NSWI004
mailing list