Többfeladatos

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2021. március 16-án felülvizsgált verziótól ; az ellenőrzések 9 szerkesztést igényelnek .

A multitasking ( angolul  multitasking ) az operációs rendszer vagy a futási környezet olyan tulajdonsága, amely lehetővé teszi több feladat párhuzamos (vagy pszeudo -párhuzamos) feldolgozását . Az operációs rendszer valódi többfeladatos kezelése csak elosztott számítástechnikai rendszerekben lehetséges .

A többfeladatos munkavégzésnek két típusa van [1] :

A multithreading  a multitasking egy speciális formája [1] .

Többfeladatos környezet tulajdonságai

A primitív többfeladatos környezetek tiszta "erőforrás-megosztást" biztosítanak, ahol minden feladathoz egy meghatározott memóriaterület van hozzárendelve, és a feladat szigorúan meghatározott időközönként aktiválódik.

A fejlettebb többfeladatos rendszerek dinamikusan allokálják az erőforrásokat, amikor egy feladat elindul a memóriában vagy elhagyja a memóriát, a prioritásától és a rendszer stratégiájától függően. Ez a többfeladatos környezet a következő funkciókkal rendelkezik:

A többfeladatos környezet megvalósításának nehézségei

A többfeladatos környezet megvalósításának fő nehézsége a megbízhatóság, amely a memóriavédelemben, a hibák és megszakítások kezelésében , valamint a lefagyások és holtpontok elleni védelemben fejeződik ki .

A többfeladatos környezetnek a megbízhatóságon túl hatékonynak is kell lennie. A karbantartáshoz szükséges erőforrások költsége nem akadályozhatja meg a folyamatokat, nem lassíthatja le munkájukat, nem korlátozhatja élesen a memóriát.

A többfeladatos operációs rendszerek története

A többfeladatos operációs rendszerek bevezetése eleinte komoly technikai nehézséget jelentett, ezért a multitasking rendszerek bevezetése elhúzódott, a felhasználók pedig a bevezetés után még sokáig az egyfeladatos rendszereket preferálták.

Később, több sikeres megoldás megjelenése után, a multitasking környezetek fejlődésnek indultak, és ma már mindenhol használatosak.

Az operációs rendszer multitaskingját először a Multics operációs rendszer fejlesztése során valósították meg ( 1964 ). Az egyik első többfeladatos rendszer az OS/360 (1966 [2] ), amelyet az IBM számítógépekhez és szovjet megfelelőihez, az ES EVM -hez használtak . A rendszer fejlesztése nagymértékben késett, és az IBM először egy egyfeladatos DOS - t javasolt az ügyfelek megelégedésére az OS / 360 teljes üzembe helyezése előtt. A rendszert kritika érte az alacsony megbízhatóság és a működési nehézségek miatt.

1969- ben a Multics bázisán kifejlesztették a UNIX rendszert , amely egy meglehetősen ügyes algoritmikus megoldást kínál a multitasking problémájára. Jelenleg több tucat operációs rendszert hoztak létre UNIX alapján.

A PDP-11 számítógépek és szovjet SM-4 társaik az RSX-11 multitasking rendszert (a szovjet megfelelője az SM EVM RTOS ), valamint a TSX-PLUS időelosztó rendszert használták, amely korlátozott többfeladatos képességet és többfelhasználós időt biztosít. megosztási mód, amely minden felhasználó számára egy egyfeladatos RT-11- et (szovjet analóg - RAFOS ) emulál. Ez utóbbi megoldás nagy népszerűségnek örvendett a teljes értékű multitasking rendszer alacsony hatékonysága és megbízhatósága miatt.

Ügyes megoldásnak bizonyult az eredetileg VAX számítógépekhez kifejlesztett VMS operációs rendszer (a szovjet megfelelője az SM-1700 ) az RSX-11 továbbfejlesztéseként.

A világ első multimédiás személyi számítógépe , az Amiga 1000 ( 1984 ) eredetileg teljes hardveres támogatással készült az AmigaOS valós idejű megelőző többfeladatos munkavégzéséhez . Ebben az esetben a hardver és a szoftver fejlesztése párhuzamosan zajlott, ami oda vezetett, hogy a multitasking ütemező kvantálás tekintetében (1/50 másodperc kontextusváltásonként) az AmigaOS sokáig felülmúlhatatlan maradt a személyi számítógépeken .

