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.
Prvý riešiteľ každej úlohy môže dostať bonusové body po kontrole riešenia. Informujte sa u prednášajúceho alebo cvičiaceho. Voliteľné úlohy môžete riešiť až po vyriešení všetkých úloh základnej časti cvičenia! Riešenia prijímame iba do 12.11.2023 pre cvičenie v piatok a 19.11.2023 pre cvičenia v stredu a štvrtok.
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, atď. do vášho modulu vlákien v xv6.