Párhuzamos programozást támogató nyelvi eszközök összehasonlítása: Grafikus segédeszközök párhuzamos programok készítéséhez
3.
Grafikus segédeszközök párhuzamos programok
készítéséhez
Objektum orientált programok tervezésének kezdõ
fázisától kezdve, a munka osztott környezetben
történõ szétosztásán keresztül a
program futás közbeni elemzéséig lehet
használni grafikus támogatást a munka
egyszerûbbé tételére.
Ebben a fejezetben az objektum-orientált, párhuzamosságot
támogató tervezési, tesztelési rendszer
követelményeinek lefektetésével egy ilyen
eszközrõl lesz szó.
3.1
Háttér
3.1.1
Tervezési módszer
Objektum orientált tervezési módszerben alapvetõen
objektumok, illetve absztrakt adattípusok
kialakításával hozható létre az
alkalmazás. Ennek a lépései:
Ezek a lépések párhuzamos környezetben a következõkkel egészülhetnek ki:
Objektum orientált és párhuzamosságot támogató elterjedt nyelvekbõl nincs sok. Mivel ez egy viszonylag új terület, ezért nagyon sok eszköz állhat egy programozó rendelkezésére, de ezek legtöbbje egy egyedi megoldás, valamilyen speciális probléma támogatására szolgál.
Az Ada 95 szabvány által meghatározott Ada nyelv egy megoldás lehet. Ennek elõnye, hogy megtervezték, és a két problémakört majdnem teljesen lefedi megoldásaival. A GNU project-ben készülõ GNAT fordító a nyelv legnagyobb részét implementálta, de a valódi több-processzoros rendszerek egyedi igényei miatt csak egy processzorra képes kódot készíteni.
A High Performance C++ nyelv egy C++ kiterjesztés, mely sok érdekes elemet tartalmaz a párhuzamosság támogatására. Ez még csak egy napjainkban fejlõdõ szabvány, de a hozzá készült minta-fordító már most is több platformon mûködik.
Ha csak az objektum orientáltságot kötjük ki, akkor a nyelvek választéka sokkal nagyobb. Ezekhez a nyelvekhez azonban illeszteni kell valamilyen párhuzamosságot támogató eszközt is.
Nyelvek közül a C++ és az Eiffel emelhetõ ki. Elõbbi az elterjedtsége, utóbbi a példa értékû objektum orientált megoldásai miatt.
Párhuzamosságot támogató eszközök közül is elterjedt megoldásokat érdemes választani, hogy az elkészített program hordozható legyen. Ilyen lehet a sok számítógépgyártó által támogatott PVM könyvtár, vagy az egyre inkább elterjedõ MPI szabvány.
3.1.3
Vizsgáló eszközök
Két alapvetõ eszköz használható programok
vizsgálatára:
Ennek a résznek a bevonása az eszközbe valószínûleg nem túl gazdaságos - vannak jobb és szebb szövegszerkesztõk és rajzolók -, de a késõbbi dokumentálások érdekében mégis érdemes lehet.
A program készítése során, illetve a végsõ dokumentáció összeállításakor kényelmes lehet a konkrét programrészekhez kapcsolni a mellékesen elkészített dokumentációkat. Ennek legjobb módja az lehet, hogy minden lépésnél, illetve programrészletnél valamilyen megjegyzést lehet írni, melybe más dokumentumokat is be lehet kapcsolni.
Ha a feladat leírása már megvan akkor ki lehet jelölni az alapvetõ fizikai és logikai objektumokat.

Az objektumokat objektum osztályokká alakítva kialakítható a statikus modell váza is.
Az osztályokkal kapcsolatban a következõ jellemzõket kell megadni:

Ábra 19. Statikus osztálykapcsolatok
Ezek létezõ objektum osztályok között adhatóak meg.

Ábra 20. Öröklõdési kapcsolatok
Érdekes lehetõsége lehetne az eszköznek, ha forráskódban definiált osztályokhoz is képes lenne grafikus ábrázolás generálására. Ezzel a módszerrel forráskódban meglévõ algoritmusok elemzése, esetleg párhuzamosítása is megkönnyíthetõ lenne.
A mûveletek meghatározásakor szekvenciális programoknál általában csak azok szintaxisát definiálják. Párhuzamos esetben ez nem mindig elég, a mûveletek szinkronizációját is meg kell határozni.
Legegyszerûbb esetben a programozó egyes mûveleteket kijelölve megadhatja, hogy azok csak egymást kölcsönösen kizárva futhatnak le (pl.: CC++ nyelv atomic kulcsszava).
Ez az egyszerû módszer persze sokszor nem elégséges, ezért ki kell terjeszteni valamilyen szinkronizáció specifikáló formalizmussal, melyekhez bonyolultságuk miatt nehéz bármilyen grafikus segédeszközt biztosítani.
Meg lehetne vizsgálni útkifejezésekkel, vagy õrfeltételekkel adott szinkronizációs specifikációk erõsségét, és használhatóságát is. Ebben a környezetben az öröklõdés és a szinkronizáció kezelése külön problémát jelentene, melynek megoldása nagy jelentõségû lépés lehet.
A statikus modell tervezése szekvenciális programok készítésénél is nagy segítség lehet.
A statikus modellben meghatározott osztályokból létre lehet hozni objektumokat, melyek között kommunikációs kapcsolatokat lehet meghatározni.
Az objektumok önmagukban a következõ osztályokba sorolhatóak:
Ettõl a besorolástól függetlenül minden objektumról el lehet dönteni, hogy aktív, vagy passzív-e. Ez a besorolás az objektum elhelyezésére (passzív objektum akár lemezre is kerülhet ) is hatással lehet.
Aktív objektumok kijelölésekor, azok még egy mûvelettel, az objektum önállóan elvégzett munkájának leírásával bõvülhetnek (pl. run mûvelet, amit majd a rendszer hív meg amikor az objektum létrejön).
Objektumok közötti kommunikációs kapcsolatok leírására a statikus modellben használt kapcsolatokhoz hasonló megadási módszerek is elképzelhetõek, pl.:

