Operační systémy. Procesy a vlákna ve Windows

4.1 Procesy

4.1.1 Koncepce procesu

Proces(úloha) - program v režimu provádění.

Každý proces je spojen s jeho adresní prostor, ze kterého může číst a do kterého může zapisovat data.

Adresní prostor obsahuje:

    samotný program

    data pro program

    zásobník programu

Každý proces má přiřazenou sadu registrů , Například:

    čítač programu (v procesoru) - registr, který obsahuje adresu dalšího příkazu ve frontě k provedení. Po načtení instrukce z paměti se upraví čítač programu a ukazatel se přesune na další instrukci.

    ukazatel zásobníku

V mnoha operačních systémech jsou kromě obsahu vlastního adresního prostoru uloženy všechny informace o každém procesu procesní tabulka operační systém.

Některá pole tabulky:

Řízení procesů

Správa paměti

Správa souborů

Registry

Počítadlo programů

Ukazatel zásobníku

Stav procesu

Přednost

Možnosti plánování

ID procesu

Rodičovský proces

Procesní skupina

Čas zahájení procesu

Použitý čas CPU

Ukazatel na textový segment

Ukazatel na datový segment

Ukazatel na segment zásobníku

Kořenový adresář

Pracovní adresář

Deskriptory souborů

ID uživatele

ID skupiny

4.1.2 Procesní model

V multitaskingovém systému se skutečný procesor přepíná z procesu na proces, ale pro zjednodušení modelu uvažujeme sadu procesů běžících paralelně (pseudoparalelně).

Uvažujme obvod se čtyřmi běžícími programy.

V jednu chvíli je aktivní pouze jeden proces

Vpravo jsou paralelně běžící procesy, každý s vlastním čítačem programů. Samozřejmě existuje vlastně pouze jeden fyzický programový čítač, do kterého se načítá logický programový čítač aktuálního procesu. Když čas přidělený aktuálnímu procesu skončí, fyzický programový čítač se uloží do paměti, do logického programového čítače procesu.

4.1.3 Vytvoření procesu

Tři hlavní události vedoucí k vytvoření procesů (výzva vidlice nebo CreateProcess):

    Běžící proces vydá systémové volání k vytvoření procesu

    Požadavek uživatele na vytvoření procesu

Ve všech případech aktivní aktuální proces vydá systémové volání k vytvoření nového procesu.

V UNIXu je každému procesu přiřazen identifikátor procesu (PID - Process IDentifier)

4.1.4 Ukončení procesu

Čtyři události, které způsobí zastavení procesu (volání výstup nebo ExitProcess):

    Plánované dokončení (konec realizace)

    Naplánované ukončení při známé chybě (například chybějící soubor)

    Ukončit kvůli závažné chybě (chyba programu)

    Zničeno jiným procesem

Pozastavený proces se tedy skládá z vlastního adresního prostoru, který se obvykle nazývá způsob paměti(základní obrázek) a komponenty tabulky procesů (včetně jejích registrů).

4.1.5 Hierarchie procesů

Systémy UNIX mají pevnou hierarchii procesů. Každý nový proces vytvořený systémovým voláním fork je potomkem předchozího procesu. Podřízený proces přijímá proměnné, registry atd. od rodiče. Po volání fork, jakmile jsou zkopírována data rodiče, následné změny v jednom z procesů neovlivní druhý, ale procesy si zapamatují, kdo je rodič.

V tomto případě je v UNIXu také předchůdce všech procesů – proces init.

Procesní strom pro systémy UNIX

4.1.6 Stav procesu

Tři stavy procesu:

    Provedení (obsazeno CPU)

    Připraveno (proces je dočasně pozastaven, aby mohl běžet jiný proces)

    Čekání (proces nelze spustit z vlastních důvodů, jako je čekání na I/O operaci)

Možné přechody mezi stavy.

1. Proces je zablokován a čeká na vstupní data

2. Plánovač zvolí jiný proces

3. Plánovač vybere tento proces

4. Vstupní data dorazila

Přechody 2 a 3 jsou volány plánovačem procesů operačního systému, takže samotné procesy o těchto přechodech ani nevědí. Z pohledu samotných procesů existují dva stavy provádění a čekání.

Na serverech, aby urychlili odezvu na požadavek klienta, často uvádějí několik procesů do pohotovostního režimu, a jakmile server obdrží požadavek, proces přejde z „čekání“ na „provádění“. Tento přechod je mnohem rychlejší než zahájení nového procesu.

4.2 Závity (závity, odlehčený proces)

4.2.1 Pojem toku

Každý proces má adresní prostor a jeden tok spustitelné příkazy. Ve víceuživatelských systémech musí být při každém přístupu ke stejné službě vytvořen nový proces pro obsluhu klienta. To je méně výhodné než vytváření kvaziparalelního vlákna v rámci tohoto procesu s jediným adresním prostorem.

4.2.2 Model toku

Každé vlákno je spojeno s:

    Čítač provedení příkazu

    Registry pro aktuální proměnné

    Stát

Vlákna mezi sebou sdílejí prvky svého procesu:

    Adresní prostor

    Globální proměnné

    Otevřete soubory

  • Semafory

    Statistické informace.

Jinak je model shodný s procesním modelem.

POSIX a Windows mají podporu vláken na úrovni jádra.

4.2.3 Výhody použití vláken

    Zjednodušení programu v některých případech použitím společného adresního prostoru.

    Rychlost vytváření streamu ve srovnání s procesem je přibližně 100krát.

    Zlepšení výkonu samotného programu, protože Je možné současně provádět výpočty na procesoru a I/O operaci. Příklad: Textový editor se třemi vlákny může současně komunikovat s uživatelem, formátovat text a zapisovat záložní kopii na disk.

4.2.4 Implementace vláken v uživatelském prostoru, kernel a smíšené

B- vlákna v prostoru jádra

V případě A Jádro neví nic o vláknech. Každý proces potřebuje průtoková tabulka, podobně jako v tabulce procesů.

Výhody pouzdra A:

    Takový multithreading lze implementovat na jádře, které nepodporuje multithreading

    Rychlejší přepínání, vytváření a ukončování vláken

    Proces může mít svůj vlastní plánovací algoritmus.

Nevýhody pouzdra A:

    Žádné přerušení časovače v rámci jednoho procesu

    Při použití blokovacího (proces je uveden do pohotovostního režimu, např.: čtení z klávesnice, ale nejsou přijímána žádná data) systémového požadavku, jsou všechna ostatní vlákna zablokována.

    Složitost implementace

Dobré odpoledne. Dnes bych se rád podíval na to, jaká vlákna jsou v procesoru. Právě ty, o jejichž funkcích a schopnostech většina lidí nemá ponětí, ale rádi se předvádějí ostatním.

