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
© Miklós Árpád, BMF NIK, 2007
[email protected]
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.
V1.0
2008. február
© Miklós Árpád, BMF NIK, 2007
[email protected]
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. V1.0
2008. február
© Miklós Árpád, BMF NIK, 2007
[email protected]
3
Illusztráció: az időosztás elve P1 folyamat
P2 folyamat Megszakítás vagy rendszerhívás
Futó állapot
Állapotmentés (PCB1)
Futásra kész vagy várakozó állapot
Állapotbetöltés (PCB2) Futásra kész vagy várakozó állapot
Futó állapot Megszakítás vagy rendszerhívás
Állapotmentés (PCB2) Futó állapot
Állapotbetöltés (PCB1)
Futásra kész vagy várakozó állapot
Original image © 2000‐2005 David A. Solomon and Mark Russinovich
V1.0
2008. február
© Miklós Árpád, BMF NIK, 2007
[email protected]
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 *
V1.0
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ó. 2008. február
© Miklós Árpád, BMF NIK, 2007
[email protected]
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. V1.0
2008. február
© Miklós Árpád, BMF NIK, 2007
[email protected]
6
Folyamatok kezelése (kivonatos referencia) • System.Diagnostics.Process osztály Metódusok Start() CloseMainWindow() Kill() GetCurrentProcess() GetProcesses() WaitForExit() Tulajdonságok StartInfo PriorityClass EnableRaisingEvents HasExited ExitCode, ExitTime StandardInput, StandardOutput Események Exited V1.0
2008. február
Folyamat indítása Folyamat főablakának bezárása (GUI alkalmazásoknál) Folyamat leállítása Aktuális folyamatot reprezentáló objektum lekérése Összes folyamat adatainak lekérése a helyi számítógépről Várakozás az adott folyamat befejeződésére A folyamathoz tartozó ProcessStartInfo példány A folyamat prioritása (fontossági szintje) A folyamat kiválthat‐e eseményeket A folyamat kilépett‐e Kilépési kód, illetve a kilépés (vagy leállítás) időpontja Alapértelmezett be‐ és kimeneti csatorna (adatfolyam) A folyamat kilépett (vagy leállították) © Miklós Árpád, BMF NIK, 2007
[email protected]
7
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) Parancssori paraméterek és munkakönyvtár megadása az indítandó folyamathoz
Arguments, WorkingDirectory Domain, UserName, Folyamat indítása adott felhasználó nevében Password RedirectStandardInput, Alapértelmezett be‐ és kimeneti csatorna átirányítása RedirectStandardOutput ErrorDialog Hibaüzenet jelenjen‐e meg, ha a folyamat indítása sikertelen Operációs rendszerhéj programindító funkciójának használata UseShellExecute folyamat indításához Verb A társított fájl megnyitásakor végrehajtandó művelet Kezdeti ablakméret megadása (normál, minimalizált vagy WindowStyle maximalizált méret)
V1.0
2008. február
© Miklós Árpád, BMF NIK, 2007
[email protected]
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 V1.0
2008. február
© Miklós Árpád, BMF NIK, 2007
[email protected]
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.
V1.0
2008. február
© Miklós Árpád, BMF NIK, 2007
[email protected]
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 V1.0
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
2008. február
© Miklós Árpád, BMF NIK, 2007
[email protected]
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
V1.0
2008. február
© Miklós Árpád, BMF NIK, 2007
[email protected]
12
Megoldás (2)
VisualCompiler V1.0
2008. február
© Miklós Árpád, BMF NIK, 2007
[email protected]
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
V1.0
2008. február
© Miklós Árpád, BMF NIK, 2007
[email protected]
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. V1.0
2008. február
© Miklós Árpád, BMF NIK, 2007
[email protected]
15