Kvaziparalelní programování v jazyku SIMULA

Napsal Mgr.Radovan Kaluža (») 15. 4. 2006 v kategorii IT, internet, přečteno: 1301×

Korutina

- Korutina = kooperující podprogramy , tedy je to způsob strukturování programu, kde si podprogramy předávají řížení, ale nevolají samy sebe navzájem, korutina si pamatuje místo, kse opustila svou činnost, a poté tam i pokračuje

Kvaziparalelni programování

kvaziparalelní programování je programování při nemž se využívá kvaziparalelní systém. Kvaziparalelní systém je souhrn prostředků určený pro deterministické přepínání výpočtu mezi několika algoritmy.

Klasické (konveční) programování

při klasické programování využíváme korutiny, tzn že provádějící podprogramy začínají vždy na stejném místě – na vstupním bodu

Kvaziparalelní programování v jazyku SIMULA

Životní pravidla simulských objektů jsou korutinami, které mohou být pozastaveny a později opět aktivovány. Obrázek znázorňuje stavy, ve kterých se může nacházet objekt X ,tj. jeho tělo, které je korutinou. Objekt, který nepoužije některý z dále popsaných prostředků je nejprve ve stavu připojeném a pak přejde do stavu ukončeného (objekty v jiných OO jazycích jsou vždy ve stavu ukončeném). Ukončený objekt může být nadále používán (lze volat jeho metody a přistupovat k jeho atributům). Následující prostředky jazyka Simula (metody dostupné ve všech třídách) podporují práce s kvaziparalelními systémy (QPS):
Detach zastaví činnost daného objektu, tj. toho, který provádí příkaz detach. Objekt se stává detašovaným. Řízení se předává do místa, kde byl objekt vytvořen nebo odkud byl aktivován příkazem resume.
Resume(Y) aktivuje detašovaný objekt Y, který přechází do stavu korutiny. Objekt, který tento příkaz provedl, se detašuje.
Call(Y) je podobný příkazu resume, ale objekt Y přechází do připojeného stavu k objektu, který příkaz call provedl. Objekt, který příkaz provedl, se detašuje. Tento objekt se znovu aktivuje po detašování Y.

/obrazky/radovan.bloger.cz/simula3-1.gif

Simula stanoví, že když vznikne instance bloku, vznikne spolu s ní i cosi, co nazývá kvaziparalelním systémem (anglicky quasi-parallel system). Nehledejme za tímto termínem kdovíjaké tajuplnosti a řekněme si, že jde o jakousi neuspořádanou skupinu instancí, konkrétně jedné instance bloku (totiž té, spolu s kterou kvaziparalelní systém vznikl) a pak instanci tříd,
tedy objektů, a to objektů, které jsou lokální v dané instanci bloku a které jsou nadto v detašovaném stavu. Jinými slovy: když vznikne instance β bloku, vznikne i jí odpovídající kvaziparalelní systém Q( β) a tato instance do něho vstoupí, stane se jeho komponentou, konkrétně tak zvanou hlavní komponentou (anglicky main component). Na počátku je jedinou komponentou tohoto druhu. Když se však některý objekt lokální v β detašuje, vstoupí do Q( β), stane se také jeho komponentou, a to tak zvanou objektovou komponentou (anglicky object component), a když přestane být v detašovaném stavu, Q( β) opustí. Komponenty kvaziparalelního systému lze připojovat pomocí call(…) a tím i z něho odstraňovat, a později je nechat znovu se vrátit do kvaziparalelního systému, když provedou detach.