Účelem funkce je, že 1 jádro může současně zpracovávat více datových toků. Zatímco první vlákno je nečinné a druhé je zaneprázdněné výpočty, běžící aplikace může využít volnou logickou sílu pro své vlastní účely. Díky tomu dochází k vyrušování mnohem méně často a při práci necítíte brzdy ani jiné nepříjemnosti.

Nevýhoda technologie je následující:

  • obě vlákna přistupují ke stejné mezipaměti úrovně 2 a 3;
  • těžké výpočetní procesy mohou způsobit konflikt v systému.

Velmi zhruba řečeno, všechny cihly z jednoho místa na druhé lze přesunout jednou rukou (1 tok) nebo dvěma (2 toky), ale je tam jen jeden člověk (1 jádro) a unaví se stejně za jakýchkoli podmínek , i když jeho produktivita je ve skutečnosti dvojnásobná. Jinými slovy, spoléháme na výkon CPU a konkrétněji na jeho frekvenci.

Proces(neboli úloha) je abstrakce, která popisuje běžící program.

Pro OS proces představuje jednotku práce, požadavek na spotřebu systémových prostředků. Subsystém řízení procesů naplánuje provádění procesů, tzn. rozděluje procesorový čas mezi několik současně existujících procesů v systému, zabývá se také tvorbou a destrukcí procesů, poskytuje procesům potřebné systémové prostředky a podporuje interakci mezi procesy.

Některé prostředky jsou přidělovány procesu při jeho vytvoření a některé jsou přidělovány dynamicky na základě požadavků za běhu. Zdroje mohou být přiřazeny procesu na celou jeho životnost nebo pouze na určité období. Při provádění těchto funkcí spolupracuje subsystém správy procesů s dalšími subsystémy OS zodpovědnými za správu prostředků, jako je subsystém správy paměti, subsystém vstupu/výstupu a systém souborů. Když systém spouští více nezávislých úloh současně, vznikají další problémy. Přestože procesy vznikají a provádějí se asynchronně, mohou vyžadovat interakci, například při výměně dat. Shoda rychlostí procesů je také velmi důležitá, aby se předešlo konfliktům, kdy se několik procesů pokouší upravit stejný soubor, uvázne nebo jiné kolize, ke kterým dochází při sdílení prostředků. Synchronizace procesů je jednou z důležitých funkcí subsystému řízení procesů.

Pokaždé, když proces skončí, subsystém řízení procesů zavře všechny soubory, se kterými proces pracoval, a uvolní oblasti paměti RAM přidělené pro kódy, data a systémové informační struktury procesu. Všechny možné fronty OS a seznamy prostředků, které obsahují odkazy na ukončovaný proces, jsou opraveny.

Pro podporu multiprogramování musí OS definovat a navrhnout pro sebe ty vnitřní jednotky práce, mezi které bude rozdělen procesor a další počítačové zdroje. To je třeba připomenout multiprogramování je způsob organizace výpočetního procesu, ve kterém paměť počítače obsahuje několik programů, které jsou střídavě vykonávány na jednom procesoru.

V současné době většina operačních systémů definuje dva typy jednotek práce. Větší jednotka práce, obvykle nazývaná proces nebo úkol, vyžaduje dokončení několika menších prací, označovaných jako vlákno nebo vlákno.

Je zřejmé, že jakákoli operace počítačového systému spočívá ve spuštění nějakého programu. S procesem i vláknem je tedy spojen určitý programový kód, který je pro tyto účely navržen ve formě spustitelného modulu. Aby mohl být tento programový kód spuštěn, musí být načten do paměti RAM, případně alokovat nějaké místo na disku pro ukládání dat a poskytnout přístup ke vstupním/výstupním zařízením, jako je sériový port. Během provádění může program také potřebovat přístup k HI, jako jsou soubory. A samozřejmě je nemožné spustit program bez jeho poskytnutí CPU čas, tj. doba, po kterou procesor vykonává kódy daného programu.

V systémech, kde existují procesy i vlákna, je proces považován OS za požadavek na spotřebování všech typů zdrojů, kromě jednoho - procesorového času. Tento poslední nejdůležitější zdroj je distribuován OS mezi další pracovní jednotky - vlákna, která dostala svůj název díky tomu, že představují sekvence (vlákna provádění) příkazů.

V nejjednodušším případě se proces skládá z jediného vlákna a takto byl pojem „proces“ interpretován až do poloviny 80. let a ve stejné podobě se dochoval i v některých moderních operačních systémech. V systémech tohoto typu je pojem „tok“ zcela pohlcen pojmem „proces“, tzn. Zůstává pouze jedna jednotka práce a spotřeby zdrojů – proces. Multiprogramování se v takových operačních systémech provádí na procesní úrovni.

Proces má tři základní stavy: připravený, spuštěný a blokovaný.

Na jednoprocesorovém systému může běžet pouze jeden proces. Současně může existovat několik připravených a zablokovaných procesů čekajících na výskyt některých událostí (například I/O). V tomto případě je seznam připravených procesů seřazen podle priority.

Aby se zabránilo zasahování procesů do přidělování zdrojů a také vzájemnému poškozování kódů a dat, musí operační systém vyřešit nejdůležitější úkol - izolovat jeden proces od druhého.

Aby toho bylo dosaženo, operační systém poskytuje každému procesu samostatný virtuální adresní prostor, takže žádný proces nemůže přímo přistupovat k příkazům a datům jiného procesu.

Zpracovat virtuální adresní prostor je sada adres, se kterými lze manipulovat modulem procesního programu.

Operační systém mapuje virtuální adresový prostor procesu na přidělenou fyzickou paměť procesu.

Je-li nutná interakce, procesy se obrátí na OS, který jim jako prostředník poskytuje prostředky meziprocesové komunikace – potrubí, poštovní schránky, sekce sdílené paměti a některé další.

V systémech, které nemají koncept vlákna, však vznikají problémy při organizování paralelních výpočtů v rámci procesu. A taková potřeba může nastat. S multiprogramováním se sice zvyšuje propustnost systému, ale samostatný proces nelze nikdy provést rychleji než v režimu jednoho programu (jakékoli rozdělení zdrojů pouze zpomaluje práci jednoho z účastníků kvůli dodatečnému času strávenému čekáním, než se zdroj stane k dispozici). Aplikace běžící v rámci jednoho procesu však může mít vnitřní paralelismus, který by v zásadě mohl umožnit rychlejší řešení. Pokud program např. poskytuje přístup k externímu zařízení, pak je při této operaci možné neblokovat provádění celého procesu, ale pokračovat ve výpočtech v jiné větvi programu. Spouštění více úloh paralelně v rámci jedné interaktivní aplikace zvyšuje efektivitu uživatele. Při práci s textovým editorem je tedy žádoucí mít možnost kombinovat psaní nového textu s časově náročnými operacemi jako je přeformátování značné části textu, tisk dokumentu nebo jeho uložení na lokální či vzdálený disk.