Ábra 21. Objektumok dinamikus kapcsolata
A dinamikus kapcsolatok megadása az objektumok elhelyezését is befolyásolhatja (pl. nem kommunikáló objektumok más-más processzorokra kerülhetnek).
Kódgenerálás szempontjából is fontos lehet a dinamikus kapcsolatok megadása, hiszen a kommunikációban résztvevõ feleket egymás számára láthatóvá kell tenni (statikusan a forráskódban, illetve dinamikusan a futó programban kell lennie valamilyen mutatónak a másik félre).
3.2.2
Párhuzamosítás
A fenti programmodellt valamilyen módon le kell képezni az adott
párhuzamos architektúrára, vagy
számítógép-hálózatra. Ez a
leképezés két lépésben történhet
meg.
Különálló virtuális processzorokon lévõ objektumok akár különálló processzorokra, illetve memóriákba is kerülhetnek (persze ez nem kötelezõ).

Ábra 22. Virtuális processzorok
Az objektumok csoportosítása történhet a felhasználó által fixen rögzített módon, vagy sémák alapján is.
Ha a programozó meg tudja határozni, hogy pontosan mennyi objektum van a rendszerben, akkor ezekhez el lehet készíteni a megfelelõ számú virtuális processzort, és a megfelelõ statikus hozzárendeléseket (folytonos vonal).
Ha az hozzárendelések nem ilyen fixek - elõre meg nem adható számú objektum van -, akkor az osztályokat is virtuális processzorokhoz lehet rendelni, mely hozzárendelés így egy sémát fog meghatározni a futás közben létrejövõ objektumok, illetve virtuális processzorok hozzárendelésére. Egy virtuális processzorhoz persze több osztály is csatolható, mely esetben a futtató rendszer feladata, hogy ezek az objektumok egy virtuális processzorhoz kapcsolódjanak.
Ha az objektumok száma nagyon nagy - például egy fizikai szimuláció részecskéinek objektumairól van szó -, akkor a fenti két módszer nem lehet elégséges. Ilyen esetekben az objektumokat valamilyen minta szerint kell elosztani a virtuális processzorok között:

Ábra 23. Elosztási minták
A minták akkor kerülnek felhasználásra, amikor a nagy számú objektumot el kell osztani a virtuális, illetve késõbb a valódi processzorok között. A szétosztás statikus, azaz az objektumok vándorlását a processzorok leterheltségétõl függõen nem támogatja.

