V 1.0 OE-NIK HP 1 Haladó Programozás Folyamatok Szálkezelés: Parallel.For
V 1.0 OE-NIK HP 2 Haladó Programozás Folyamatok Parallel.For
V 1.0 A párhuzamos végrehajtás alapjai A Neumann-architektúrára épülő számítógépek a programokat sorosan hajtják végre A gépi kódú programok tényleges futtatása utasításról utasításra történik. Ahhoz, hogy egy számítógépen egyszerre több program is futtatható legyen, olyan megoldásra van szükség, amely biztosítja –a végrehajtás alatt álló programok egymástól való elszigetelését, valamint –a végrehajtás alatt álló programok (látszólag) egyidejű futását. A programok elszigetelése és párhuzamosítása a folyamatok koncepciójának segítségével megoldható Az elszigetelés érdekében minden folyamat saját memóriaterülettel rendelkezik, amelyet más folyamatok nem érhetnek el, így hiba esetén csak a hibázó folyamat sérül, a rendszer többi eleme működőképes marad (viszont a folyamatok közötti közvetlen kommunikációra sincs egyszerű lehetőség). A párhuzamosítás tipikus megoldása az időosztás, amikor minden folyamat kap egy-egy ún. időszeletet, melynek leteltét követően egy másik folyamat kapja meg a vezérlést. Ez a megoldás gyakoratilag függetleníti egymástól a processzorok és a rajtuk egyidőben futtatható programok számát. 3 OE-NIK HP
V 1.0 Illusztráció: az időosztás elve P 1 folyamat Futó állapot Futó állapot Futásra kész vagy várakozó állapot Állapotmentés (PCB 2 ) Állapotbetöltés (PCB 1 ) Állapotmentés (PCB 1 ) Állapotbetöltés (PCB 2 ) Megszakítás vagy rendszerhívás Futó állapot Futásra kész vagy várakozó állapot Futásra kész vagy várakozó állapot P 2 folyamat Megszakítás vagy rendszerhívás Original image © David A. Solomon and Mark Russinovich 4 OE-NIK HP
V 1.0 Folyamatok és szálak A szálak elsődleges célja a folyamatokon belüli párhuzamosítás A folyamatok adminisztrációja és váltása igen erőforrásigényes művelet, viszont az általuk nyújtott elszigetelés szintje egy programon belül csaknem mindig szükségtelen. Ezt az ellentmondást oldják fel a szálak, amelyek elszigetelést nem nyújtanak, gyors párhuzamos végrehajtást azonban igen. A.NET keretrendszer támogatja a szálak kezelését is A keretrendszer kihasználja az operációs rendszer száltámogatását, de a.NET szálak és az operációs rendszer szálai között nem feltétlenül létezik 1:1 megfeleltetés (egy valódi szálon a keretrendszer több szála is futhat). P 1 folyamat P 2 folyamat P 3 folyamat T 11 szál T 12 szál T 13 szál T 21 szál T 22 szál T 23 szál T 24 szál T 31 szál 5 OE-NIK HP
V 1.0 Folyamatok A.NET keretrendszerben a folyamatok megfelelnek az operációs rendszer folyamatainak A folyamatok kezelését a System.Diagnostics.Process és a System.Diagnostics.ProcessStartInfo osztályok biztosítják. A Process osztály segítségével új folyamatok hozhatók létre, létező folyamatok szüntethetők meg és a folyamatokról részletes adatok érhetők el. A ProcessStartInfo osztály segítségével számos paraméter és beállítás adható meg a folyamatként elindítani kívánt programokhoz. A.NET a folyamatokon belül egy további szintet, az ún. alkalmazástartományt („application domain”) is meghatároz A felügyelt kódú programokat a keretrendszer futtatás közben is ellenőrzi, ezért ezek nem képesek egymást negatívan befolyásolni. Így viszont nem feltétlenül szükséges külön folyamatként futtatni őket, ami sebesség és memóriaigény szempontjából nagy előny, mivel a folyamatok létrehozása, nyilvántartása és a közöttük történő váltás sok időt és memóriát igényel. Az alkalmazástartományokkal és programozásukkal a jelen tárgy keretében nem foglalkozunk részletesen. 6 OE-NIK HP
V 1.0 Folyamatok kezelése (kivonatos referencia) System.Diagnostics.Process osztály Metódusok Start()Folyamat indítása CloseMainWindow()Folyamat főablakának bezárása (GUI alkalmazásoknál) Kill()Folyamat leállítása GetCurrentProcess()Aktuális folyamatot reprezentáló objektum lekérése GetProcesses()Összes folyamat adatainak lekérése a helyi számítógépről WaitForExit()Várakozás az adott folyamat befejeződésére Tulajdonságok StartInfoA folyamathoz tartozó ProcessStartInfo példány PriorityClassA folyamat prioritása (fontossági szintje) EnableRaisingEventsA folyamat kiválthat-e eseményeket HasExitedA folyamat kilépett-e ExitCode, ExitTimeKilépési kód, illetve a kilépés (vagy leállítás) időpontja StandardInput, StandardOutput Alapértelmezett be- és kimeneti csatorna (adatfolyam) Események ExitedA folyamat kilépett (vagy leállították) 7 OE-NIK HP
V 1.0 Folyamatok kezelése (kivonatos referencia) System.Diagnostics.ProcessStartInfo osztály Tulajdonságok FileName Fájlnév megadása az indítandó folyamathoz (program vagy programmal társított fájltípusba tartozó fájl neve) Arguments, WorkingDirectory Parancssori paraméterek és munkakönyvtár megadása az indítandó folyamathoz Domain, UserName, Password Folyamat indítása adott felhasználó nevében RedirectStandardInput, RedirectStandardOutput Alapértelmezett be- és kimeneti csatorna átirányítása ErrorDialogHibaüzenet jelenjen-e meg, ha a folyamat indítása sikertelen UseShellExecute Operációs rendszerhéj programindító funkciójának használata folyamat indításához VerbA társított fájl megnyitásakor végrehajtandó művelet WindowStyle Kezdeti ablakméret megadása (normál, minimalizált vagy maximalizált méret) 8 OE-NIK HP
V 1.0 Példa új folyamat indítására using System; using System.Diagnostics; class Program { static void Main() { Process newProcess = new Process(); newProcess.StartInfo = new ProcessStartInfo("hello.exe", "Pistike"); newProcess.StartInfo.ErrorDialog = true; newProcess.StartInfo.UseShellExecute = false; newProcess.StartInfo.RedirectStandardOutput = true; newProcess.Start(); newProcess.WaitForExit(); Console.WriteLine("Az elindított folyamat üzenetei:"); Console.Write(newProcess.StandardOutput.ReadToEnd()); Console.ReadLine(); } OE-NIK HP
V 1.0 Feladat Készítsünk konzolos alkalmazást, amely (a számítógépre telepített.NET keretrendszer segítségével) képes a parancssorban megadott C# nyelvű forrásfájl lefordítására és az esetleges hibák megjelenítésére! Amennyiben a forráskód hibátlan volt, ezt a program külön üzenetben jelezze! Ötletek: –A.NET keretrendszer része a parancssoros C# fordító (csc.exe) –A program számára parancssorban megadott adatok kezeléséhez a Main() metódus „args” paraméterét használhatjuk fel, amely karaktersorozatok tömbjeként tartalmazza az átadott adatokat –Ha a forráskód fordítása sikeres, maga a C# fordító egy néhány soros fejlécen kívül semmilyen üzenetet nem ír ki. A fejléc megjelenítése a „/nologo” parancssori paraméterrel kapcsolható ki. 10 OE-NIK HP
V 1.0 Feladat Készítsük el az előző feladat bővített megfelelőjét grafikus Windows alkalmazásként is (az elkészült program adjon lehetőséget a forráskód szerkesztésére, betöltésére, mentésére, fordítására és futtatására)! Ötletek: –A program a forráskódot fordítás előtt mentse el egy ideiglenes fájlba –A futtatáshoz használjuk a Process osztály statikus Start() metódusát 11 OE-NIK HP
V 1.0 Megoldás 12 OE-NIK HP
V 1.0 OE-NIK HP 13 Haladó Programozás Folyamatok Parallel.For
V 1.0 Parallel System.Threading.Tasks névtér Előny: nem kell kézzel párhuzamosítanom, CPU darabszámra optimalizálni A párhuzamosítást (konkrét szálakra bontást, optimalizációt) a keretrendszer végzi for, foreach alkalmas rá, a while nem Szintaxis: Parallel.For(Min, Max, Action ) Min: az intervallum zárt alsó határa Max: az intervallum felső nyitott határa Action : olyan lambda kifejezés, amelynek bemeneti paramétere int, kimeneti típusa pedig void OE-NIK HP 14
V 1.0 Parallel.For feladat A és B barátságos számok, ha osztóösszegük kölcsönösen egyenlő a másik számmal Vagyis: „A” osztóösszege (önmagát kihagyva) B „B” osztóösszege (önmagát kihagyva) A Feladat: írjuk ki az összes barátságos számot ig a lehető leggyorsabban OE-NIK HP 15
V 1.0 Parallel.For problémák A lambda kifejezésen kívül definiált változók közös elérésűek – ennek megfelelően kell elérni őket (lehetőleg: sehogy, védelemmel, odafigyeléssel) Osztóösszegek meghatározása –Szokványos módszerrel: Ciklus i=2-től Gyök(X)-ig, minden osztót és osztópárt hozzáadok az összeghez sok osztás –Eratosthenes szita: a 2-t mint osztót hozzá kell adni az osztóösszeghez a következő számoknál: 4, 6, 8, … A 3-t mint osztót a 6, 9, 12 számoknál … etc Oldjuk meg mindkét módszerrel + sima illetve párhuzamos for ciklussal, és mérjük az időket! OE-NIK HP 16
V 1.0 OE-NIK HP 17 Források Miklós Árpád prezentációja
V 1.0 OE-NIK HP 18
19 OE-NIK HP