Vlákna vznikla v OS jako prostředek pro paralelizaci výpočtů. Problém paralelizace výpočtů v rámci jedné aplikace lze samozřejmě řešit tradičními metodami.

Za prvé, aplikační programátor se může ujmout složitého úkolu organizovat paralelismus výběrem určitého dispečerského podprogramu v aplikaci, který periodicky přenáší řízení do té či oné větve výpočtů. V tomto případě se program logicky ukazuje jako velmi nepřehledný s četnými přesuny ovládání, což výrazně komplikuje jeho ladění a úpravy.

Za druhé, řešením je vytvořit několik procesů pro každou z paralelních úloh pro jednu aplikaci. Použití standardních nástrojů OS k vytváření procesů nám však neumožňuje vzít v úvahu skutečnost, že tyto procesy řeší jediný problém, což znamená, že mají mnoho společného - mohou pracovat se stejnými daty, používat stejný segment kódu a být vybaven stejnými a stejnými přístupovými právy ke zdrojům počítačového systému.

V OS je spolu s procesy potřeba další mechanismus pro paralelizaci výpočtů, který by zohledňoval úzké vazby mezi jednotlivými větvemi výpočtů stejné aplikace.

Pro tyto účely nabízejí moderní operační systémy vícevláknový mechanismus. Současně se zavádí nová jednotka práce - vlákno provedení a pojem „proces“ do značné míry mění svůj význam. Pojem "vlákno" odpovídá sekvenčnímu přechodu procesoru z jedné programové instrukce do druhé. Operační systém rozděluje čas procesoru mezi vlákna. OS přiřadí adresový prostor a sadu prostředků procesu, které jsou sdíleny všemi jeho vlákny.

V jednoprogramových systémech není třeba zavádět koncept označující jednotku práce, protože zde není problém s rozdělením zdrojů.

Vytváření vláken vyžaduje od operačního systému menší režii než procesy. Na rozdíl od procesů, které patří do různých konkurenčních aplikací, všechna vlákna jednoho procesu vždy patří do stejné aplikace, takže OS izoluje vlákna v mnohem menší míře než procesy v tradičním víceprogramovém systému. Všechna vlákna jednoho procesu používají společné soubory, časovače, zařízení, stejnou oblast RAM a stejný adresní prostor. To znamená, že sdílejí stejné globální proměnné. Protože každé vlákno může přistupovat k libovolné virtuální adrese procesu, jedno vlákno může používat zásobník jiného vlákna. Mezi vlákny stejného procesu neexistuje úplná ochrana, protože za prvé je to nemožné a za druhé to není nutné. K organizaci interakce a výměny dat vlákna vůbec nepotřebují přistupovat k OS, stačí použít sdílenou paměť – jedno vlákno zapisuje data a druhé je čte. Na druhou stranu jsou vlákna různých procesů před sebou stále dobře chráněna.

Multiprogramování je efektivnější na úrovni vláken než na úrovni procesu. Každé vlákno má svůj vlastní čítač programů a zásobník. Úloha navržená jako několik vláken v rámci jednoho procesu může být dokončena rychleji díky pseudoparalelnímu (nebo paralelnímu v multiprocesorovém systému) provádění jeho jednotlivých částí. Multithreading lze použít zvláště efektivně pro spouštění distribuovaných aplikací, například server s více vlákny může paralelně provádět požadavky od více klientů.

Použití vláken je spojeno nejen s touhou zvýšit výkon systému pomocí paralelních výpočtů, ale také s cílem vytvářet čitelnější, logičtější programy. Zavedení více vláken provádění zjednodušuje programování. Například v úlohách Writer-reader jedno vlákno zapisuje do vyrovnávací paměti a jiné z ní čte. Protože sdílejí společnou vyrovnávací paměť, neměly by se z nich dělat samostatné procesy. Dalším příkladem použití vláken je ovládání signálů, jako jsou přerušení klávesnice (Del nebo Break). Namísto zpracování signálu přerušení je jedno vlákno přiřazeno k neustálému čekání na příchod signálů. Použití vláken tedy může snížit potřebu přerušení na uživatelské úrovni. V těchto příkladech není paralelní provádění tak důležité jako přehlednost programu.

Největšího efektu ze zavedení vícevláknového zpracování je dosaženo ve víceprocesorových systémech, ve kterých vlákna, včetně těch, která patří ke stejnému procesu, mohou být spouštěna na různých procesorech skutečně paralelně (a nikoli pseudoparalelně).

Vytvořit proces Především to znamená vytvoření deskriptoru procesu, což je jedna nebo více informačních struktur obsahujících všechny informace o procesu, které OS potřebuje k řízení. Mezi takové informace může patřit například identifikátor procesu, informace o paměťovém umístění spustitelného modulu, stupeň oprávnění procesu (priorita a přístupová práva) atd.

Příklady deskriptorů procesu jsou Task Control Block (TCB) v OS/360, Process Control Block (PCB) v OS/2, popisovač procesu v UNIXu, objektový proces ve Windows NT.

Vytvoření deskriptoru procesu znamená vznik dalšího uchazeče o výpočetní zdroje v systému. Od tohoto okamžiku musí OS při alokaci zdrojů zohledňovat potřeby nového procesu.

Vytvoření procesu zahrnuje načtení kódů a dat spustitelného programu procesu z disku do paměti RAM. K tomu musí OS zjistit umístění takového programu na disku, znovu přidělit RAM a přidělit paměť spustitelnému programu nového procesu. Poté je nutné načíst program do jemu přidělených paměťových míst a případně změnit parametry programu v závislosti na umístění v paměti.

V systémech s virtuální pamětí lze v počátečním okamžiku načíst pouze část procesního kódu a dat, aby se zbytek podle potřeby „napumpoval“. Existují systémy, ve kterých ve fázi vytváření procesu není nutné nutně načítat kódy a data do paměti RAM, místo toho je spustitelný modul zkopírován z adresáře souborového systému, ve kterém byl původně umístěn, do odkládací oblasti - speciální; oblast disku vyhrazená pro ukládání kódů a těchto procesů. Při provádění všech těchto akcí subsystém správy procesů úzce spolupracuje se subsystémem správy paměti a systémem souborů.

Ve vícevláknovém systému, když je vytvořen proces, OS vytvoří pro každý proces alespoň jedno vlákno provádění. Při vytváření vlákna, stejně jako při vytváření procesu, generuje OS speciální informační strukturu - deskriptor vlákna, který obsahuje identifikátor vlákna, přístupová práva a prioritní data, stav vlákna a další informace. V počátečním stavu je vlákno (nebo proces, pokud mluvíme o systému, ve kterém není definován pojem „vlákno“) v pozastaveném stavu. Okamžik výběru vlákna pro spuštění se provádí v souladu s pravidlem pro přidělování procesorového času akceptovaným v tomto systému a se zohledněním všech aktuálně existujících vláken a procesů. Pokud jsou procesní kódy a data ve swapovací oblasti, nezbytnou podmínkou pro aktivaci procesního vlákna je také přítomnost místa v RAM pro načtení jeho spustitelného modulu.