Ábra 24. 2 dimenziós hálóban processzorok
A fizikai processzorok leírásánál a processzorok számán kívül a köztük lévõ kommunikációs kapcsolatokat is definiálni kell. Lényegében tetszõleges processzorokat tartalmazó gráf megadható, de az egyszerûbb használhatóság érdekében az eszköz tartalmazhat elõre definiált modelleket is (pl. 2D háló, 3D háló, hiperkocka stb.).
Legegyszerûbb esetben a fent definiált virtuális processzorokat sorban ki kell osztani a fizikai processzorok között, és amikor azok elfogynak, akkor az elosztást újra az elsõ processzornál lehet folytatni.
A rendszer viszont a program felépítésének mély ismerete miatt hatékonyabb elosztásra is képes lehet. Az osztályok közötti statikus, az objektumok közötti dinamikus kapcsolatok, valamint a virtuális processzorokon lévõ objektumok ismerete alapján a virtuális processzorok úgy is eloszthatóak a fizikai rendszeren, hogy a közöttük folyó kommunikáció minél kevesebb fizikai processzorok közötti kommunikációhoz vezessen. Ez az elosztási módszer persze sokkal bonyolultabb, de a programról közölt nagy számú információ erre is lehetõséget adhat.
3.3
Vizsgálatok
Ha a program a tervezési fázisokon túljutott, akkor az
egyes mûveletekhez tartozó kódrészletek
kitöltése, illetve a szinkronizációs
specifikációk kifejtése után már
megfelelõ forráskód, illetve a
kódgeneráláshoz és futtatásához
szükséges konfigurációs file-ok
elkészítése is rábízható a
rendszerre.
Ha mindez elkészül, akkor a program lefordítható
és futtatható. A futás során jelentkezõ
gondok orvoslására, illetve a futás
javítására szolgálhatnak a következõ
eszközök:
3.3.1
Nyomkövetés
Hibák felfedezésére szolgálhat a
nyomkövetés, melynek során a mûködõ
program futását próbáljuk valamilyen
absztrakciós szinten megfigyelni.
Ha mélyebben bele lehet nyúlni a rendszerbe, akkor elképzelhetõ ezen nyomkövetõ programok összehangolása, esetleg egyetlen több szálat követni képes programba integrálása, mellyel a folyamatok idõben összehangolt (egyik se "szaladjon el" a másikhoz képest) vizsgálata is lehetséges.
A programkód követésének csúcsa az lehet, ha a statikus vagy dinamikus modell grafikus ábrázolásában is szemléltetni tudja a nyomkövetõ program az éppen végrehajtott program állapotát (pl. egy osztály adott mûveletének megfigyelésekor kiderülne, hogy az a mûvelet valójában melyik osztályhoz tartozik, vagy a dinamikus ábrában az attribútumok nevei mellett az aktuális értékük is szerepelne).
A program pillanatnyi állapotának ábrázolása a virtuális processzorok, vagy a dinamikus modell grafikus ábrázolásában. Ezeken a helyeken meg lehetne jelölni az éppen aktív objektumokat/processszorokat, valamint az aktív kapcsolatokat. A kapcsolatokról külön kérésre le lehet kérdezni azok tartalmát, az átvitt adatok formáját, értékét:

Ábra 25. Pillanatnyi kommunikációk
A kommunikációk egymáshoz viszonyított vizsgálatát segítheti, ha azokat idõhöz kötve egy diagrammon is lehet ábrázolni:

Ábra 26. Kommunikációk az idõ függvényében
Ilyen ábrázolások virtuális processzorokra, illetve objektumokra lebontva is hasznosak lehetnek.
3.3.2
Részletek tesztelése
Nagy programok fejlesztésénél hasznos lehet, ha a
nyomkövetés mellett, vagy attól függetlenül egy
mûködõ programban egyes részeket a
programfejlesztõ külön-külön is tesztelni tud.
Ennek megoldására valamilyen formában az egyes objektumok
mûveleteit interaktívan is meg kell tudni hívni,
akár valamilyen távoli elérés
módszerével is.
3.3.3
Hatékonyság vizsgálata
Szimulációs alkalmazásánál, illetve
matematikai algoritmusoknál fontos a program hatékonysága,
ennek vizsgálatára egy részt lehetõséget
adnak az interaktív nyomkövetõ módszerek, de ezek
nyilván befolyásolják magát a futási
eredményt is. Ennek a problémának az
elkerülésére minden egyes folyamat
külön-külön eltárolhatja futásának
részleteit, melyet a program végén kiírnak egy
közös adatterületre.
Ezt a módszer postmortem profiling-nak nevezik a program lefutása utáni vizsgálatok miatt.
A grafikus rendszer itt is abban segíthet, hogy az egyszerûbb rendszerek - egy-egy folyamatra vonatkozó eredményeket - eredményeit összesíti, és a statikus modell ábráiba illesztve megjeleníti. A legtöbb idõt elhasználó mûveleteket, illetve osztályokat ki is emelheti - pl. piros színnel befestve -, hogy a fejlesztõ figyelmét felhívja a szûk keresztmetszetekre.
Ilyen esetek vizsgálatát segítheti az idõ függvényében megjelenített aktív és passzív szakaszok ábrája is (ez virtuális és fizikai processzorokra is vonatkozhat):

Ábra 27. Processzorok aktivitása
Pillanatnyi leterheltséget százalékos arányban is lehet ábrázolni egy-egy processzorra vonatkozóan, ha azon egyszerre több folyamat is futhat (több virtuális processzor van hozzá rendelve, vagy több aktív objektumot tartalmaz).
3.4
Az eszköz lehetõségei
Ebben a fejezetben vázolt grafikus eszköz alapvetõ elemei
sok kisebb programban megtalálhatóak, viszont erre a
területre tudomásom szerint még nem készült
elérhetõ fejlesztõ eszköz. Ennek az elõnye a
különbözõ fejlesztési területek
integrálása, és az ebbõl származó
többletinformációkból a fejlesztési munka
megkönnyítése, segítése lenne.
Ez a tervezõrendszer egyes esetekben a végsõ program optimalizálását nagyban segíthetné, hiszen az objektum orientált tervezés támogatása miatt a program belsõ felépítésével, illetve adatfolyamával is tisztában lehet.
|
|
|
|