Po zavolaní funkcie pthread_cond_wait
je mutex
uvoľnený. Zamkne sa až keď sa proces zobudí (po jeho zobudení bude mutex
automaticky zamknutý).
V projekte nájdete hotovú funkciu barrier_init()
. Vašou úlohou je implementovať funkciu barrier()
tak, aby nenastala chyba assert. Štruktúra struct barrier
je tiež definované, jej položky môžete používať.
Počas riešenia narazíte na niekoľko problémov:
bstate.round
označuje aktuálne kolo. Túto premennú by ste mali inkrementovať vždy, keď všetky vlákna dosiahnu bariéru.bstate.round
ešte počas toho, ako ju používajú vlákna z predchádzajúceho kola.Otestuje svoj kód s jedným, dvoma a viacerými vláknami.
Spustite príkaz make grade, aby ste overili správnosť svojho riešenia. Aby ste prešli posledným testom time, musíte vytvoriť nový súbor time.txt, v ktorom uvediete počet hodín, ktorý ste strávili nad zadaním ako celé číslo.
Týmto je cvičenie ukončené. Svoje zmeny môžete commitnúť do repozitára.
Náš modul pre vlákna nespolupracuje pekne s operačným systémom. Napríklad, ak jedno užívateľské vlákno blokuje v systémovom volaní, iné užívateľské vlákna nebudú bežať, pretože plánovač užívateľských vlákien nevie o tom, že jedno vlákno bolo odplánované plánovačom xv6. Iný príklad: dve užívateľské vlákna nebudú bežať konkurentne na rôznych jadrách, pretože plánovač xv6 nevie o tom, že existujú viaceré vlákna, ktoré môžu bežať paralelne. Poznámka: ak by dve užívateľské vlákna mali bežať naozaj paralelne, táto implementácia by nefungovala z dôvodu viacerých súbehov (napr. dve rôzne vlákna na rôznych procesoroch môžu zavolať thread_schedule() konkurentne, vybrať rovnaké vlákno a bežať spolu na rôznych procesoroch.)
Tieto problémy je možné vyriešiť viacerými spôsobmi. Jedným z nich je použiť aktivácie plánovača; iné je použiť jedno vlákno jadra pre každý užívateľský proces (takto to robí Linux). Implementujte jeden z týchto spôsobov. Ľahké to nebude; budete musieť implementovať vyčistenie TLB pri aktualizácii tabuliek stránok pre viacvláknový užívateľský proces.
Pridajte zámky, podmienené premenné, bariéry, etc. do vášho modulu vlákien v xv6.