Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Ez a dokumentum az egyidejűségi futtatókörnyezet és más technológiák funkciói és programozási modelljei közötti különbségeket ismerteti. Ha tisztában van azzal, hogy az egyidejűségi futtatókörnyezet előnyei hogyan viszonyulnak a többi programozási modell előnyeihez, kiválaszthatja azt a technológiát, amely a legjobban megfelel az alkalmazások követelményeinek.
Ha jelenleg egy másik programozási modellt használ, például a Windows-szálkészletet vagy az OpenMP-t, vannak olyan helyzetek, amikor célszerű lehet áttelepíteni az egyidejűségi futtatókörnyezetbe. Az OpenMP-ről az egyidejűségi futtatókörnyezetbe való migrálás témaköre például azt ismerteti, hogy mikor célszerű az OpenMP-ből az egyidejűségi futtatókörnyezetbe migrálni. Ha azonban elégedett az alkalmazás teljesítményével és az aktuális hibakeresési támogatással, nincs szükség migrálásra.
Az egyidejűségi futtatókörnyezet funkcióit és hatékonysági előnyeit kihasználva kiegészítheti egy másik egyidejűségi modellt használó meglévő alkalmazást. Az egyidejűségi futtatókörnyezet nem tudja garantálni a terheléselosztást, ha több feladatütemező versenyez ugyanazon számítási erőforrásokért. Ha azonban a számítási feladatok nem fedik egymást, ez a hatás minimális.
Szakaszok
A megelőző ütemezés és a kooperatív ütemezés összehasonlítása
Az egyidejűségi futtatókörnyezet és a Windows API összehasonlítása
Az egyidejűségi futtatókörnyezet és az OpenMP összehasonlítása
A megelőző ütemezés és a kooperatív ütemezés összehasonlítása
A megelőző modell és a kooperatív ütemezési modellek két gyakori módja annak, hogy több tevékenység is megossza a számítási erőforrásokat, például processzorokat vagy hardverszálakat.
Preemptív és kooperatív ütemezés
A megelőző ütemezés egy ciklikus időszeleteléses, prioritásalapú mechanizmus, amely minden tevékenység számára kizárólagos hozzáférést biztosít egy adott időszakban egy számítási erőforráshoz, majd átvált egy másik tevékenységre. A preemptív ütemezés gyakori a többfeladatos operációs rendszerekben, például a Windowsban. A kooperatív ütemezés egy olyan mechanizmus, amely minden tevékenység számára kizárólagos hozzáférést biztosít egy számítási erőforráshoz, amíg a tevékenység be nem fejeződik, vagy amíg a tevékenység hozzáférést nem ad az erőforráshoz. Az egyidejűségi futtatókörnyezet kooperatív ütemezést használ az operációs rendszer preemptív ütemezőjével együtt a feldolgozási erőforrások maximális kihasználtságának elérése érdekében.
A preemptive és a kooperatív ütemezők közötti különbségek
A preemptív ütemezők arra törekszenek, hogy több szál számára egyenlő hozzáférést biztosítsanak a számítási erőforrásokhoz, hogy minden szál előrehaladjon. A sok számítási erőforrással rendelkező számítógépeken a tisztességes hozzáférés biztosítása kevésbé lesz problémás; az erőforrások hatékony kihasználtságának biztosítása azonban problémásabbá válik.
A preemptive kernel módú ütemező megköveteli, hogy az alkalmazáskód az operációs rendszerre támaszkodjon az ütemezési döntések meghozatalához. Ezzel szemben a felhasználói módú kooperatív ütemező lehetővé teszi az alkalmazáskód számára, hogy saját ütemezési döntéseket hozzon. Mivel a kooperatív ütemezés számos ütemezési döntést tesz lehetővé az alkalmazás számára, csökkenti a kernel módú szinkronizálással járó többletterhelést. A kooperatív ütemezők általában akkor hárítják el az operációs rendszer kernelére vonatkozó ütemezési döntéseket, ha nincs más ütemezhető munkája. A kooperatív ütemező az operációs rendszer ütemezőjének is ellenáll, ha a rendszermaggal kommunikáló blokkoló műveletről van szó, de ezt a műveletet a rendszer nem közli a felhasználói módú ütemezővel.
Kooperatív ütemezés és hatékonyság
Egy preemptív ütemező esetében az azonos prioritási szinttel rendelkező összes munka egyenlő. A megelőző ütemezők általában a létrehozásuk sorrendjében ütemezik a szálakat. Ezenkívül, a preemptív ütemező minden szálnak időszeletet biztosít ciklikusan, a szál prioritása alapján. Bár ez a mechanizmus méltányosságot biztosít (minden szál előrehalad), némi hatékonysági költséggel jár. Sok számításigényes algoritmus például nem igényel méltányosságot. Ehelyett fontos, hogy a kapcsolódó tevékenységek a lehető legrövidebb összidő alatt fejeződjenek be. A kooperatív ütemezés lehetővé teszi, hogy az alkalmazás hatékonyabban ütemezze a munkát. Vegyük például azt az alkalmazást, amely több szálból áll. Az olyan szálak ütemezése, amelyek nem osztanak meg erőforrásokat az egyidejű futtatáshoz, csökkenthetik a szinkronizálási többletterhelést, és ezáltal növelhetik a hatékonyságot. A tevékenységek ütemezésének másik hatékony módja a tevékenységek folyamatainak futtatása (ahol minden tevékenység az előző kimenetén működik) ugyanazon a processzoron, hogy az egyes folyamatszakaszok bemenete már be legyen töltve a memória-gyorsítótárba.
Preemptive és kooperatív ütemezés együttes használata
A kooperatív ütemezés nem old meg minden ütemezési problémát. Például azok a tevékenységek, amelyek nem adnak viszonylagos hozamot más tevékenységeknek, felhasználhatják az összes rendelkezésre álló számítási erőforrást, és megakadályozhatják, hogy más tevékenységek haladjanak előre. Az egyidejűségi futtatókörnyezet a kooperatív ütemezés hatékonysági előnyeit használja a megelőző ütemezés méltányossági garanciáinak kiegészítésére. Alapértelmezés szerint a Concurrency Runtime egy együttműködési ütemezőt biztosít, amely munkalopási algoritmussal hatékonyan osztja el a munkát a számítási erőforrások között. Az egyidejűségi futtatókörnyezet ütemezője azonban az operációs rendszer preemptív ütemezőjére is támaszkodik az erőforrások alkalmazások közötti igazságos elosztásához. Egyéni ütemezőket és ütemezőházirendeket is létrehozhat az alkalmazásokban a szálvégrehajtás részletes szabályozásához.
[Felső]
Az egyidejűségi futtatókörnyezet és a Windows API összehasonlítása
A Microsoft Windows alkalmazásprogramozási felülete, amelyet általában Windows API-nak (korábban Win32-nek) neveznek, egy olyan programozási modellt biztosít, amely lehetővé teszi az alkalmazások egyidejűségét. Az egyidejűségi futtatókörnyezet a Windows API-ra épül, hogy olyan további programozási modelleket biztosítson, amelyek nem érhetők el az alapul szolgáló operációs rendszerből.
Az egyidejűségi futtatókörnyezet a Windows API szálmodellre épül a párhuzamos munka elvégzéséhez. Emellett a Windows API memóriakezelési és szálalapú tárolási mechanizmusait is használja. Windows 7 és Windows Server 2008 R2 rendszereken a Windows API-támogatást használja a felhasználó által futtatható szálakhoz és a 64-nél több hardverszállal rendelkező számítógépekhez. Az egyidejűségi futtatókörnyezet kibővíti a Windows API-modellt egy együttműködési feladatütemező és egy munkalopó algoritmus biztosításával a számítási erőforrások használatának maximalizálása érdekében, valamint több egyidejű ütemezőpéldány engedélyezésével.
Programozási nyelvek
A Windows API a C programozási nyelv használatával teszi elérhetővé a programozási modellt. Az Egyidejűség futtatókörnyezet egy C++ programozási felületet biztosít, amely kihasználja a C++ nyelv legújabb funkcióit. A lambda függvények például tömör, típusbiztos mechanizmust biztosítanak a párhuzamos munkafüggvények meghatározásához. Az egyidejűségi futtatókörnyezet által használt legújabb C++ funkciókkal kapcsolatos további információkért tekintse meg az Áttekintést.
Szálak és szálkészletek
A Windows API központi egyidejűségi mechanizmusa a szál. Általában a CreateThread függvénnyel hozhat létre szálakat. Bár a szálak viszonylag könnyen hozhatók létre és használhatók, az operációs rendszer jelentős időt és egyéb erőforrásokat foglal le a kezelésükre. Továbbá, bár minden szál garantáltan ugyanazt a végrehajtási időt kapja, mint bármely más szál ugyanazon prioritási szinten, a kapcsolódó többletterhelés megköveteli, hogy kellően nagy feladatokat hozzon létre. Kisebb vagy részletesebb feladatok esetén az egyidejűséghez kapcsolódó többletterhelés meghaladhatja a tevékenységek párhuzamos futtatásának előnyeit.
A szálcsoportok egy módját jelentik a szálkezelés költségeinek csökkentésére. Az egyéni szálkészletek és a Windows API által biztosított szálkészlet-implementáció egyaránt lehetővé teszi, hogy a kis munkaelemek hatékonyan fussanak párhuzamosan. A Windows szálkészlet a munkaelemeket egy első be, első ki (FIFO) sorban kezeli. Minden munkaelem abban a sorrendben indul el, amelyben hozzá lett adva a készlethez.
Az egyidejűségi futtatókörnyezet egy munkalopási algoritmust implementál a FIFO ütemezési mechanizmusának kibővítéséhez. Az algoritmus olyan szálakra helyezi át azokat a feladatokat, amelyek még nem kezdődtek el, amelyeknél elfogytak a munkaelemek. Bár a munkalopó algoritmus kiegyensúlyozza a számítási feladatokat, a munkaelemek átrendezéséhez is vezethet. Ez az átrendezési folyamat azt eredményezheti, hogy egy munkaelem a beküldöttnél eltérő sorrendben indul el. Ez rekurzív algoritmusok esetén hasznos, ahol nagyobb az esély arra, hogy az adatok megoszlottak az újabb feladatok között, mint a régebbiek között. Az új elemek első futtatása kevesebb gyorsítótárhibát és esetleg kevesebb oldalhibát jelent.
Az operációs rendszer szempontjából a munkalopás tisztességtelen. Ha azonban egy alkalmazás egy algoritmust vagy feladatot implementál, hogy párhuzamosan fusson, az altevékenységek közötti méltányosság nem mindig számít. Az számít, hogy milyen gyorsan fejeződik be a teljes tevékenység. Más algoritmusok esetében a FIFO a megfelelő ütemezési stratégia.
Viselkedés különböző operációs rendszereken
Windows XP és Windows Vista rendszeren az egyidejűségi futtatókörnyezetet használó alkalmazások hasonlóan viselkednek, kivéve, hogy a halomteljesítmény javul a Windows Vista rendszerben.
Windows 7 és Windows Server 2008 R2 rendszerben az operációs rendszer támogatja az egyidejűséget és a méretezhetőséget. Ezek az operációs rendszerek például olyan számítógépeket támogatnak, amelyek több mint 64 hardverszállal rendelkeznek. A Windows API-t használó meglévő alkalmazásokat módosítani kell, hogy kihasználhassák ezeket az új funkciókat. Az egyidejűségi futtatókörnyezetet használó alkalmazások azonban automatikusan használják ezeket a funkciókat, és nem igényelnek módosításokat.
alap.felhasználói módú ütemezés
[Felső]
Az egyidejűségi futtatókörnyezet és az OpenMP összehasonlítása
Az egyidejűségi futtatókörnyezet számos programozási modellt tesz lehetővé. Ezek a modellek átfedhetik vagy kiegészíthetik más kódtárak modelljeit. Ez a szakasz összehasonlítja az Egyidejűségi futtatókörnyezetet az OpenMP-hez.
Az OpenMP programozási modellt nyílt szabvány határozza meg, és jól definiált kötésekkel rendelkezik a Fortran és a C/C++ programozási nyelvekhez. Az OpenMP 2.0-s és 2.5-ös verziói jól alkalmazhatók az iteratív párhuzamos algoritmusokhoz; vagyis párhuzamos iterációt végeznek egy adattömbön. Az OpenMP akkor a leghatékonyabb, ha a párhuzamosság foka előre meghatározva van, és megfelel a rendszeren elérhető erőforrásoknak. Az OpenMP-modell különösen jó egyezés a nagy teljesítményű számítástechnikához, ahol nagyon nagy számítási problémák vannak elosztva egyetlen számítógép feldolgozási erőforrásai között. Ebben a forgatókönyvben a hardverkörnyezet ismert, és a fejlesztő ésszerűen számíthat arra, hogy kizárólagos hozzáféréssel rendelkezik a számítási erőforrásokhoz az algoritmus végrehajtásakor.
Más, kevésbé korlátozott számítási környezetek azonban nem feltétlenül egyeznek az OpenMP-hez. A rekurzív problémákat (például a gyorsválogatási algoritmust vagy az adatfában való keresést) például nehezebb implementálni az OpenMP használatával. Az egyidejűségi futtatókörnyezet kiegészíti az OpenMP képességeit a párhuzamos minták kódtára (PPL) és az aszinkron ügynökök kódtára biztosításával. Az OpenMP-sel ellentétben az Egyidejűségi futtatókörnyezet egy dinamikus ütemezőt biztosít, amely alkalmazkodik a rendelkezésre álló erőforrásokhoz, és a számítási feladatok változásakor módosítja a párhuzamosság mértékét.
Az egyidejűségi futtatókörnyezet számos funkciója bővíthető. A meglévő funkciók kombinálásával újakat is összeállíthat. Mivel az OpenMP fordítói irányelvekre támaszkodik, nem bővíthető könnyen.
További információ arról, hogy az Egyidejűségi futtatókörnyezet hogyan hasonlít az OpenMP-hez, és hogyan migrálhatja a meglévő OpenMP-kódot az egyidejűségi futtatókörnyezet használatára, lásd: Migrálás az OpenMP-ről az egyidejűségi futtatókörnyezetbe.
[Felső]
Lásd még
Párhuzamossági futtatókörnyezet
Áttekintés
Párhuzamos minták kódtára (PPL)
Aszinkron ügynökök könyvtára
OpenMP