Felhőkben használható programozási modellek

Befejeződött

A programozási modellek olyan elveket valósítanak meg, és olyan eszközöket kínálnak amelyet támogatják a fejlesztőket a nagy számítási rendszerek kiépítésében. Az elosztott programozási modell képes a szekvenciális algoritmusokat elosztott rendszereken végrehajtható elosztott programokra lefordítani. A modell kivitele határozza meg, hogy a programozók milyen egyszerűen adhatnak meg egy algoritmust elosztott programként. Az a modell számít egyszerűen használhatónak, amely absztrahálja az architektúra és a hardver részleteit, automatikusan párhuzamosítja és elosztja a számításokat, és átlátszó módon támogatja a hibatűrő képességet.

Egy modell hatékonysága azonban a hátterében álló technikák hatékonyságának függvénye. Az elosztott számítógéprendszeren futó elosztott programokkal szembeni egyik lényeges követelmény egy olyan kommunikációs mechanizmus, amely lehetővé teszi a tevékenység-összetevők több hálózati erőforrás közötti koordinálását. Ennek a követelménynek két hagyományos modell, az üzenetátadás és a megosztott memória tesz eleget, bár viszonylag egyszerű formában. Az elosztott programokkal kapcsolatos, a felhőkörnyezetekben jellemző problémák kezelése olyan kifinomultabb programozási modellekhez vezetett, amelyek elosztott elemzési motorként implementálva képesek automatikusan párhuzamosítani és elosztani a tevékenységeket, és hibatűrők.

Memóriamegosztási modell

Tasks running in parallel and sharing an address space.

4. ábra: Párhuzamosan futó és címtérrel rendelkező feladatok

A memóriamegosztási modell fő absztrakciója szerint egy alkalmazás elosztott memóriaterületén belül minden tevékenység minden helyhez hozzáfér. A tevékenység tehát úgy kommunikálnak, hogy az elosztott memóriaterület adott helyeit olvassák és írják ugyanúgy, mint egyetlen folyamat szálai, amelyek mind osztoznak a folyamat címterén (4. ábra). A megosztott memóriával a tevékenységek implicit módon cserélnek adatokat, nem explicit üzenetek küldésével és fogadásával, hanem megosztással. A memóriamegosztási modell ebből adódóan olyan a szinkronizációs mechanizmusokat támogat, amelyekkel az elosztott programoknak kell szabályozniuk a különböző tevékenységek által végzett olvasási/írási műveletek sorrendjét. Ez azt jelenti, hogy egy megosztott adathelyre nem írhat egyidejűleg több tevékenység, mert ez adatok sérülését vagy inkonzisztenciáját okozná. Ez a cél általában szemaforok, zárolások és/vagy határok használatával érhető el. A szemafor egy két pont közötti szinkronizálási mechanizmus, amely két párhuzamos/elosztott tevékenységet érint. A szemaforok által használt két művelet a közzététel és a várakozás. A közzététel művelet olyan, mint egy token letétbe helyezése, amely azt jelzi, hogy adat lett előállítva. A várakozás művelet tiltást jelent mindaddig, amíg a közzététel művelet nem jelzi, hogy folytatható az adatok felhasználása. A zárolások a kritikus szakaszokat védik, azokat a területeket, amelyeket egyszerre csak egy tevékenység érhet el (általában írhat). A zárolások két művelete a zárolás és a feloldás, amelyek egy kritikus szakaszhoz tartozó zárolást érvényesítenek illetve oldanak fel. Zárolást egyszerre csak egy tevékenység tarthat fenn, más tevékenységek nem érvényesíthetik, amíg nincs feloldva. Végezetül, a határ egy olyan pontot definiál, amelynél a tevékenységek nem haladhatnak tovább, amíg az összes többi tevékenység is el nem éri ezt a pontot. A szemaforok, zárolások és határok hatékonysága döntő fontosságú és nehezen elérhető cél a megosztott memória programozási modelljét használó elosztott/párhuzamos programok fejlesztése során.