Na mnoha systémech může vlákno požádat OS o vytvoření tzv sestupné proudy. Různé operační systémy strukturují vztah mezi podřízenými vlákny a jejich rodiči odlišně. Například v některých operačních systémech je spouštění nadřazeného vlákna synchronizováno s jeho potomky, zejména po dokončení nadřazeného vlákna může OS přestat spouštět všechny jeho potomky. Na jiných systémech se mohou podřízená vlákna spouštět asynchronně s ohledem na nadřazené vlákno. Potomci obvykle dědí mnoho vlastností svých rodičovských proudů. V mnoha systémech je spawnování potomků primárním mechanismem pro vytváření procesů a vláken.

Plánování procesu zahrnuje řešení následujících úkolů:

■ stanovení časového okamžiku pro změnu prováděného procesu;

■ výběr procesu k provedení z fronty připravených procesů;

■ přepínání kontextů „starých“ a „nových“ procesů.

První dva problémy jsou řešeny softwarově a poslední z velké části hardwarově.

Existuje mnoho různých algoritmů plánování procesů, které řeší uvedené problémy různými způsoby, sledují různé cíle a poskytují různou kvalitu multiprogramování. Z této sady algoritmů se podívejme blíže na dvě skupiny nejběžnějších algoritmů: algoritmy založené na kvantizaci a algoritmy založené na prioritách.

Podle algoritmy založené na kvantování, ke změně aktivního procesu dojde, pokud:

■ proces skončil a opustil systém;

■ došlo k chybě;

■ proces vstoupil do stavu „čekání“;

■ časový úsek procesoru přidělený tomuto procesu byl vyčerpán.

Proces, který vyčerpal svá kvanta, se převede do stavu „připraven“ a čeká, až mu bude poskytnuto nové kvantum procesorového času, a z fronty připravených se podle určitého pravidla vybere nový proces ke spuštění. . Tímto způsobem žádný proces nezabírá CPU dlouho, a proto je kvantizace široce používána v systémech sdílení času.

Kvanta přidělená procesům mohou být pro všechny procesy stejná nebo různá. Kvantita přidělená jednomu procesu může mít pevnou hodnotu nebo se může lišit v různých obdobích životnosti procesu. Procesy, které plně nevyužily kvantum, které jim bylo přiděleno (například kvůli I/O aktivitě), mohou, ale nemusí dostat kompenzaci ve formě privilegií při následné údržbě. Fronta připravených procesů může být organizována různými způsoby: cyklicky podle pravidla „první dovnitř, první ven“ (FIFO) nebo podle pravidla „poslední dovnitř, první ven“ (LIFO).

V algoritmy založené na prioritách používá se koncept „priority“ procesu.

Přednost je číslo charakterizující stupeň privilegia procesu při využívání počítačových zdrojů, zejména procesorového času: čím vyšší priorita, tím vyšší oprávnění.

Priorita může být vyjádřena jako celé číslo nebo zlomek, kladné nebo záporné hodnoty. Čím vyšší jsou oprávnění procesu, tím méně času stráví ve frontách. Priorita může být přidělena přímo správcem systému v závislosti na důležitosti práce nebo zaplaceného poplatku, nebo může být vypočítána samotným OS podle určitých pravidel, může zůstat fixní po celou dobu životnosti procesu nebo se v průběhu času v souladu s nějaký zákon. V druhém případě se nazývají priority dynamický.

Existují dva typy prioritních algoritmů: algoritmy, které používají relativní priority, a algoritmy, které používají absolutní priority.

V obou případech se výběr procesu k provedení z fronty připravených provádí stejným způsobem: vybere se proces s nejvyšší prioritou. Problém určení okamžiku změny aktivního procesu je řešen různými způsoby. V systémech relativní priority Aktivní proces běží, dokud neopustí samotný procesor a nepřejde do stavu „blokování“ (nebo dojde k chybě nebo proces skončí). V systémech s absolutní priority provádění aktivního procesu je přerušeno ještě za jedné podmínky: pokud se ve frontě připravených procesů objeví proces, jehož priorita je vyšší než priorita aktivního procesu. V tomto případě přerušený proces přejde do stavu připravenosti.

V mnoha operačních systémech jsou plánovací algoritmy sestaveny pomocí kvantizace i priorit. Například plánování je založeno na kvantování, ale kvantová hodnota a (nebo) pořadí, ve kterém je proces vybírán z fronty připravených, je určeno prioritami procesů.

Existují dva hlavní typy procedur plánování procesů: preemptivní a nepreemptivní.

Nepreemptivní multitasking(Nepreemptivní multitasking) je metoda plánování procesů, při které běží aktivní proces, dokud z vlastní iniciativy neposkytne řízení plánovači operačního systému, aby z fronty vybral jiný proces připravený ke spuštění.

Preemptivní multitasking(Preemptivní multitasking) je metoda, při které rozhodnutí o přepnutí procesoru z provádění jednoho procesu na provádění jiného provádí plánovač operačního systému, nikoli samotná aktivní úloha.

Pojmy „preemptivní“ a „nepreemptivní“ jsou někdy ztotožňovány s pojmy prioritní a neprioritní disciplíny, což je zcela nesprávné, a také s pojmy absolutní a relativní priority, což je částečně nesprávné. Preemptivní a nepreemptivní multitasking jsou širší pojmy než prioritní typy. Priority úkolů mohou, ale nemusí být použity v metodách preemptivního i nepreemptivního plánování. V případě použití priorit lze tedy disciplínu relativních priorit klasifikovat jako třídu systémů s nepreemptivním multitaskingem a disciplínu absolutních priorit lze klasifikovat jako třídu systémů s preemptivním multitaskingem. Disciplína neprioritního plánování, založená na přidělování stejných časových úseků pro všechny úkoly, odkazuje na preemptivní algoritmy.

Hlavním rozdílem mezi preemptivním a nepreemptivním multitaskingem je míra centralizace mechanismu plánování úloh. Na preemptivní multitasking mechanismus plánování úloh je zcela koncentrován v OS a programátor píše svou aplikaci bez obav, že bude spuštěna paralelně s jinými úlohami. V tomto případě OS provádí následující funkce: určuje okamžik, kdy je aktivní úloha odstraněna z provádění, pamatuje si její kontext, vybírá další z fronty připravených úloh a spouští ji k provedení, načte její kontext. Na nepreemptivní multitasking Mechanismus plánování je distribuován mezi systém a aplikační programy. Aplikační program po obdržení řízení z operačního systému sám určí okamžik dokončení své další iterace a předá řízení operačního systému pomocí nějakého systémového volání a operační systém vytvoří fronty úloh a vybere další úlohu k provedení v souladu s některými algoritmu (například s přihlédnutím k prioritám) . Tento mechanismus vytváří problémy jak uživatelům, tak vývojářům.