A multitasking szolgáltatást a Microsoft Windows operációs rendszereken is biztosította . A VMS tapasztalatok alkalmazása lényegesen nagyobb teljesítményt és megbízhatóságot biztosított a rendszereknek. A többfeladatos kontextusváltási idő (kvantálás) szempontjából csak ezek az operációs rendszerek hasonlíthatók össze az AmigaOS-szel és a UNIX-szal (és annak leszármazottaival, mint például a Linux kernellel ).

Érdekes módon a multitasking nem csak a működési környezetben, hanem nyelvi környezetben is megvalósítható. Például a Modula-2 és az Ada programozási nyelvek specifikációi megkövetelik a multitasking támogatását bármely operációs rendszeren kívül. Ennek eredményeként a JPI / Clarion által a TopSpeed ​​​​Modula-2 programozási nyelv népszerű implementációja az 1990- es évek első felében lehetővé tette a többfeladatos (kooperatív és megelőző – lásd alább) különböző típusú multitasking megszervezését egy szál számára. program egy olyan alapvetően egyfeladatos operációs rendszeren belül, mint az MS-DOS . Ez úgy történt, hogy a programmodulba egy kompakt feladatütemezőt is beépítettek , amely egy időzítő megszakításkezelőt tartalmaz [3] . Azokat a programozási nyelveket, amelyek rendelkeznek ezzel a tulajdonsággal, néha valós idejű nyelveknek is nevezik [4] .

A pszeudo-párhuzamos multitasking típusai

Könnyű váltás

A multitasking olyan típusa, amelyben az operációs rendszer egyszerre két vagy több alkalmazást tölt be a memóriába, de csak a főalkalmazás kap CPU-időt. A háttérben futó alkalmazás futtatásához aktiválni kell. Az ilyen multitasking nem csak az operációs rendszerben, hanem feladatváltó programok segítségével is megvalósítható. Ebben a kategóriában ismert a DESQview program , amely DOS alatt futott és 1985-ben jelent meg először.

Előnyök: a már futó programokat használhatja, anélkül, hogy a multitasking szem előtt tartásával készült volna.

Hátrányok: lehetetlen olyan nem interaktív rendszerekben, amelyek emberi beavatkozás nélkül működnek. A programok közötti interakció rendkívül korlátozott.

Együttműködő vagy kooperatív multitasking

A többfeladatos munka olyan típusa, amelyben a következő feladat csak azután fut le, hogy az aktuális feladat kifejezetten készen áll arra, hogy a CPU-nak időt adjon más feladatoknak. Speciális esetként ilyen deklarációra van szükség, amikor egy már foglalt mutex objektumot (Linux kernel) próbálunk rögzíteni, valamint amikor a következő üzenet megérkezésére várunk a felhasználói felület alrendszerétől (Windows-verziók 3.x -ig, beleértve, valamint a 16 bites alkalmazások a Windows 9x rendszerben ).

A kooperatív többfeladatos tevékenységet "második fokozatú" multitaskingnak nevezhetjük, mert fejlettebb technikákat használ, mint a sok jól ismert program által megvalósított egyszerű feladatváltás (például az MS-DOS 5.0 -s DOS Shell ). Egy egyszerű kapcsolóval az aktív program megkapja az összes CPU-időt, a háttérben futó alkalmazások pedig teljesen lefagynak. A kooperatív többfeladatos munkavégzés révén egy alkalmazás valójában annyi CPU-időt tud lefoglalni, amennyit jónak lát. Minden alkalmazás megosztja a CPU-időt, és időszakonként átadja a vezérlést a következő feladatnak.

A kooperatív többfeladatos munkavégzés előnyei: nincs szükség az összes megosztott adatszerkezet védelmére olyan objektumokkal, mint a kritikus szakaszok és mutexek, ami leegyszerűsíti a programozást, különösen a kód portolását egyfeladatos környezetekből többfeladatos környezetbe.

Hátrányok: az összes alkalmazás nem tud működni, ha az egyikben hiba lép fel, ami a „CPU-idő megadása” művelet hívásának hiányához vezet. Rendkívül nehéz lehetőség egy többfeladatos I / O architektúra megvalósítására az operációs rendszer kernelében, amely lehetővé teszi a processzor számára, hogy egy feladatot hajtson végre, miközben egy másik feladat I / O műveletet kezdeményezett, és annak befejezésére vár.

Megelőző vagy megelőző többfeladatos ( valós idejű )