Kvaziparalelní systém reprezentuje jakési větvení operačních řetězců, během fáze, kdy je výpočet uvnitř příslušné hlavní komponenty; připouští totiž, že každá komponenta kvaziparalelního systému se může zúčastnit výpočtu, a při tom nemusí být volána pomocí call a nemusí předat řízení výpočtu pomocí detach jen tam, odkud byl volán. Ten prvek, který právě řídí výpočet, se nazýva operativní komponenta kvaziparalelního systému. Už víme, že když kvaziparalelní systém vznikne, je jeho jedinou a tedy i operativní komponentou jeho hlavní komponenta. Předpokládejme, že výpočet dojde do stavu, kdy tato komponenta není v kvaziparalelním systému sama, kdy už je tam nějaký detašovaný objekt X. V tom případě může hlavní komponenta provést příkaz resume(X) a předá řízení objektu X stejným způsobem, jako kdyby ho volala pomocí call. Objekt X se tedy zapojí do výpočtu, a to s celou neoperativní komponentou, jíž je záhlavím, a přejde do tak zvaného pokračujícího stavu (anglicky resumed state). Neopustí
však kvaziparalelní systém! X nemusí vrátit řizení výpočtu té komponentě, která mu ho svěřila, nýbrž může ho předat libovolnému prvku Y téhož kvaziparalelního systému, a to také příkazem resume(Y). Takové prvky si mohou předávat řízení zcela libovolně, mohou generovat jiné další objekty, které jsou nejprve připojeny k jejich operačnímu řetězci a pak se mohou samy detašovat, vstoupit tak do kvaziparalelního systému a získat možnost být pomocí resume „aktivovány“ do pokračujícího stavu, dokonce i od toho prvku, který je generoval. Tak si objektové komponenty mohou předávat řízení a modelovat při monoprocesorovém způsobu programování, že jejich životy probíhají „skoro paralelně“ (odtud název kvaziparalelní = téměř paralelní, skoro paralelní).
Hlavní komponenta nemůže dostat jméno (není to objekt ale instance bloku), takže nemůže být ani vyzvána k činnosti procedurou resume. A tak Simula zavádí pravidlo, že když nějaká operativní komponenta má provést dle svých životních pravidel proceduru detach, vyzve hlavní komponentu, aby se ona stala operativní (takže detach mohou aplikovat nejen objekty v připojeném stavu, ale i v pokračujícím stavu.

Příklad:

begin class A; begin RB:-new B; …end;
class B; begin resume(RC); L: ... end;
class C; begin … detach; … end;
ref(A)RA; ref(B)RB; ref(C)RC;
RC:-new C; RA:-new A; ...
end;

Při vstupu do naznačeného bloku začne pracovat jeho hlavní komponenta. Ta je operativní komponentou a nejprve vytvoří (a připojí k sobě) objekt RC, ten se však detašuje, a vstoupí tedy do kvaziparalelního systému. Hlavní komponenta jej „ztratí“ a pokračuje dále. Vytvoří (a k sobě připojí) objekt RA. Ten vytvoří (a připojí) objekt RB, takže hlavní komponenta reprezentuje operační řetězec o třech členech: instance bloku, RA a RB. RB začne ovlivňovat výpočet dle svých životních pravidel a narazí při tom hned na resume(RC). Ani RB ani RA nejsou detašovány, tedy nejsou v kvaziparalelním systému a tím pádem ani operativními složkami, takže příkaz
je interpretován jako přenesení řízení výpočtu od dosud operativní komponenty, tedy hlavní komponenty, na prvek RC. Ten se tak stává operativní komponentou a hlavní komponenta se stává neoperativní. Je připravena se svými třemi členy ovlivňovat výpočet, až nějaká operativní komponenta provede příkaz detach; pak hlavní komponenta bude pokračovat, a to v místě za příkazem resume, který její činnost přerušil, tj. od návěsti L v životních pravidlech třídy B. Operativní je hlavní komponenta, RC je neoperativní. Po provedení přikazu resume(RC) se stane operativní RC, a když některá operativní objektová komponenta provede příkaz detach, stane se operativní komponentou hlavní komponenta.

Rozdíl od tradiční algoritmizace

Lze říci, že je dost velký rozdíl mezi tím, jak je program napsán a jak je podle něho výpočet prováděn. Při provádění výpočtu vznikají instance bloků (mezi nimiž jeden reprezentuje celý program), procedur a tříd. Kdyby Simula nepřipoustěla víc, než tradiční programovací jazyky, dalo by se říci, že při výpočtu jsou výše zmíněné instance jednosměrně pospojovány do řetězce pomocí vztahu připojení, a to tak, že na počátku řetězce je instance programu a na konci je instance, která právě ovlivňuje výpočet. Mimo tento řetězec by mohly být jen instance tříd, které přešly do koncového stavu, tj. které vyčerpaly svá životní pravidla.

Simula však povoluje instance detašovat, tj. odstranit je z výše uvedeného řetězce, a to tak, že taková instance provede příkaz detach. V tom okamžiku se instance a celý úsek řetězce instancí, které jsou k ní přímo či nepřímo připojeny, odpojí a zůstává mimo, jako tzv.operační řetězec. Daná instance se nazývá jeho záhlavím. Řetězec může být znovu připojen (i na jiné místo) příkazem call(…) nebo resume(…).

Diskrétní simulační modely jsou mimo jiné charakteristické vysokým stupněm paralelnosti výpočtu a velkými nároky na řízení programu.

Shrnuti

Když výpočet vstoupí do bloku (obyčejného nebo prefixovaného), vznikne instance β tohoto bloku a k ní kvaziparalelní systém. Ten se uplatní jen tehdy, jsou-li v β lokalní třídy (tj. jsou-li deklarovány v uvedeném bloku nebo v jeho prefixu). Do kvaziparalelního systému vstoupí ihned β a později do něho mohou vstupovat detašované instance tříd lokálních v β. Přesněji řečeno, v kvaziparalelním systému jsou objektové komponenty, jejichž záhlavími jsou detašované instance, a také hlavní komponenta, jejímž záhlavím je β. Ta je z počátku operativní komponentou. Charakteristické pro kvaziparalelní systém je to, že během jeho existence je vždy některá z jeho komponent operativní, čili že je v pokračovacím stavu. Taková komponenta řídí výpočet. Ze začátku je v tomto stavu hlavní komponenta. Předávat řízení výpočtu lze příkazem resume(X), kterým se přenese řízení výpočtu na hodnotu referenčního parametru X, nebo příkazem detach. Prvý způsob přichází v úvahu pro předání řízení objektové komponentě, druhý pro předání řízení hlavní komponentě.
Facebook Twitter Linkuj.cz

Komentáře

Zobrazit: standardní | od aktivních | poslední příspěvky | všechno
z IP *** | 4.5.2006 08:29
Odkaď jsi zas tohle stáhnul? Ty nejenže spamuješ napříč netem, ty si tu zasíráš i vlastní blog. :-) Tak to je maximální egoonanie. :-)
Mgr.Radovan Kaluža | 4.5.2006 12:43
toto je moje státnicová otázka, tuto jsem neměl dobře vypracovanou, tak jsem ji zpracoval a uveřejnil