Pro uživatele to znamená ztrátu kontroly nad systémem na libovolnou dobu, kterou určuje aplikace (nikoli uživatel). Pokud aplikace tráví příliš mnoho času nějakou činností, například formátováním disku, uživatel nemůže přepnout z této úlohy na jinou, například do textového editoru, zatímco formátování pokračuje na pozadí. Tato situace je nežádoucí, protože uživatelé obvykle nechtějí dlouho čekat, než stroj dokončí svůj úkol. Proto vývojáři aplikací pro preemptivní operační prostředí, přebírajíce odpovědnost plánovače, musí navrhovat aplikace tak, aby plnily své úkoly po malých částech. Formátovací program může například naformátovat jednu stopu diskety a vrátit řízení systému. Po dokončení dalších úkolů systém vrátí řízení formátovači, aby naformátoval další stopu. Tento způsob dělení času mezi úkoly funguje, ale výrazně komplikuje vývoj programů a klade zvýšené nároky na kvalifikaci programátora. Programátor musí zajistit, aby byl jeho program "přátelský" k ostatním programům běžícím současně s ním, což jim dává často kontrolu. Extrémním projevem „nepřívětivosti“ aplikace je její zamrzání, které vede k celkovému pádu systému. V systémech s preemptivním multitaskingem jsou takové situace obvykle vyloučeny, protože centrální plánovací mechanismus odstraní zaseknutý úkol z provádění.

Distribuce funkcí plánovače mezi systémem a aplikacemi však není vždy nevýhodou a za určitých podmínek může být i výhodou, protože umožňuje vývojáři aplikace navrhnout plánovací algoritmus, který je pro danou fixní sadu úloh nejvhodnější. Vzhledem k tomu, že vývojář sám určuje v programu okamžik, kdy se řízení vrátí, eliminuje to iracionální přerušení programů v „nevhodných“ okamžicích. Problémy se sdílením dat jsou navíc snadno vyřešeny: úloha je používá výhradně během každé iterace a je si jistá, že během tohoto období nikdo jiný tato data nezmění. Významnou výhodou preemptivních systémů je vyšší rychlost přepínání z úkolu na úkol.

Příkladem efektivního využití nepreemptivního multitaskingu je souborový server NetWare, který především díky tomu dosáhl vysoké rychlosti souborových operací.

Nicméně téměř všechny moderní operační systémy zaměřené na výkonné spouštění aplikací (UNIX, Windows NT, OS/2, VAX/VMS) implementují preemptivní multitasking. V poslední době přichází řada na operační systémy desktopové třídy. Možná z tohoto důvodu se často nazývá preemptivní multitasking věrný.

8.2.1. Základní pojmy

Operační systém Windows 2000 podporuje tradiční procesy, které mohou vzájemně komunikovat a synchronizovat se stejným způsobem jako procesy UNIX. Každý proces obsahuje alespoň jedno vlákno, které zase obsahuje alespoň jedno vlákno (odlehčené vlákno). Procesy lze navíc kombinovat do úloh pro správu konkrétních zdrojů. Úlohy, procesy, vlákna a vlákna dohromady tvoří společnou sadu nástrojů pro správu zdrojů a implementaci paralelismu na jednoprocesorových i víceprocesorových strojích.

Cvičení ve Windows 2000, kolekce jednoho nebo více procesů, které jsou spravovány jako jedna jednotka. Každá úloha má zejména přidružené kvóty a limity zdrojů, které jsou uloženy v odpovídajícím objektu úlohy. Kvóty zahrnují položky, jako je maximální počet procesů (zabraňuje procesům úlohy vytvářet nekontrolovaný počet podřízených procesů), celkový čas CPU dostupný pro každý proces jednotlivě a pro všechny procesy dohromady, stejně jako maximální množství paměti použité pro procesu a pro celou práci. Úlohy mohou také omezit své procesy z bezpečnostních důvodů, například jim zabránit v získání práv správce (superuživatele), i když mají správné heslo.

Stejně jako v systému UNIX, procesy jsou kontejnery na zdroje. Každý proces má 4gigabajtový adresní prostor, ve kterém uživatel zabírá spodní 2 GB (ve Windows 2000 Advanced Server a Datacenter Server lze volitelně navýšit na 3 GB) a zbytek zabírá operační systém. Operační systém je tedy přítomen v adresovém prostoru každého procesu, i když je chráněn před změnami hardwarovou MMU. Proces má ID procesu, jedno nebo více vláken, seznam úchytů (spravovaných v režimu jádra) a přístupový token, který ukládá informace o zabezpečení. Procesy se vytvářejí pomocí volání Win32, které bere jako vstup název spustitelného souboru, který určuje počáteční obsah adresního prostoru a vytváří první vlákno.

Každý proces začíná jedním vláknem, ale nová vlákna lze vytvářet dynamicky. Proudy tvoří základ plánování CPU, protože operační systém si ke spuštění vždy vybere vlákno spíše než proces. Podle toho má každé vlákno svůj stav (připraveno, spuštěno, blokováno atd.), zatímco procesy nikoli. Vlákna lze dynamicky vytvářet voláním Win32, kterému je přidělena adresa zahájení provádění v adresovém prostoru procesu. Každé vlákno má ID vlákna nakreslené ze stejného prostoru jako ID procesu, takže stejné ID nebude nikdy použito pro proces i vlákno. ID procesů a vláken jsou násobky čtyř, takže je lze použít jako bajtové indexy v tabulkách jádra, stejně jako jiné objekty.

Obvykle vlákno běží v uživatelském režimu, ale když provede systémové volání, přepne se do režimu jádra, po kterém pokračuje ve spouštění stejného vlákna se stejnými vlastnostmi a omezeními, jaké mělo v uživatelském režimu. Každé vlákno má dva zásobníky – jeden se používá v režimu jádra a druhý v uživatelském režimu. Kromě stavu, ID a dvou zásobníků má každé vlákno kontext (který ukládá své registry, když není spuštěn), soukromou oblast pro lokální proměnné a může mít také svůj vlastní přístupový token. Pokud má vlákno svůj vlastní přístupový token, přepíše přístupový token procesu, takže klientská vlákna mohou přenést svá přístupová práva na serverová vlákna, která za ně pracují. Když vlákno dokončí svou práci, může přestat existovat. Když přestane existovat poslední aktivní vlákno, proces se ukončí.

Je důležité pochopit, že vlákna jsou konceptem plánování, nikoli konceptem vlastnictví zdrojů. Každé vlákno má přístup ke všem objektům svého procesu. Jediné, co k tomu musí udělat, je získat kliku a provést příslušné volání Win32. Neexistují žádná omezení pro přístup vlákna k objektu na základě toho, zda byl objekt vytvořen nebo otevřen jiným vláknem. Systém ani nesleduje, který objekt byl vytvořen kterým vláknem. Jakmile je popisovač objektu umístěn do tabulky popisovačů procesu, může jej použít libovolné vlákno v procesu.