A multitasking olyan típusa, amelyben az operációs rendszer maga adja át az irányítást egyik végrehajtható programról a másikra az I / O műveletek befejezése, a számítógép hardverében bekövetkező események, az időzítők és időszeletek lejárta vagy a nyugta esetén. bizonyos jelek egyik programból a másikba. Az ilyen típusú többfeladatos munkavégzés során a processzor átkapcsolható az egyik program végrehajtásáról egy másik végrehajtására anélkül, hogy az első programra volna szükség, és szó szerint a kódjában szereplő két utasítás között. A processzoridő elosztását a folyamatütemező végzi. Ezenkívül minden feladathoz a felhasználó vagy maga az operációs rendszer is hozzárendelhet egy bizonyos prioritást, ami rugalmasan szabályozza a processzoridő feladatok közötti elosztását (például csökkentheti egy erőforrás-igényes program prioritását, ezáltal sebességének csökkentése, de a háttérfolyamatok teljesítményének növelése). Ez a fajta multitasking gyorsabb választ ad a felhasználói műveletekre.

Előnyök:

Hibák:

Olyan operációs rendszerekben implementálva, mint:

Problémahelyzetek többfeladatos rendszerekben

Éheztetés

Az időkésleltetés a szál felébresztésétől a processzoron történő meghívásig, amely alatt a szál a végrehajtásra kész szálak listájában van. Az állandóan futó magasabb vagy azonos prioritású szálak miatt fordul elő.

A negatív hatás az, hogy a szál felébresztésétől a következő fontos művelet elvégzéséig késleltetés van, ami késlelteti ennek a műveletnek a végrehajtását, és ezt követően sok más összetevő munkáját.

Az éhezés szűk keresztmetszetet hoz létre a rendszerben, és megakadályozza, hogy maximális teljesítményt préseljen ki belőle, csak a hardver által vezérelt szűk keresztmetszetek korlátozzák.

A 100%-os CPU-használatot meghaladó éhínség orvosolható a kiéhezett szál prioritásának emelésével, esetleg átmenetileg.

Általános szabály, hogy az éhezés megelőzése érdekében az operációs rendszer automatikusan elindítja a végrehajtásra kész alacsony prioritású szálakat, még akkor is, ha vannak magas prioritású szálak, feltéve, hogy a szálat hosszú ideig (~10 másodperc) nem hajtották végre. Vizuálisan ezt a képet a legtöbb Windows-felhasználó jól ismeri - ha az egyik programban a szál korlátlanul hurkolt, akkor az elülső ablak jól működik, ennek ellenére az első ablakhoz társított szál, a Windows növeli a prioritást. A többi ablakot nagy késleltetéssel, másodpercenkénti adaggal rajzolják át, mert a megjelenítésük ebben a helyzetben csak az éhezésgátló mechanizmusnak köszönhetően működik (különben örökre éhezne).

Versenyfeltétel

Két kódfolyam végrehajtásának nem determinisztikus sorrendje, amelyek ugyanazt az adatot dolgozzák fel, és két különböző szálban (feladatban) hajtódnak végre. Ez a végrehajtás sorrendjének és helyességének véletlenszerű tényezőktől való függéséhez vezet.

A szükséges zárolások és szinkronizálási primitívek hozzáadásával kiküszöbölhető . Ez általában egy könnyen javítható hiba (elfelejtett zár ).

Prioritás inverzió

Az L szál prioritása alacsony, az M szál közepes, a H szál pedig magas prioritású. Az L szál megszerzi a mutexet, és a mutex tartása közben végrehajtott végrehajtás közben megszakítja az M szálat, amely valamilyen okból felébredt és magasabb prioritású. A H szál megpróbálja megszerezni a mutexet.

A kialakult helyzetben a H szál arra vár, hogy az M szál befejezze az aktuális munkát, mert miközben az M szál fut, az alacsony prioritású L szál nem kap irányítást, és nem tudja feloldani a mutexet.

Megszűnik azáltal, hogy az összes olyan szál prioritását, amelyek egy adott mutexet szereznek, ugyanolyan magas értékre emelik a mutex megtartásának időtartamára. Egyes mutex implementációk ezt automatikusan megteszik. Alternatív megoldásként egy olyan szálat, amely már megszerezte a mutexet, előléptetik, miután megpróbálják egyidejűleg megszerezni a mutexet egy magasabb prioritású szállal.

Linkek

Jegyzetek

  1. 1 2 [Herbert Schildt The Complete Java Reference, 7. kiadás: Per. angol-M.: LLC "I. D. Williams, 2007, 253-254.
  2. Mealy GH, Witt BI, Clark WA Az OS/360 funkcionális szerkezete. IBM Systems Journal, 5, 1. szám, 1966
  3. Beletsky Ya. TopSpeed: A Modula-2 nyelv kiterjesztett változata IBM személyi számítógépekhez. - M .: "Mérnökség", 1993
  4. Young S. Valós idejű algoritmikus nyelvek