Warning
This page is located in archive. Go to the latest version of this course pages.

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:

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čít 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 pomocí pravidla hw10 v kořenovém souboru Makefile ve zdrojových kódech OS NOVA.
courses/b4b35osy/cviceni/cviceni12_nova-threads.txt · Last modified: 2017/12/19 17:02 by stepan