SzPE (C#) 2007 2008, II. félév BMF NIK Párhuzamos programozás: folyamatok A párhuzamos programozás alapjai A végrehajtás szétválasztása: elszigetelés és párhuzamosítás Párhuzamosság és ütemezés az operációs rendszer szintjén Folyamatok fogalma és kezelése Új folyamat indítása, létező folyamatok leállítása és bevárása Folyamatok tulajdonságainak és eseményeinek kezelése miklos.arpad@nik.bmf.hu
Hallgatói tájékoztató A jelen bemutatóban található adatok, tudnivalók és információk a számonkérendő anyag vázlatát képezik. Ismeretük szükséges, de nem elégséges feltétele a sikeres zárthelyinek, illetve vizsgának. Sikeres zárthelyihez, illetve vizsgához a jelen bemutató tartalmán felül a kötelező irodalomként megjelölt anyag, a gyakorlatokon szóban, illetve a táblán átadott tudnivalók ismerete, valamint a gyakorlatokon megoldott példák és az otthoni feldolgozás céljából kiadott feladatok önálló megoldásának képessége is szükséges. 2
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 gyakorlatilag függetleníti egymástól a processzorok és a rajtuk egyidőben futtatható programok számát. 3
Illusztráció: az időosztás elve Futó állapot P 1 folyamat Megszakítás vagy rendszerhívás Állapotmentés (PCB 1 ) Állapotbetöltés (PCB 2 ) P 2 folyamat Futásra kész vagy várakozó állapot Futásra kész vagy várakozó állapot Futó állapot Megszakítás vagy rendszerhívás Állapotmentés (PCB 2 ) Állapotbetöltés (PCB 1 ) Futó állapot Futásra kész vagy várakozó állapot Original image 2000 2005 David A. Solomon and Mark Russinovich 4
Ütemezés az operációs rendszerekben Az ütemezés fogalma a végrehajtás alatt álló programok közötti rendszeres váltás módját, időzítését és szabályait takarja A Microsoft Windows preemptív, prioritásos, körbenforgó, kétszintű* ütemezési politikát alkalmaz. Az ütemezés preemptív : az operációs rendszer kívülről bármikor képes megszakítani a programok futását Az ütemezés prioritásos : minden programnak van egy fontossági szintje (prioritása), amely meghatározza, hogy egy egy időszelet lejártakor melyik program következhet sorra Az ütemezés körbenforgó : az egyforma prioritású programok között a rendszer egyenlően osztja el a rendelkezésre álló időt, és a programok sorban egymás után kapnak egy egy időszeletet (az utolsó program időszelete után ismét az első következik) Az ütemezés kétszintű : az elszigetelt folyamatok mellett léteznek ún. szálak is, amelyek a futtatni kívánt kód egy folyamaton belüli további bontását teszik lehetővé (lásd később) A Unix/Linux rendszerek félig preemptív, prioritásos, körbenforgó, egyszintű ütemezési politikát alkalmaznak. Az ütemezés félig preemptív : az operációs rendszer a programok futását kívülről bármikor képes megszakítani, saját belső elemeinek futását azonban nem Az ütemezés egyszintű : a rendszerben csak elszigetelt folyamatok léteznek, ezek képezik a párhuzamosítás alapegységét is * A modell ténylegesen négyszintű, de a legfelső ( job ) és a legalsó ( fiber ) szemcsézettségi szint csak speciális módon használható. 5
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
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 StartInfo A folyamathoz tartozó ProcessStartInfo példány PriorityClass A folyamat prioritása (fontossági szintje) EnableRaisingEvents A folyamat kiválthat e eseményeket HasExited A folyamat kilépett e ExitCode, ExitTime Kilé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 Exited A folyamat kilépett (vagy leállították) 7
Folyamatok kezelése (kivonatos referencia) System.Diagnostics.ProcessStartInfo osztály Tulajdonságok FileName Arguments, WorkingDirectory Domain, UserName, Password RedirectStandardInput, RedirectStandardOutput ErrorDialog UseShellExecute Verb WindowStyle Fájlnév megadása az indítandó folyamathoz (program vagy programmal társított fájltípusba tartozó fájl neve) Parancssori paraméterek és munkakönyvtár megadása az indítandó folyamathoz Folyamat indítása adott felhasználó nevében Alapértelmezett be és kimeneti csatorna átirányítása Hibaüzenet jelenjen e meg, ha a folyamat indítása sikertelen Operációs rendszerhéj programindító funkciójának használata folyamat indításához A társított fájl megnyitásakor végrehajtandó művelet Kezdeti ablakméret megadása (normál, minimalizált vagy maximalizált méret) 8
Példa új folyamat indítására 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 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(); ProcessExamples\Program.cs 9
Feladat (1) 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
Megoldás (1) 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 using System; using System.Diagnostics; class Program { static void Main(string[] args) { if (args.length > 0) { ProcessStartInfo startinfo = new ProcessStartInfo(); startinfo.filename = String.Format(@"{0}\..\Microsoft.NET\Framework\v{1}\csc.exe", Environment.GetFolderPath(Environment.SpecialFolder.System), Environment.Version.ToString(3)); startinfo.arguments = String.Format(@"/nologo /t:exe {0}", args[0]); startinfo.redirectstandardoutput = true; startinfo.useshellexecute = false; } } Process compilerprocess = Process.Start(startinfo); string output = compilerprocess.standardoutput.readtoend(); compilerprocess.waitforexit(); if (output == String.Empty) Console.WriteLine("A forráskód hibátlan, a fordítás sikerült."); else Console.WriteLine("Hibaüzenetek:" + Environment.NewLine + output); } Compiler\Program.cs 11
Feladat (2) 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 12
Megoldás (2) VisualCompiler 2008. február miklos.arpad@nik.bmf.hu 13
Irodalomjegyzék (alapismeretek) C. Nagel, B. Evjen, J. Glynn, M. Skinner, K. Watson, A. Jones: Professional C# 2005 Kiadó: Wiley Publishing, Inc., 2006 ISBN: 978 0 7645 7534 1 Web: http://www.wiley.com/, http://www.wrox.com/ Nyelv: angol Terjedelem: 1540 oldal Folyamatok kezelése: 14 16., 413. o. Szálkezelés: 349 368. o. Microsoft Corp., Visual Studio Developer Center Szálkezelés a.net keretrendszerben: http://msdn2.microsoft.com/en us/library/3e8s7xdd(vs.80).aspx 14
Irodalomjegyzék (magasszintű ismeretek) Albert I., Balássy Gy., Charaf H., Erdélyi T., Horváth Á., Levendovszky T., Péteri Sz., Rajacsics T.: A.NET Framework és programozása Kiadó: Szak Kiadó, 2004 ISBN: 963 9131 62 8 Web: http://www.szak.hu/ Nyelv: magyar Terjedelem: 868 oldal Párhuzamos programozás: 585 607. o. Folyamatok kezelése: 608 613. o. Szálkezelés és szinkronizáció: 614 648. o. J. Richter: CLR via C#, Second Edition Kiadó: Microsoft Press, 2006 ISBN: 978 0 7356 2163 3 Web: http://www.wintellect.com/ Nyelv: angol Terjedelem: 736 oldal Szálkezelés és szinkronizáció: 585 648. o. 15