Az 5. ábra egy példát mutat be egy egyszerű szekvenciális program elosztottá alakítására a memóriamegosztási programozási modell használatával. A szekvenciális program két tömb, b és c elemeit adja össze az eredményeket pedig az a tömbben tárolja. Ez után az a tömb összes olyan elemét, amely nagyobb, mint 0, hozzáadja a végösszeghez. Az ennek megfelelő elosztott változat csak két tevékenységet használ, amelyek között egyenlően osztja fel a munkát. Mindegyik tevékenységhez megad egy kezdő (start) és befejező (end) változót a (megosztott) tömbök helyes indexeléséhez, az adatok kiolvasásához és a megadott algoritmus végrehajtásához. A végösszeg (sum) természetesen kritikus szakasz, amelyet zárolás véd. További feltétel, hogy egyik tevékenység sem írhatja ki a végösszeget, amíg a többi tevékenység nem végzett, ezért van beszúrva egy határ (barrier) az eredményt kiíró utasítás elé. A programból kiolvasható hogy a két tevékenység közötti kommunikáció implicit módon (megosztott tömbök és változók olvasásával és írásával) zajlik, a szinkronizáció pedig explicit módon (zárolással és határokkal) valósul meg. Végezetül, a mögöttes elosztott rendszernek a korábban leírtak szerint biztosítania kell az adatmegosztási funkciót. Az infrastruktúrának azt a látszatot kell keltenie, hogy a rendszer összes számítógépének memóriája egyetlen megosztott teret alkot, amelyet bármelyik tevékenység megcímezhet. Az egy (LAN kapcsolatban álló) számítógépfürtön ilyen mögöttes megosztott (virtuális) címteret kínáló rendszer gyakran használt példája az úgynevezett DSM.1, 2 Egy DSM-eken és más elosztott megosztott rendszereken használható elterjedt programozási nyelv az OpenMP.3

Sequential (a) and shared-memory (b) versions.

5. ábra: Szekvenciális (a) és megosztott memória (b) verziók

Üzenetátadási programozási modell

Az üzenetátadási programozási modellben az elosztott tevékenységek üzenetek küldésével és fogadásával kommunikálnak. Itt az elosztott tevékenységek nem osztoznak közös címtéren, amelyben hozzáférhetnek egymás adataihoz (lásd: 6. ábra). A fő absztrakció a folyamatokhoz hasonló, amelyek a szálakkal ellentétben privát memóriaterületeket tartanak fenn. Az adatok explicit üzenetekben történő küldésével és fogadásával ez a modell kommunikációs többletmunkával jár (például a hálózati késés és az esetenként tömeges adatátvitel miatt). Ezt a többletmunkát az egyensúlyozza ki, hogy az explicit üzenetváltások implicit módon szinkronizálják a kommunikáló tevékenységek műveleteinek sorrendjét. A 7. ábra bemutat egy példát, amely az 5.(a) ábrán látható szekvenciális programot alakítja át egy üzenetátadást használó elosztott verzióra. Kezdetben csak az id = 0 azonosítójú fő tevékenység fér hozzá a b és a c tömbhöz. Feltéve, hogy csak két tevékenység van, a fő tevékenység először (egy explicit küldési művelettel) átküldi a tömbök részeit a másiknak, hogy egyenlően felossza a munkát a két tevékenység között. A második tevékenység (egy explicit fogadási művelettel) fogadja a szükséges adatokat, majd helyi összegzést hajt végre. Amikor a helyi összeg elkészül, a második tevékenység visszaküldi ezt az összeget a fő tevékenységnek. A fő tevékenység szintén elvégzi a rá jutó adatok összegzését, és begyűjti a másik tevékenységtől helyi összegét, mielőtt kiszámítaná és kiírná a végösszeget. Mint látható, minden küldési műveletnek megfelel egy fogadási művelet, és explicit szinkronizálásra nincs szükség. Végezetül, az üzenetátadási programozási modellben nincs szükség a mögöttes elosztott rendszer általi támogatásra. Ez itt azt jelenti, hogy kapcsolatban álló tevékenységeknek nincs szükségük az egyetlen megosztott címtér illúziójára. Az üzenetátadási programozási modell közkedvelt példáját kínálja az üzenetátadási interfész (Message Passing Interface, MPI).4 Az MPI az iparági szabványnak megfelelő üzenetátadási kódtár (pontosabban egy kódtár képességeinek specifikációja) üzenetátadó programok írásához. Az MPI egy népszerű, nagy teljesítményű és jól hordozható implementációja az MPICH.5

Tasks running in parallel using the message-passing programming model, whereby the interactions happen only via sending and receiving messages over the network.