Kromě normálních vláken běžících v uživatelských procesech má operační systém Windows 2000 mnoho procesů démonů, které nejsou spojeny s žádným uživatelským procesem (jsou spojeny se speciálním systémem nebo nečinnými procesy). Někteří démoni provádějí administrativní úlohy, jako je zápis nečistých (upravených) stránek na disk, zatímco jiní tvoří fond a mohou být používáni runtime komponentami nebo ovladači, které potřebují provádět některé asynchronní úlohy na pozadí. Přepínání vláken ve Windows 2000 trvá poměrně dlouho, protože vyžaduje přepnutí do režimu jádra a poté návrat do uživatelského režimu. Windows 2000 používá systém Windows 2000, aby poskytoval vysoce odlehčenou pseudoparalelnost vlákna, podobné vláknům, ale naplánované v uživatelském prostoru programem (nebo jeho runtime systémem), který je vytvořil. Každé vlákno může mít více vláken, stejně jako proces může mít více vláken, s tím rozdílem, že když je vlákno logicky zablokováno, je umístěno do fronty blokovaných vláken, načež je vybráno další vlákno v kontextu stejného vlákna. běžet. Operační systém o změně vláken neví, protože stále funguje stejné vlákno. Protože operační systém neví nic o vláknech, na rozdíl od úloh, procesů a vláken, nejsou s nimi spojeny žádné objekty prováděcího systému. Neexistují žádná skutečná systémová volání pro řízení vláken. K tomu však existují volání Win32 API. Odkazují na ta volání Win32 API, která neprovádějí systémová volání.

Všimněte si, že operační systém Windows 2000 může běžet na symetrických víceprocesorových systémech. To znamená, že kód operačního systému musí být zcela reentrantní, to znamená, že každá procedura musí být napsána tak, aby dva nebo více centrálních procesorů mohly bez problémů měnit své proměnné. V mnoha případech to znamená, že sekce programu musí být chráněny pomocí spinlocků nebo mutexů, které udržují další CPU v pohotovostním režimu, dokud první CPU nedokončí svou práci (pomocí sekvenčního přístupu do kritických oblastí).

Horní limit 32 procesorů je pevný limit, protože mnoho míst v operačním systému používá 32bitové bitmapy o velikosti slova k zohlednění využití procesoru. Například jedno jednoslovné bitové pole se používá ke sledování toho, který CPU je aktuálně volný, a další pole se používá pro každý proces k výpisu CPU, na kterých může tento proces běžet. 64bitová verze Windows 2000 by měla být schopna bez námahy podporovat až 64 CPU. Překročení tohoto limitu by vyžadovalo značné přepracování programu (použití několika slov pro bitmapy).

V tomto článku se budeme bavit o tématech jako např procesy a vlákna, deskriptory procesu, pojďme si promluvit synchronizace toků a pojďme se dotknout každého oblíbeného správce úloh systému Windows.

Po celou dobu existence proces jeho provádění lze mnohokrát přerušit a pokračovat v něm. Chcete-li obnovit provádění proces, je nutné obnovit stav jeho provozního prostředí. Stav operačního prostředí zobrazuje stav registrů a programového čítače, provozní režim procesoru, ukazatele na otevřené soubory, informace o nedokončených I/O operacích, chybové kódy systémových volání prováděných tímto procesem atd. Tato informace se nazývá kontextu procesu.

Aby OS řídil procesy, musí mít k tomu všechny potřebné informace. Za tímto účelem každý proces začíná procesní rukojeť.

Deskriptor – speciální informační struktura, která je vytvořena pro každý proces (deskriptor úlohy, řídicí blok úlohy).

Obecně deskriptor obsahuje následující informace:

  1. ID procesu.
  2. Typ procesu (nebo třída), který definuje některá pravidla poskytování prostředků pro supervizora.
  3. Priorita procesu.
  4. Stavová proměnná, která určuje, v jakém stavu se proces nachází (připraven ke spuštění, běžící, čeká na I/O zařízení atd.)
  5. Chráněná paměťová oblast (nebo adresa takové zóny), ve které jsou uloženy aktuální hodnoty registrů procesoru, pokud je proces přerušen, aniž by dokončil svou práci. Tato informace se nazývá kontext úkolu.
  6. Informace o prostředcích, které proces vlastní a/nebo má právo je používat (ukazatele na otevření souborů, informace o čekajících I/O operacích atd.).
  7. Místo (nebo jeho adresa) pro organizaci komunikace s jinými procesy.
  8. Parametry doby spouštění (časový okamžik, kdy má být proces aktivován, a frekvence tohoto postupu).
  9. V případě nepřítomnosti systému správy souborů adresa úlohy na disku v jejím počátečním stavu a adresa na disku, kde se úloha uvolní z paměti RAM, pokud je nahrazena jinou.

Zpracovat rukojeť Oproti kontextu obsahuje více provozních informací, které by měly být snadno dostupné pro subsystém plánování procesů. Kontext procesu obsahuje méně relevantní informace a operační systém jej používá až poté, co bylo učiněno rozhodnutí o obnovení přerušeného procesu.

Deskriptory, jsou zpravidla trvale umístěny v paměti RAM, aby se urychlila práce vedoucího, který je organizuje do seznamů (front) a zobrazuje změny stavu procesu přesouváním odpovídajícího deskriptoru z jednoho seznamu do druhého.

Pro každý stav (kromě stavu běhu pro jednoprocesorový systém) udržuje operační systém odpovídající seznam úloh, které jsou v tomto stavu. Může však existovat více než jeden seznam pro stav čekání, ale stav čekání může způsobit tolik různých typů zdrojů.

Například může existovat tolik stavů čekání na dokončení I/O operace, kolik je I/O zařízení v systému.

Procesy a vlákna

Pro podporu multiprogramování musí OS definovat a navrhnout pro sebe ty vnitřní jednotky práce, mezi které bude rozdělen procesor a další počítačové zdroje. V současné době většina operačních systémů definuje dva typy jednotek práce:

  • Proces(větší jednotka práce).
  • Tok(vlákno nebo vlákno) je menší jednotka práce, kterou proces vyžaduje k dokončení.
  • Když mluví o procesech, pak chtějí poznamenat, že operační systém podporuje jejich izolaci: každý proces má svůj vlastní virtuální adresní prostor, každému procesu jsou přiřazeny jeho vlastní zdroje – soubory, okna atd. Taková izolace je nutná, aby byl jeden proces chráněn před jiným, protože oni, sdílející všechny zdroje výpočetního systému, spolu soutěží.

Obecně procesy jednoduše spolu nijak nesouvisí a mohou dokonce patřit různým uživatelům sdílejícím stejný počítačový systém. Jinými slovy, v případě procesů je OS považuje za zcela nesouvisející a nezávislé. V tomto případě je to OS, kdo je zodpovědný za konkurenci mezi procesy o zdroje.

