[OSy] Zadani 1. semestralni prace

Tomas Bures bures at nenya.ms.mff.cuni.cz
Mon Oct 17 11:44:25 CEST 2005


Dobry den,

toto je zadani pro skupiny resici 1. semestralni praci (tj. zakladni 
kernel). To znamena, ze tuto semestralni praci vypracovavaji a nasledne 
prezentuji a odevzdavaji pouze skupiny PlVyZo, JeMiSu, CaHaSl (dle 
seznamu posilaneho kolegou Bulejem 12.10.).
Zadani druhe semestralni prace (tj. sprava pameti) bude nasledovat za 
ctyri tydny a zadani treti semestralni prace (coz bude vas pripad) bude 
nasledovat po druhe semestralni praci stejnym zpusobem.

S pozdravem,
Tomas Bures

Katka Cimova wrote:

> No tak teraz sa omluvam ak sa spytam uplnu hlupost, ale nerozumiem, 
> ako suvisi zadanie tejto semestralnej prace s preferenciami a 
> rozdelenim do skupin.
>
> Vdaka,
> K.Cimova
>
> On 10/17/05, *Lubomír Bulej* <bulej at nenya.ms.mff.cuni.cz 
> <mailto:bulej at nenya.ms.mff.cuni.cz>> wrote:
>
>     Dobry den,
>
>     v priloze najdete zadani 1. semestralni prace. Testy k 1.
>     semestralni praci
>     budou k dispozici behem pristiho tydne. Pripadne dotazy a
>     pripominky smerujte
>     prosim do konference.
>
>
>     Lubomir Bulej
>
>
>
>     Zadani 1. semestralni prace:
>     -------------------------------------------------
>
>       Cilem 1. semestralni prace je naprogramovat zaklad jadra operacniho
>       systemu, ktery bude pouzit pro navazujici semestralni prace. Zadani
>       ma formu rozhrani, ktere je nutno naimplementovat. K zajisteni
>     rozumne
>       urovne funkcnosti pro navazujici skupiny je nutne, aby implementace
>       prosla sadou testu, ktere overuji jeji funkcnost.
>
>       Zakladem jadra je minen kod, ktery poskytuje zakladni prostredky
>     pro
>       ladeni a budouci rozsireni. Ukolem tedy bude naprogramovat:
>
>         * zakladni vstupne/vystupni operace
>         * zakladni ladici prostredky
>         * obsluhu preruseni a vyjimek
>         * jednoduchy alokator pameti
>         * podporu pro vlakna
>         * jednoduchy planovac
>         * synchronizacni primitiva
>         * podporu pro casovace
>
>
>       Pri vypracovani muzete vychazet z vyukoveho jadra Kalisto a v
>     jeho kodu
>       postupne nahrazovat pomerne jednoduche a omezene implementace
>     nekterych
>       z vyse uvedenych casti jadra.
>
>       Pokud zadani nespecifikuje nejaky detail, je zavazne chovani, ktere
>       ocekavaji testy. Pokud testy dane chovani netestuji, zadani si podle
>       uvazeni dodefinujte a sve rozhodnuti zdokumentujte.
>
>
>       Poznamky k rozhranim
>       --------------------
>
>         V zadani naleznete primarne dva typy rozhrani k ruznym typum
>     objektu
>         a datovych struktur. Rozhrani se lisi v mire skryvani
>     implementacnich
>         detailu spravovanych objektu.
>
>         * Prvni typ rozhrani skryva implementacni detaily mene a
>     pracuje primo
>           s ukazateli na datove struktury. Entity spravovane timto
>     rozhranim maji
>           vetsinou staticky charakter, takze jsou alokovany uzivatelem
>     bud na
>           zasobniku nebo jako staticke promenne. Rozhrani poskytuje funkce
>           xxx_init, ktere slouzi k inicializaci datovych struktur a
>     xxx_destroy,
>           ktere slouzi k jejich "uklidu".
>
>           Je samozrejme mozne tyto entity alokovat i dynamicky, neni
>     to ovsem
>           prilis casty pripad a za alokaci a uvolneni pameti je zodpovedny
>           uzivatel.
>
>           Tento typ rozhrani rovnez typicky nevraci chybove kody pri
>     predani
>           neplatneho ukazatele na spravovany objekt, nebot chyba takoveho
>           charakteru je zpravidla fatalni (pro jadro). Pro ladici
>     ucely je vhodne
>           do volani funkci tohoto typu pridat otestovani platnosti
>     ukazatele
>           (non-NULL) a napr. otestovani integrity referencovane
>     struktury. Casto
>           se pro ladici ucely nekam do struktury objektu vklada
>     atribut, ktery
>           musi mit nejakou konstatni preddefinovanou ("magic") hodnotu.
>
>           Uvedeny typ rozhrani je pouzit napriklad pro vsechna
>     synchronizacni
>           primitiva a casovace.
>
>         * Druhy typ rozhrani skryva implementacni detaily vice, tedy
>     napriklad
>           to, ze pracuje s ukazateli. Uzivateli poskytuje obecny typ,
>     ktery
>           slouzi k identifikaci objektu, at uz je implementaci
>     rozhrani chapan
>           jako ukazatel, nebo jako identifikator. Rozhrani poskytuje
>     funkci
>           xxx_create, ktera slouzi k vytvareni a potazmo "aktivaci" novych
>           objektu. To zahrnuje alokaci pameti pro slozitejsi datove
>     struktury,
>           inicializaci a dalsi operace, jejich implementace ma byt pred
>           uzivatelem skryta.
>
>           Entity tohoto typu mivaji zpravidla dynamicky charakter, v
>     ojedinelych
>           pripadech byvaji alokovany staticky, coz vsak byva pred
>     uzivatelem
>           skryto.
>
>           Tento typ rozhrani vraci chybove kody pri neplatne identifikaci
>           spravovaneho objektu, nebot chyba takoveho charakteru nebyva
>     vetsinou
>           fatalni (pro jadro).
>
>           Uvedeny typ ma i rozhrani k vlaknum operacniho systemu, kde
>           thread_create vedle alokace pameti pro ridici strukturu a
>     zasobnik
>           vlakna a jeho inicializace zajistuje take zacleneni noveho
>     vlakna
>           do struktur planovace.
>
>
>       Obecne pozadavky
>       ----------------
>
>         * deklarace a pouzivani chybovych kodu
>
>           EOK = 0       "pseudo" chybovy kod, indikuje uspech
>           ENOMEM        nedostatek pameti pro provedeni operace
>           EINVAL        nektery z argumentu je neplatny
>           EKILLED       vlakno, ktere bylo predmetem cekani, bylo zruseno
>           ETIMEDOUT     vyprsel casovy limit pro provedeni operace
>           EWOULDBLOCK   operace by zablokovala volajici vlakno
>
>           S vyjimkou EOK by chybovym kodum mela byt prirazena zaporna
>     cisla.
>
>         * definice typu
>
>           off_t         long
>           size_t        unsigned int
>           ssize_t       int
>
>           uchar         unsigned char
>           ushort        unsigned short
>           uint          unsigned int
>           ulong         unsigned long
>
>           Uvedene typy odpovidaji beznym zvyklostem a architekture
>     procesoru
>           a mohou byt pouzity v testech a specifikaci zadani.
>
>         * podpora pro ladeni
>
>           Pri implementaci rozhrani synchronizacnich primitiv a casovacu
>           vytvorte podporu pro kontrolu platnosti predanych ukazatelu,
>     kterou
>           bude mozne aktivovat/deaktivovat definici nejakeho symbolu pri
>           prekladu jadra. Pouziti ladiciho mechanizmu zdokumentujte.
>
>         * zdrojove texty
>
>           Nasledujici doporuceni odrazi pozadavky na uroven zdrojovych
>     textu,
>           ktere budou hodnoceny pri odevzdani prace.
>
>           - vyhybejte se pouzivani numerickych konstant
>             primo v kodu, nahradte je makry
>           - pouzivejte prazdne radky a blokove
>             komentare k oddeleni logickych casti kodu
>           - vyhybejte se psani prilis dlouhych funkci
>           - vyhybejte se vytvareni zdrojovych souboru, ktere
>             obsahuji nesouvisejici funkce
>           - pouzivejte makra ci inline funkce k nahrade slozitych
>             podminkovych vyrazu
>           - pouzivejte jednotny jazyk pro komentare
>           - pouzivejte jednotny jazyk pro identifikatory funkci
>             a promennych a pro nazvy souboru
>           - pouzivejte systematicke identifikatory funkci a promennych
>           - komentujte obsah souboru, funkci a implementacni detaily; pro
>             inspiraci viz komentare ve stylu JavaDoc nebo Doxygen
>
>
>       Zakladni vstupne/vystupni operace
>       ---------------------------------
>
>         * int putc (const char chr)
>
>           Funkce vypise znak na konzoli. Vraci pocet vypsanych znaku.
>
>         * int puts (const char * str)
>
>           Funkce vypise retezec na konzoli. Vraci pocet vypsanych znaku.
>
>         * int printk (const char * format, ...)
>
>           Funkce vypise formatovany retezec na konzoli, stejne jako
>     printf v
>           knihovne libc. Formatovaci kody by mely podporovat znaky
>     (%c), retezce
>           (%s), cela cisla v desitkove (%d, %u, %i) a v sestnactkove (%x)
>           soustave, ukazatele (%p) bez modifikatoru na zarovnavani a
>     platne
>           cislice. Vraci pocet vypsanych znaku.
>
>         * int getc (void)
>
>           Funkce precte a vrati znak z klavesnice. Pokud neni ve
>     vyrovnavaci
>           pameti klavesnice zadny znak, zablokuje volajici vlakno a
>     ceka na
>           stisk klavesy.
>
>         * int getc_try (void)
>
>           Funkce precte a vrati znak z klavesnice. Pokud neni ve
>     vyrovnavaci
>           pameti klavesnice zadny znak, vrati EWOULDBLOCK.
>
>         * int gets (char * str, size_t len)
>
>           Funkce precte nejvice len - 1 znaku z klavesnice do bufferu
>     str. Cteni
>           je ukonceno pri precteni (a ulozeni) znaku '\n' nebo pri
>     dosazeni
>           limitu. Prectene znaky jsou vzdy ukonceny znakem 0. Vraci
>     EINVAL pokud
>           len == 0, jinak pocet znaku ulozenych do bufferu bez
>     ukoncovaci 0.
>
>
>       Zakladni ladici prostredky
>       --------------------------
>
>         * makro assert(EXPR)
>
>           Pokud neni definovan symbol NDEBUG, makro vyhodnoti vyraz
>     EXPR a pokud
>           je vysledek nulovy, zavola panic s informaci o nazvu funkce,
>     souboru a
>           cisle radku, na kterem nebyl splnen predpoklad EXPR. Pokud
>     je symbol
>           NDEBUG definovan, neudela nic.
>
>         * makro dprintk(ARGS...)
>
>           Pokud neni definovan symbol NDEBUG, makro vypise na konzoli
>     informaci
>           o nazvu funkce a cislo radku, na kterem bylo pouzito a
>     formatovany
>           retezec ARGS. Pokud je symbol NDEBUG definovan, neudela nic.
>
>         * void panic (const char * format, ...)
>
>           Funkce vypise formatovany retezec na konzoli (stejne jako
>     printk),
>           vypise identifikator prave beziciho vlakna, obsah registru
>     procesoru
>           a zablokuje jadro.
>
>
>       Obsluha preruseni a vyjimek procesoru
>       -------------------------------------
>
>         Napiste obsluznou rutinu pro obsluhu nasledujicich vyjimek
>     procesoru.
>         Kostru pro obsluhu vyjimek a predani rizeni do obsluzne rutiny
>     v jazyce
>         C naleznete ve vyukovem jadre Kalisto:
>
>         * interrupt (Int)
>
>           Zjistit zdroj preruseni a obslouzit ho.
>
>         * address error (AdEL, AdES)
>
>           Nastava pri cteni/zapisu z/na nezarovnanou adresu a pri
>     pristupu
>           do adresoveho prostoru jadra z uzivatelskeho rezimu. Panic.
>
>         * bus error (IBE, DBE)
>
>           Nastava pri pristupu na neplatnou fyzickou adresu. Panic.
>
>         * break point (BP)
>
>           Nastava pri vykonani instrukce BREAK. Ignorovat pokud neni
>     instrukce
>           v branch delay slotu, jinak panic.
>
>         * reference to WatchHi/WatchLo address (WATCH)
>
>           Nastava pri pristupu do rozmezi adres definovaneho registry CP0
>           WatchHi a WatchLo. Ignorovat.
>
>         * reserved instruction (RI)
>
>           Nastava pri neznamem operacnim kodu instrukce, v principu
>     neznama
>           instrukce -- da se pouzit k emulaci nekterych instrukci. Panic.
>
>         * coprocessor unusable (CpU)
>
>           Nastava pri pristupu na koprocesor, ktery neni neni oznacen jako
>           pristupny. Panic.
>
>         * trap exception (Tr)
>
>           Nastava pri provedeni podminenych instrukci Txx. Panic.
>
>         * arithmetic overflow (Ov)
>
>           Nastava pri preteceni dvojkoveho doplnku pri celociselnych
>     operacich
>           (prenosy z bitu 31 a 30 se lisi). Panic.
>
>
>       Rizeni preruseni
>       ----------------
>
>         * makro save_and_disable_interrupts (status)
>
>           Makro ulozi soucasny obsah stavoveho registru CP0 do promenne a
>           globalne zakaze preruseni procesoru.
>
>         * makro restore_interrupts (status)
>
>           Makro obnovi obsah stavoveho registru CP0 z promenne, cimz
>     obnovi
>           globalni stav povoleni/zakazni preruseni, ktery predchazel
>     pouziti
>           makra save_and_disable_interrupts ().
>
>         * makro/funkce void disable_interrupts (void)
>
>           Funkce globalne zakaze preruseni na procesoru.
>
>         * makro/funkce void enable_interrupts (void)
>
>           Funkce globalne povoli preruseni na procesoru.
>
>
>       Jednoduchy alokator pameti
>       --------------------------
>
>         Pri behu operacniho systemu je casto nutne radu objektu alokovat
>         dynamicky. Vyukove jadro Kalisto ma implementovan jednoduchy
>     alokator
>         pameti, ktery poskytuje funkce malloc () a free (). Tyto
>     funkce by melo
>         poskytovat i vase jadro, pricemz je mozne ponechat puvodni
>     implementaci.
>
>         Spravnost funkce alokatoru nebude testovana, rovnez inteligence
>         alokatoru nebude hodnocena.
>
>         * void * malloc (size_t size)
>
>           Funkce alokuje blok pameti pozadovane velikosti z heapu.
>     Vraci NULL
>           pokud nebylo mozne blok alokovat, jinak ukazatel na zacatek
>     alokovaneho
>           bloku.
>
>         * void free (void * ptr)
>
>           Funkce uvolni blok pameti, na ktery ukazuje ptr.
>
>
>       Jednoduchy planovac
>       -------------------
>
>         * preemptivni planovani vlaken k behu na procesoru
>         * strategie round-robin bez priorit
>
>
>       Rozhrani pro praci s vlakny
>       ---------------------------
>
>         * int thread_create (
>               thread_t * thread_ptr, void (* thread_start) (void *),
>     void * data)
>
>           Funkce vytvori nove (attached) vlakno. Vraci chybovy kod,
>     pokud se
>           vlakno nepodari vytvorit, jinak EOK. Funkce
>           void thread_start (data) bude spustena v nove vytvorenem
>     vlakne.
>           Pocet vlaken v systemu je omezen pouze dostupnou pameti.
>
>           Za vytvorenim vlakna se skryva alokace a inicializace ridici
>     datove
>           struktury obsahujici informace o vlaknu, alokace zasobniku
>     pro vlakno,
>           a zarazeni vlakna do struktur planovace. Z toho duvodu je vlakno
>           identifikovano pro uzivatele rozhrani "nepruhlednym" typem
>     thread_t.
>
>         * thread_t thread_get_current (void)
>
>           Funkce vrati identifikaci prave beziciho vlakna.
>
>         * int thread_join (thread_t thr)
>         * int thread_join_timeout (thread_t thr, uint usec)
>
>           Funkce ceka na dokonceni behu uvedeneho vlakna a iniciuje
>     uvolneni
>           pameti obsahujici ridici strukturu jadra a zasobnik. Vraci
>     EINVAL
>           pokud je identifikace vlakna neplatna, pokud bylo vlakno
>     odpojeno
>           pomoci thread_detach (), pokud jiz na vlakno ceka nekdo
>     jiny, nebo
>           pokud vlakno vola funkci samo na sebe. Vraci EKILLED pokud bylo
>           vlakno zruseno volanim funkce thread_kill ().
>
>           Varianta _timeout ceka na ukonceni vlakna nejdele usec
>     mikrosekund,
>           pokud vlakno neni ukonceno do uplynuti teto doby, vraci
>     ETIMEDOUT.
>
>         * int thread_detach (thread_t thr)
>
>           Funkce odpoji zadane vlakno. Vraci EINVAL pokud je identifikace
>           vlakna neplatna, vlakno je jiz odpojene, vlakno jiz nebezi a
>     ceka
>           na join nebo pokud na vlakno jiz nekdo ceka v thread_join ().
>
>           Odpojene (detached) vlakno se od pripojeneho (attached)
>     vlakna lisi
>           tim, ze neni mozne cekat na jeho ukonceni a pri skonceni jadro
>           automaticky uvolni pamet alokovanou pro ridici strukturu
>     jadra a
>           jeho zasobnik.
>
>         * void thread_sleep (uint sec)
>         * void thread_usleep (uint usec)
>
>           Funkce zablokuje prave bezici vlakno na zadanou dobu v sekundach
>           (resp. mikrosekundach). Vlakno nesmi byt zablokovano na
>     kratsi dobu
>           nez bylo zadano, rozumne zduvodnene prodlouzeni teto doby lze
>           tolerovat.
>
>         * void thread_yield (void)
>
>           Vlakno volajici thread_yield () se vzda rizeni dokud nebude
>           znovu naplanovano k behu.
>
>         * void thread_suspend (void)
>
>           Vlakno volajici thread_suspend () se zablokuje, dokud jej jine
>           vlakno neodblokuje pomoci funkce thread_wakeup ().
>
>         * int thread_wakeup (thread_t thr)
>
>           Funkce odblokuje zadane vlakno. Volajici vlakno pokracuje v
>     behu,
>           neni v dusledku tohoto volani preplanovano. Funkce vraci EINVAL
>           pokud je identifikace vlakna neplatna, jinak EOK.
>
>         * int thread_kill (thread_t thr)
>
>           Funkce zrusi zadane (bezici) vlakno. Vlakno, ktere ceka na
>     ukonceni
>           ruseneho vlakna, je odblokovano. Funkce vraci EINVAL pokud je
>           identifikace vlakna neplatna, jinak EOK.
>
>
>       Podpora casovacu
>       ----------------
>
>         Casovace slouzi k implementaci asynchronnich udalosti, pro
>     ktere je
>         nevhodne (z duvodu moznosti selhani alokace pameti) vytvaret
>     nove vlakno.
>         Obsluzne rutiny casovacu bezi na ukor vlakna, ktere bylo
>     casovacem
>         preruseno, nebo v kontextu systemoveho vlakna pro obsluhu
>     casovacu.
>
>         * int timer_init (
>               struct timer * tmr, uint usec,
>               void (*) (struct timer *, void *) handler, void * data)
>
>           Funkce inicializuje strukturu casovace pro dobu usec
>     mikrosekund.
>           Vraci EINVAL pokud je handler NULL, jinak OK. Casovac po
>     inicializaci
>           neni aktivni, aktivace se provadi funkci timer_start ().
>
>         * void timer_start (struct timer * tmr)
>
>           Funkce aktivuje casovac a prida ho do seznamu aktivnich
>     casovacu.
>           Pri vyprseni casoveho limitu je zavolana obsluzna rutina
>           void handler (struct timer * self, void * data), parametr self
>           odkazuje na strukturu casovace, ktera vedla k jejimu vyvolani.
>           Obsluzna funkce bezi na ukor preruseneho vlakna.
>
>           Pri zavolani timer_start na jiz aktivni casovac dojde k jeho
>           restartovani.
>
>         * void timer_destroy (struct timer * tmr)
>
>           Funkce deaktivuje casovac, odebere ho ze seznamu aktivnich
>     casovacu a
>           provede uklid ridici struktury. Vykonavani obsluzne rutiny
>     casovace
>           neni preruseno pokud jiz bezi.
>
>         * int timer_pending (struct timer * tmr)
>
>           Funkce vraci nenulovou hodnotu pokud je casovac aktivni,
>     jinak 0.
>
>
>       Synchronizacni primitiva
>       ------------------------
>
>       Pri implementaci predpokladejte, ze kod muze byt kdykoliv prerusen
>       pokud nejsou zakazana preruseni. Neni nutne uvazovat viceprocesorove
>       konfigurace simulatoru (tj. zakazani preruseni staci k zajisteni
>       atomicity operaci).
>
>       - semafor (s casovym limitem)
>
>         * void sem_init (struct semaphore * sem, int value)
>
>           Funkce inicializuje semafor a nastavi ho na zadanou hodnotu.
>
>         * void sem_destroy (struct semaphore * sem)
>
>           Funkce provede uklid ridici struktury semaforu. Pokud je rusen
>           semafor, na kterem jsou jeste zablokovany nejake thready,
>     funkce
>           vyvola panic.
>
>         * int sem_get_value (struct semaphore * sem)
>
>           Funkce vrati hodnotu semaforu >= 0.
>
>         * void sem_up (struct semaphore * sem)
>
>           Funkce inkrementuje hodnotu semaforu a pripadne odblokuje
>     jedno z
>           vlaken na nem zablokovanych.
>
>         * void sem_down (struct semaphore * sem)
>         * void sem_down_timeout (struct semaphore * sem, uint usec)
>
>           Funkce dekrementuje hodnotu semaforu pokud je to mozne, jinak
>           vlakno na semaforu zablokuje.
>
>           Varianta _timeout ceka na dekrementovani hodnoty semaforu
>     nejdele
>           usec mikrosekund. Pokud se behem teto doby podari semafor
>     dekrementovat,
>           vraci EOK, jinak ETIMEDOUT. Pokud je casovy limit 0, k
>     zablokovani
>           vlakna nedochazi.
>
>         Semafory budou pouzivany nasledujicim zpusobem:
>
>           struct semaphore sem;
>           sem_init (&sem, 100);
>           ...
>           sem_destroy (&sem);
>
>
>       - mutex (binarni semafor)
>
>         * void mutex_init (struct mutex * mtx)
>
>           Funkce inicializuje mutex do stavu odemceno.
>
>         * void mutex_destroy (struct mutex * mtx)
>
>           Funkce provede uklid ridici struktury mutexu. Pokud je rusen
>     mutex,
>           na kterem jsou jeste zablokovana nejaka vlakna, funkce
>     vyvola panic.
>
>         * void mutex_lock (struct mutex * mtx)
>         * int mutex_lock_timeout (struct mutex * mtx, uint usec)
>
>           Funkce se pokusi zamknout mutex, pokud to neni mozne, zablokuje
>           vlakno na mutexu.
>
>           Varianta _timeout ceka na zamknuti mutexu nejdele usec
>     mikrosekund.
>           Pokud se behem teto doby podari mutex zamknout, vraci EOK, jinak
>           ETIMEDOUT. Pokud je casovy limit 0, k zablokovani vlakna
>     nedochazi.
>
>         * void mutex_unlock (struct mutex * mtx)
>
>           Funkce odemkne zadany mutex a vzbudi vlakna, ktera byla
>     zablokovana
>           pri zamykani mutexu. Pokud je symbol DEBUG_MUTEX >= 1, bude
>           implementace mutexu hlidat, zda je odemykan vlaknem, ktere
>     ho puvodne
>           zamknulo. Pokud bude mutex odemykat jine vlakno, vyvola panic.
>
>
>       - r/w lock (rekurzivni)
>
>         * void rwlock_init (struct rwlock * rwl)
>
>           Funkce inicializuje ridici strukturu r/w zamku do stavu
>     odemceno.
>
>         * void rwlock_destroy(struct rwlock * rwl)
>
>           Funkce provede uklid ridici struktury zamku. Pokud je rusen
>     zamek,
>           na kterem jsou jeste zablokovana nejaka vlakna, funkce
>     vyvola panic.
>
>         * void rwlock_read_lock (struct rwlock * rwl)
>         * void rwlock_write_lock (struct rwlock * rwl)
>         * int rwlock_read_lock_timeout (struct rwlock * rwl, uint usec)
>         * int rwlock_write_lock_timeout (struct rwlock * rwl, uint usec)
>
>           Funkce se pokusi zamknout zamek v pozadovanem rezimu, pokud
>     to neni
>           mozne, zablokuje volajici vlakno na zamku.
>
>           Varianta _timeout ceka na zamknuti zamku nejdele usec
>     mikrosekund.
>           Pokud se behem teto doby podari zamek zamknout, vraci EOK, jinak
>           ETIMEDOUT. Pokud je casovy limit 0, k zablokovani vlakna
>     nedochazi.
>
>         * void rwlock_write_unlock (struct rwlock * rwl)
>         * void rwlock_read_unlock (struct rwlock * rwl)
>
>           Funkce odemkne zamek a odblokuje vlakna zablokovana na zamku.
>
>
>       - condition variable
>
>       * void cond_init (struct cond * cvar)
>
>           Funkce inicializuje ridici strukturu condition variable.
>
>         * void cond_destroy (struct cond * cvar)
>
>           Funkce provede uklid struktury condition variable. Pokud je
>     rusena
>           condition variable, na ktere jsou jeste zablokovany nejake
>     thready,
>           funkce vyvola panic.
>
>         * void cond_signal (struct cond * cvar)
>         * void cond_broadcast (struct cond * cvar)
>
>           Funkce odblokuje jedno resp. vsechna vlakna cekajici na
>           condition variable.
>
>         * void cond_wait (struct cond * cvar, struct * mtx)
>         * int cond_wait_timeout (
>               struct cond * cvar, struct mutex * mtx, uint usec)
>
>           Funkce atomicky odemkne mutex a zablokuje volajici vlakno na
>           condition variable. Po odblokovani opet zamkne mutex a vrati
>           rizeni volajicimu.
>
>           Varianta _timeout zablokuje vlakno nejdele na usec
>     mikrosekund, resp.
>           na dobu odpovidajici limitu a dobu nutnou k opetovnemu
>     zamceni mutexu.
>           Pokud behem teto doby dojde k odblokovani vlakna, vraci EOK,
>     jinak
>           ETIMEDOUT. Pokud je casovy limit 0, k zablokovani vlakna
>     nedochazi,
>           ale pred opetovnym zamcenim mutexu se vlakno jednou vzda
>     procesoru.
>
>
>       Integrace s testy
>       -----------------
>
>       K integraci s testy vytvorite hlavickovy soubor assignment-1.h,
>     ktery bude
>       obsahovat deklarace vsech vyse uvedenych funkci. Typicky bude
>     obsahovat
>       #include direktivy, ktere zajisti vlozeni vasich hlavickovych
>     souboru s
>       prislusnymi deklaracemi.
>
>       Dale musi soubor obsahovat deklaraci funkce assignment_test (void),
>       kterou zavolate z vaseho jadra.
>
>     --
>     Posledni modifikace: 2005/10/17 10:21
>
>
>     _______________________________________________
>     OSy mailing list
>     OSy at nenya.ms.mff.cuni.cz <mailto:OSy at nenya.ms.mff.cuni.cz>
>     http://nenya.ms.mff.cuni.cz/mailman/listinfo/osy
>
>
>
>------------------------------------------------------------------------
>
>_______________________________________________
>OSy mailing list
>OSy at nenya.ms.mff.cuni.cz
>http://nenya.ms.mff.cuni.cz/mailman/listinfo/osy
>  
>


-- 
Tomas Bures
Distributed Systems Research Group
Department of Software Engineering
Faculty of Mathematics and Physics
Charles University, Czech Republic
http://nenya.ms.mff.cuni.cz/~bures




More information about the NSWI004 mailing list