6. ábra: Az üzenetátadási programozási modell használatával párhuzamosan futó feladatok, amelyekkel az interakciók csak a hálózaton keresztüli üzenetek küldésével és fogadásával történnek

A lenti táblázat az elosztott memória és az üzenetátadás programozási modelljét hasonlítja össze öt szempont alapján: a fejlesztéssel járó munka, a hangolással járó munka, kommunikáció, szinkronizálás és hardveres támogatás.

A megosztott memória programok kezdeti fejlesztése egyszerűbb, mert a programozóknak nem kell az adatok elosztásával vagy kommunikálásával foglalkozniuk. Emellett egy megosztott memória program kódszerkezete gyakran nagyon hasonló a szekvenciális megfelelőjééhez. A programozók általában csak a párhuzamos/elosztott tevékenységek, a változó-hatókörök és a szinkronizálási pontok megadásához illesztenek be további direktívákat. Ezzel szemben az üzenetátadó programok a másféle programozói gondolkodásmódot kívánnak, amely eleve figyelembe veszi az adatok tevékenységek közötti felosztását, az adatok összegyűjtését és kommunikálását, valamint az eredmények explicit üzenetek általi összesítését.

Az adatok elosztása és tárolási helye az adatok és erőforrások mennyiségének növekedésével egyre nagyobb mértékben befolyásolja a teljesítményt. Az olyan nagyméretű elosztott rendszerek, mint a felhő például nem egyenletes elérési késésekkel járnak (amennyiben a távoli adatok elérése több időt vesz igénybe, mint a helyi adatoké), ezért a programozóknak érdemes az adatokat az azokat használó tevékenységek közelében tartaniuk. Az üzenetátadó programok készítőinek előre meg kell tervezniük az adatok tevékenységek közötti elosztását, a megosztott memóriát használó programok írói viszont (többnyire) a fejlesztés után, jellemzően az adatmigrálás és -replikálás során oldják meg ezt problémát. Ezzel az utólagos módosítással a finomhangolás sokkal munkaigényesebb lehet, mint az üzenetátadási megoldás.

Nagyméretű rendszerekben a szinkronizációs pontok a teljesítmény szűk keresztmetszeteivé válhatnak: a kritikus szakaszokhoz való hozzáférést megkísérlő felhasználók számával együtt az ezzel járó késések és várakozási idők is növekednek. Egy későbbi modul még visszatér a szinkronizálás és a felhőalapú programozással járó más kihívások kérdésére.

A distributed program that corresponds to the sequential program in Figure 5 (a) and is coded using the message-passing programming model.

7. ábra: Az 5. ábrán szereplő szekvenciális programnak megfelelő elosztott program, amely az üzenetátadási programozási modell használatával kódolt

Szempont Memóriamegosztási modell Üzenetátadási modell
Kommunikáció Implicit Explicit
Szinkronizálás Explicit Implicit
Hardveres támogatás Általában szükséges Nem kötelező
Kezdeti fejlesztési munkaigény Lower Magasabb
Finomhangolási munkaigény felskálázáskor Magasabb Lower


Hivatkozások

  1. A. S. Tanenbaum (1994. szeptember 4.). Distributed Operating Systems Prentice Hall, First Edition
  2. K. Li (1986). Megosztott virtuális memória lazán összekapcsolt többprocesszoros Yale University, New Haven, CT (USA)
  3. OpenMP
  4. Message Passing Interface
  5. MPICH

Tesztelje tudását

1.

Egy tömörített ZIP-fájlok jelszavát visszafejtő program az egész jelszó-kulcstérre kiterjedő jelszótalálgatással működik. A programnak van párhuzamos üzemmódja, amely egyetlen számítógépen használható, de többmagos processzort igényel. Feltehetően milyen párhuzamosítási technikát használ ez a program?

2.

Egy fejlettebb jelszófejtő program lehetővé teszi, hogy a felhasználó több számítógépből álló számítási fürtöt hozzon létre a találgatásos keresés további felgyorsítására. A fürt számítógépeinek valamilyen hálózattal összeköttetésben kell állniuk, be nem alkalmaznak semmilyen elosztott megosztott memóriát (DSM). Feltehetően milyen párhuzamosítási technikát használ ez a program?

3.

Mi az üzenetátadási és a memóriamegosztási modell közötti fő különbség?