Pro zvýšení rychlosti procesů je možné využít vnitřní paralelismus v procesech samotných. procesy.

Například některé operace prováděné aplikací mohou vyžadovat poměrně velké využití CPU. V tomto případě je uživatel při interaktivní práci s aplikací nucen dlouho čekat na dokončení objednané operace a nemůže aplikaci ovládat, dokud není operace dokončena až do úplného konce. K takovým situacím dochází poměrně často, například při zpracování velkých obrázků v grafických editorech. Pokud jsou softwarové moduly, které provádějí tak dlouhé operace, navrženy jako nezávislé „podprocesy“ ( proudy), které budou prováděny paralelně s dalšími „podprocesy“, pak má uživatel možnost provádět současně více operací v rámci jedné aplikace (procesu).

Lze rozlišit následující rozdíly vlákna z procesů:

  • OS pro vlákna by neměl organizovat plnohodnotný virtuální stroj.
  • Vlákna nemají vlastní prostředky, vyvíjejí se ve stejném virtuálním adresovém prostoru a mohou využívat stejné soubory, virtuální zařízení a další prostředky jako daný proces.
  • Jediné, co vlákna musí mít, jsou prostředky CPU. Na jednoprocesorovém systému sdílejí vlákna mezi sebou čas procesoru stejným způsobem jako normální procesy, ale na víceprocesorovém systému se mohou spouštět současně, pokud nenarazí na konkurenci kvůli přístupu k jiným zdrojům.

Hlavní věc, která zajišťuje multithreading, je schopnost provádět několik typů operací paralelně v jednom aplikačním programu. Díky tomu je realizováno efektivní využití zdrojů CPU a celková doba provádění úloh se zkracuje.

Pokud byl například tabulkový procesor nebo textový procesor navržen s ohledem na možnosti vícevláknového zpracování, mohl by uživatel požádat o přepočet svého listu nebo sloučení více dokumentů a současně pokračovat ve vyplňování tabulky nebo otevření dalšího dokumentu pro úpravy. .

Správce úloh WINDOWS

Správce úloh zobrazuje informace o programech a procesy provádění na počítači. Můžete si zde také prohlédnout nejčastěji používané metriky výkonnosti procesů.

Správce úloh slouží k zobrazení klíčových ukazatelů výkonu počítače. U spuštěných programů můžete zobrazit jejich stav a ukončit programy, které přestaly reagovat. Aktivitu běžících procesů můžete zobrazit pomocí až 15 parametrů, dále grafy a informace o využití CPU a paměti.

Kromě toho, pokud jste připojeni k síti, můžete zobrazit stav sítě a parametry výkonu. Pokud je k vašemu počítači připojeno více uživatelů, můžete vidět jejich jména, jaké úkoly provádějí a poslat jim zprávu.

Na kartě Procesy zobrazuje informace o procesech běžících na počítači: informace o využití CPU a paměti, počítadlo procesů a některé další parametry:

Na kartě Výkon se zobrazí informace o čítači deskriptorů a vláknech, parametry paměti:

Potřeba pro synchronizace vláken se vyskytuje pouze v multiprogramovém OS a je spojen se sdíleným používáním počítačového hardwaru a informačních zdrojů. Synchronizace je nezbytná, aby se zabránilo závodům (viz níže) a zablokování při výměně dat mezi vlákny, sdílení dat a při přístupu k procesoru a I/O zařízením.

Synchronizace vláken a procesů spočívá v koordinaci jejich rychlostí pozastavením toku do vzniku určité události a jeho následnou aktivací při vzniku této události.

Zanedbání problémů se synchronizací ve vícevláknovém systému může vést k nesprávnému řešení problému nebo dokonce k pádu systému.

Příklad . Úkolem udržovat databázi zákazníků pro určitý podnik.

Každému klientovi je v databázi přiřazen samostatný záznam, který obsahuje pole Objednávka a Platba. Program, který spravuje databázi, je navržen jako jeden proces s několika vlákny, včetně:

  • Vlákno A, které zadává do databáze informace o přijatých objednávkách od zákazníků.
  • Vlákno B, které zaznamenává do databáze informace o platbách odběratelů za faktury.

Obě tato vlákna spolupracují na společném databázovém souboru pomocí stejného typu algoritmů:

  1. Načtěte záznam s daným identifikátorem z databázového souboru do vyrovnávací paměti na klientovi.
  2. Zadejte novou hodnotu do pole Objednávka (pro tok A) nebo platba (pro tok B).
  3. Vraťte upravený záznam do souboru databáze.

Označme kroky 1-3 pro tok A jako A1-A3 a pro tok B jako B1-B3. Předpokládejme, že vlákno A v určitém okamžiku aktualizuje pole Objednávka záznamu o klientovi N. Za tímto účelem načte tento záznam do své vyrovnávací paměti (krok A1), upraví hodnotu pole Objednávka (krok A2), ale neprovede mít čas provést záznam v databázi, protože jeho provádění je přerušeno například z důvodu uplynutí časového úseku.

Předpokládejme, že vlákno B také potřebovalo zadat platební údaje týkající se stejného klienta N. Když přijde na řadu vlákno B, podaří se mu načíst záznam do jeho vyrovnávací paměti (krok B1) a aktualizovat pole Platba(krok B2) a poté se přeruší. Všimněte si, že ve vyrovnávací paměti proudu B je záznam o klientovi N, ve kterém je pole Objednávka má stejný, nezměněný význam.

Důležitý koncept synchronizace procesu je koncept „kritické části“ programu. Kritická sekce je část programu, ve které se přistupuje ke sdíleným datům. Chcete-li eliminovat vliv podmínek závodu na zdroj, je nutné zajistit, aby v kritické sekci přidružené k tomuto zdroji byl v každém okamžiku maximálně jeden proces. Tato technika se nazývá vzájemné vyloučení.

Nejjednodušší způsob, jak vynutit vzájemné vyloučení, je umožnit procesu v kritické sekci zakázat všechna přerušení. Tato metoda je však nevhodná, protože je nebezpečné důvěřovat uživatelskému procesu, který řídí systém; může zaměstnávat procesor na dlouhou dobu, a pokud dojde k selhání procesu v kritické oblasti, zhroutí se celý systém, protože přerušení nebudou nikdy povolena.

Dalším způsobem je použití blokovacích proměnných. Každý sdílený prostředek má přidruženou binární proměnnou, která má hodnotu 1, pokud je zdroj volný (to znamená, že žádný proces není aktuálně v kritické sekci spojené s tímto procesem) a hodnotu 0, pokud je prostředek zaneprázdněn. Obrázek níže ukazuje fragment procesního algoritmu, který používá blokovací proměnnou F(D) k implementaci vzájemného vyloučení přístupu ke sdílenému zdroji D. Před vstupem do kritické sekce proces zkontroluje, zda je zdroj D volný. Pokud je obsazený, pak se kontrola cyklicky opakuje, pokud je volný, pak se nastaví hodnota proměnné F(D) a proces vstupuje do kritické sekce. Poté, co proces dokončí všechny operace se sdíleným zdrojem D, je hodnota proměnné F(D) opět nastavena na 1.

