====== Podpora více vláken v OS NOVA ====== Cílem tohoto cvičení je implementovat do OS NOVA systémové volání ''thread_create'' a ''thread_yield'' a dosáhnout tím podpory jednoduchých vícevláknových aplikací. ===== Domácí příprava ===== Pro toto cvičení budete potřebovat znalosti o: * přečíst (ideálně i umět vysvětlit) funkce v OS NOVA: * bootstrap, make_current, ret_user_sysexit, konstruktor k Ec * fungování plánovačů v operačním systému (schedulers) * {{:courses:b4b35osy:lekce03.pdf|Přednaška}} * instrukce [[https://c9x.me/x86/html/file_module_x86_id_313.html|sysenter]] * základní syntaxi inline assembleru (tak jako v minulých cvičeních) * https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html (pochopit příklad z remarks) * spojové seznamy * https://en.wikipedia.org/wiki/Linked_list * programování v C++ ===== Zadání úlohy ===== Implementujte systémová volání s následujícími prototypy: int thread_create(void *(*start_routine)(void *), void *stack_top); void thread_yield(void); === Požadavky === **ABI:** * thread_create eax = 4, esi = start_routine, edi = stack_top * thread_yield eax = 5 **očekávané chování:** * //thread_create// vytvoří vlákno a přidá ho do kruhové fronty vytvořených vláken. * //start_routine// je ukazatel na adresu, od které se zahájí vykonávání nového vlákna. * //stack_top// je adresa vrcholu zásobníku nového vlákna. * //thread_create// vrací 0 pokud proběhl bez chyby. V opačném případě vrací libovolné nenulové číslo chyby. * //thread_yield// přepne vykonávání z aktuálního vlákna na následující vlákno ve frontě. * Žádné ze systémových volání nesmí končit pádem systému. * Postupné volání thread_yield přepíná mezi všemi vlákny ve frontě (žádné vlákno se nesmí vynechat). * Běh vlákna se dá přerušit pouze voláním //thread_yield//. * Pokud je zavoláno thread_yield po vytvoření nového vlákna, přepne thread_yield na naposledy vytvořené vlákno. Při dalším volání thread_yield se spustí vlákno, které by bylo spuštěno, pokud by se nové vlákno nevytvořilo. * Za správné umístění a alokaci zásobníku pro nové vlákno je zodpovědný uživatelský program, který volá thread_create. **Co se odevzdává**: * Změněný soubor ''kern/src/ec_syscall.cc'' implementující dvě nová systémová volání včetně volání brk z 10. cvičení. Archiv můžete vytvořit například pravidlem hw10 v kořenovém souboru Makefile ve zdrojových kódech OS NOVA. **Evaluace**: * Úloha se nekontroluje automaticky - je proto nutná osobní kontrola cvičícím! ===== Materiály ===== {{:courses:b4b35osy:cviceni:osy-12threads.pdf|}}