tyto bezduché, nic neříkající příspěvky poté smažu, chcu zde mít jen věci k tématu

Eddan z IP *** | 31.5.2006 10:51
Radovanovi k úspěšným státnicím a vyjadřuji mu svůj obdiv, stejně jako všem ostatním, kteří se prokousali textem příspěvku až sem... :-)
P.S.: Radovane, souhlasím, urážlivé příspěvky, nebo ty, které nemají nic společného s tématem, by neměly ucpávat diskuzní vlákna...
z IP *** | 30.5.2006 14:10
uměl bys taky vysvětlit princip "škvíry ve stázi" ??
paya z IP *** | 7.6.2006 19:43
odkud jsi to ukrad? umis citovat zdroje?
HDP z IP 212.158.158.*** | 21.6.2008 15:57
Super clanek, stejne tak dalsi dva ohledne simuli, spousty veci jsem konecne poradne pochopil a ujasnil si. Je uplne jedno odkud to je, ale tehle popisu v cestine moc nenajdete!
Dik za tvuj cas smile


Nový komentář

Téma:
Jméno:
Notif. e-mail *:
Komentář:
[*1*] [*2*] [*3*] [*4*] [*5*] [*6*] [*7*] [*8*] [*9*] [*10*] [*11*] [*12*] [*13*] [*14*] [*15*] [*16*] [*17*] [*18*] [*19*] [*20*] [*21*] [*22*] [*23*] [*24*] [*25*] [*26*] [*27*] [*28*] [*29*] [*30*] [*31*] [*32*] [*33*] [*34*] [*35*] [*36*] [*37*] [*38*] [*39*] [*40*] [*41*] [*42*] [*43*] [*44*] [*45*] [*46*] [*47*] [*48*] [*49*] [*50*]   [b] [obr]
Odpovězte prosím číslicemi: Součet čísel sedm a dvě