Multiprocesové jádro FELANu =========================== Multiprocesové jádro přepíná procesor mezi více procesů na základě synchronizačních podmínek a priority procesů. Jednotlivé procesy mají mohou tedy běžet relativně nezávisle (diskové, tiskové i boot servery), nemusejí se starat o příliš událostí najednou, každou událost může ošetřovat specializovaný proces. Ten bude podstatně jednodušší a tudíž i snáze odladitelný. Jádro poskytuje prostřednictvím SW přerušení 49H následující služby : Parametry se předávají v registrech AX,ES,BX a CX. Synchronizační objekty (semafory a příznaky) se identifikují jednobytovým číslem společným pro všechny procesy - musíme tedy sami předejít kolizím v jejich číslování - nejlépe seznamem použitých čísel spolu s jejich významem. Semafory a příznaky 80H - 0FFH se přidělují a uvolňují pomocí funkcí 13 a 14. Pouze při provádění funkcí 0 a 7 může dojít k chybě vlivem momentálního nedostatku paměti. Funkce se neprovede, žádajícímu programu je nastaven bit Carry. Obdobně se jádro chová při zadání chybných parametrů u funkce 8. Vytvoření procesu ----------------- AH = 0 AL = priorita procesu 0 - nejnižší, 0FFH = nejvyšší ES = SS procesu BX = SP procesu CL = identifikace procesu (pro potřebu debugeru) Výstup CF = 1 => příliš mnoho procesů - není volný PCB V zásobníku nového procesu jsou registry v pořadí : Flags,CS,IP,AX,BX,DS,ES,CX,DX,SI,DI,BP - BP je úplně navrchu Jádro vytvoří PCB a umístí jej do fronty připravených procesů. Inicializace semaforu nebo příznaku ----------------------------------- AH = 1 AL = číslo synchronizačního objektu BL = hodnota semaforu nebo příznaku Služba nastaví hodnotu synchronizačního objektu a vyprázdní frontu čekajících procesů. POZOR - služba se smí použít pouze jako první akce s daným objektem ! V opačném případě se mohou ztratit PCB zařazené ve frontě. Nastavení příznaku ------------------ AH = 2 AL = číslo objektu (příznaku) Je-li fronta sdružená s příznakem prázdná, nastaví se příznak na nenulovou hodnotu; je-li neprázdná, přeřadí se z ní první proces do fronty připravených. Proces, který službu vyvolal, poběží ihned dále bez ohledu na prioritu procesu, který se přeřadil do fronty připravených. Nastavení příznaku s okamžitým spuštěním čekajícího procesu ----------------------------------------------------------- AH = 3 AL = číslo objektu (příznaku) Je-li fronta sdružená s příznakem prázdná, nastaví se příznak na nenulovou hodnotu; je-li neprázdná, přeřadí se z ní první proces do fronty připravených. Má-li přeřazený proces větší prioritu než běžící, ihned se spustí. Čekání na příznak ----------------- AH = 4 AL = číslo objektu (příznaku) Je-li hodnota příznaku nulová, zařadí se proces do fronty sdružené s příznakem, je-li nenulová, nastaví se na nulu. Operace P (stůj) ---------------- AH = 5 AL = číslo objektu (semaforu) Je-li hodnota semaforu nulová, proces se pozastaví a jeho PCB se zařadí podle priority do fronty semaforu. Je-li hodnota semaforu nenulová, zmenší se o jedničku. Operace V (volno) ----------------- AH = 6 AL = číslo objektu (semaforu) Je-li fronta semaforu prázdná, zvýší se hodnota semaforu o jedničku, je-li neprázdná, přeřadí se první proces do fronty připravených. Zařazení požadavku do časové fronty ----------------------------------- AH = 7 AL = číslo objektu (příznaku) nebo 0 (nenastaví příznak) ES:BX = adresa řídicího bloku časové služby (1 slovo) Výstup CF = 1 => příliš mnoho požadavků v časové frontě Řídicí blok obsahuje počet tiků - jak dlouho se má čekat. Po uplynutí požadované doby jádro nastaví zadaný příznak (není-li AL=0) a vynuluje řídicí blok. Zrušení požadavku v časové frontě --------------------------------- AH = 8 ES:BX = adresa řídicího bloku časové služby (1 slovo) Výstup : CF = 1 => v časové frontě není zařazen řídicí blok s danou adresou Tato funkce zruší požadavek v časové frontě. Zjištění hodnoty objektu (semaforu nebo příznaku) ------------------------------------------------- AH = 9 AL = číslo objektu Výstup : CF = 1 => objekt nebyl inicializován funkcí č. 1 AL = hodnota objektu Volání dispečera ---------------- AH = 10 Jsou-li ve frontě připravených procesů procesy se stejnou nebo vyšší prioritou, spustí se první z nich. Běžící proces se zastaví a zařadí za poslední proces se stejnou prioritou. Konec zpracování přerušení -------------------------- AH = 11 Použije-li se při zpracování přerušení funkce 2 (nastavení příznaku), je třeba pro přeplánování ukončit přerušení zavoláním této služby. Před zavoláním funkce musí být v zásobníku právě tyto registry přerušeného procesu : FLAGS,CS,IP,AX. Ostatní registry přerušeného procesu uschová až tato funkce. Změna priority -------------- AH = 12 AL = nová priorita procesu Přidělení a inicializace volného semaforu nebo příznaku ------------------------------------------------------- AH = 13 BL = hodnota semaforu nebo příznaku Služba přidělí volný objekt a nastaví jeho hodnotu. Výstup CF = 1 => všechny objekty už jsou přiděleny AL = číslo přiděleného synchronizačního objektu Uvolnění synchronizačního objektu --------------------------------- AH = 14 AL = číslo synchronizačního objektu Služba uvolní objekt. Uspání procesu (HIBER) ---------------------- AH = 15 AL = číslo příznaku nebo 0 ES:BX = adresa slova na PCB Služba pozastaví proces a uloží segment PCB do ES:BX Vykonávání procesu bude pokračovat až po provedení funkce 16 Je-li AL <> 0 , nastaví se ještě příznak AL (funkce 3) Probuzení procesu (WAKE) ------------------------ AH = 16 ES:BX = segment PCB uspaného procesu Služba probudí uspaný proces ; má-li větší prioritu než budící proces, ihned se spustí Ukončení procesu ---------------- AH = 17 Služba ukončí proces, který ji vyvolal a spustí následující proces z fronty READY. Prodleva (DELAY) ---------------- AH = 18 AL = počet tiků, na jak dlouho se má proces přerušit