Pokud jsou všechny procesy napsány pomocí výše uvedených konvencí, pak je zaručeno vzájemné vyloučení. Je třeba poznamenat, že operace kontroly a nastavení blokovací proměnné musí být nedělitelné. To je vysvětleno následovně. Předpokládejme, že v důsledku kontroly proměnné proces zjistil, že zdroj je volný, ale bezprostředně poté, aniž by měl čas nastavit proměnnou na 0, byl přerušen. Zatímco byl pozastaven, jiný proces obsadil zdroj, vstoupil do jeho kritické sekce, ale byl také přerušen, aniž by dokončil práci se sdíleným zdrojem. Když bylo řízení vráceno prvnímu procesu, s ohledem na volné prostředky nastavil znamení zaneprázdnění a začal provádět svou kritickou sekci. Došlo tak k porušení principu vzájemného vyloučení, což by potenciálně mohlo vést k nežádoucím důsledkům. Aby se takovým situacím předešlo, je vhodné mít v příkazovém systému stroje jeden příkaz „check-install“ nebo pomocí systémových prostředků implementovat odpovídající softwarová primitiva, která by znemožnila přerušení během celé operace kontroly a instalace.

Implementace kritických sekcí pomocí blokovacích proměnných má značnou nevýhodu: během doby, kdy je jeden proces v kritické sekci, bude jiný proces, který vyžaduje stejný zdroj, provádět rutinní úkol dotazování na blokující proměnnou, čímž plýtvá časem procesoru. K eliminaci takových situací lze využít tzv. eventový aparát. Tento nástroj lze použít k řešení nejen problémů vzájemného vyloučení, ale také obecnějších problémů se synchronizací procesů. V různých operačních systémech je aparát událostí implementován svým vlastním způsobem, ale v každém případě se používají systémové funkce podobného účelu, které se konvenčně nazývají WAIT(x) a POST(x), kde x je identifikátor nějakého událost.

Pokud je zdroj zaneprázdněn, pak proces neprovádí cyklické dotazování, ale volá systémovou funkci WAIT(D), zde D označuje událost, že je zdroj D uvolněn. Funkce WAIT(D) uvede aktivní proces do stavu WAITING a ve svém deskriptoru zaznamená, že proces čeká na událost D. Proces, který aktuálně využívá prostředek D, po opuštění kritické sekce provede systémovou funkci POST(D), v důsledku čehož operační systém prohledá frontu čekajících procesů a uvede proces čekající na událost D do stavu READY.

Obecný způsob synchronizace procesů navrhl Dijkstra, který představil dvě nová primitiva. V abstraktní podobě tato primitiva, označovaná P a V, operují s nezápornými celočíselnými proměnnými tzv. semafory. Nechť je S takovým semaforem. Operace jsou definovány takto:

V(S): proměnná S se zvýší o 1 s jednou nedělitelnou akcí; načítání, inkrementace a ukládání nelze přerušit a během této operace k S není přistupováno jinými procesy.

P(S): Pokud je to možné, sníží S o 1. Je-li S=0, pak je nemožné snížit S a zůstat v oblasti nezáporných celočíselných hodnot, v takovém případě proces volající operaci P čeká, dokud nebude možné toto snížení. Nedělitelná je také úspěšná kontrola a redukce.

Ve speciálním případě, kdy semafor S může nabývat pouze hodnot 0 a 1, se změní na blokující proměnnou. Operace P má potenciál uvést proces, který ji provádí, do stavu čekání, zatímco operace V může za určitých okolností aktivovat jiný proces, který byl pozastaven operací P.

Zablokování procesu

Při organizování paralelního provádění několika procesů je jednou z hlavních funkcí OS správné rozdělení zdrojů mezi běžící procesy a poskytování procesů s prostředky vzájemné synchronizace a výměny dat.

Při paralelním provádění procesů mohou nastat situace, kdy jsou dva nebo více procesů neustále v zablokovaném stavu. Nejjednodušší případ je, když každý ze dvou procesů čeká na zdroj obsazený druhým procesem. Kvůli tomuto čekání nemůže žádný proces pokračovat v provádění a nakonec uvolnit prostředek potřebný pro druhý proces. Toto uváznutí se nazývá uváznutí(mrtvý zámek) slepá ulička, skoba nebo uváznutí.

V multitaskingovém systému se říká, že proces uvázne, pokud čeká na událost, která nikdy nenastane.

Zablokování je třeba odlišit od jednoduchých front, i když obojí vzniká, když jsou zdroje sdíleny, a vypadají podobně: proces je pozastaven a čeká, až se zdroj uvolní. Fronta je však normální a je neodmyslitelnou známkou vysokého využití zdrojů, když požadavky přicházejí náhodně. Dochází k němu, když zdroj není momentálně dostupný, ale po nějaké době je uvolněn a proces pokračuje ve svém provádění. Zablokování je poněkud neřešitelná situace.

Problém uváznutí zahrnuje následující úkoly:

  1. předcházení uváznutí.
  2. rozpoznávání uváznutí.
  3. obnovení systému po uváznutí.

Zablokování lze zabránit ve fázi psaní programů, to znamená, že programy musí být napsány tak, aby nemohlo dojít k uváznutí při jakémkoli poměru vzájemných rychlostí procesů. Pokud tedy v předchozím příkladu proces A a proces B požadovaly zdroje ve stejném pořadí, pak by uváznutí v zásadě nebylo možné. Druhý přístup k předcházení uváznutí se nazývá dynamický a zahrnuje použití určitých pravidel při přiřazování zdrojů k procesům, například zdroje mohou být alokovány v určitém pořadí, které je společné všem procesům.

V některých případech, kdy dojde k uváznutí mezi mnoha procesy využívajícími mnoho zdrojů, je rozpoznání zablokování netriviální úkol. Existují formální, softwarově implementované metody pro rozpoznání uváznutí, založené na udržování tabulek alokace zdrojů a tabulek dotazů na obsazené zdroje. Analýza těchto tabulek umožňuje odhalit uváznutí.

Pokud dojde k uváznutí, pak není nutné odstraňovat všechny zablokované procesy z provádění. Můžete odstranit pouze některé z nich, čímž se uvolní zdroje očekávané jinými procesy, některé procesy můžete vrátit do swapovací oblasti, některé procesy můžete „vrátit“ do tzv. kontrolního bodu, kde jsou uloženy všechny informace potřebné k obnovení programu provedení z daného místa. Kontrolní body jsou v programu umístěny na místa, po kterých může dojít k uváznutí.




Nahoru