Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaFerenc Márk Horváth Megváltozta több, mint 5 éve
1
Web programozás és haladó fejlesztési technikák Folyamatok és szálak
2
BEVEZETÉS
3
Folyamatok Az operációs rendszer egyidejűleg több programot is végrehajthat Ehhez a programhoz erőforrásokat rendel, memóriaterületet allokál, prioritást határoz meg A végrehajtás alatt álló programot folyamatnak nevezzük Több folyamat szimultán futtatásához több processzor(mag) szükséges Ezt nevezzük párhuzamos feldolgozásnak De lehetőség van arra is, hogy a különböző folyamatok időosztásos felbontásban férjenek hozzá az erőforrásokhoz Ezt nevezzük konkurrenciának
4
Szálak A folyamaton belüli egységnyi végrehajtási szekvenciát szálnak nevezzük Egy folyamaton belül több szál is lehet A szálak a gazdafolyamatuk memóriaterületét használják Külön CPU magot használhatnak Folyamat
5
Párhuzamosság Multiprocessing Multithreading
Több folyamat dolgozik ugyanazon probléma megoldásán Az egyes folyamatok külön CPU-t használhatnak a számításaikhoz Az egyes folyamatok különálló memóriaterületen dolgoznak, információ cseréjéhez kommunikálniuk kell Multithreading Egy folyamaton belül több szál dolgozik a probléma megoldásán A szálak külön CPU magokat használhatnak a számításaikhoz A szálak közös memóriaterületen dolgoznak, adatok hozzáférésekor számíthat a hozzáférési sorrend
6
FOLYAMATOK
7
System.Diagnostics.Process
A Process osztály példányosításával hozható létre folyamat De az osztályszintű Start() metódus is használható ilyen célra Process p = new Process() { StartInfo = new ProcessStartInfo("hello") { CreateNoWindow = true, UseShellExecute = false, RedirectStandardOutput = true } }; Process.Start("cmd"); Process.Start("explorer"); Process.Start("chrome", " Process.Start("
8
System.Diagnostics.Process osztály (kivonatos referencia)
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) Összefoglalás: új processzek egyszerű vezérlése (létrehozás, leállítás), ill. processzekről/ből információnyerésre.
9
System.Diagnostics.ProcessStartInfo osztály (kivonatos referencia)
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 ErrorDialog Hibaü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 Verb A 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) Számos paraméter és beállítás adható meg a folyamatként elindítani kívánt programhoz UseShellExecute: shell indítást használjuk-e? Ha igen, akkor: nem kell hogy futtatható állomány legyen (nem futtathatót a társított programmal indít el; mint kettős kattintás a windows explorerben). ErrorDialog csak így megy. Ha UseShellExecute==false, akkor csak futtatható indítható, ÉS megengedi a RedirectStandardInput/Output/Errort. Teljes elérési út kell.
10
Folyamatok listázása Process.GetProcesses()
static void Main(string[] args) { foreach (var p in Process.GetProcesses().OrderBy(x => x.Id)) Console.WriteLine($"#{p.Id}\t {p.ProcessName}"); } # Idle # System # Registry # RuntimeBroker # tv_x64 # WUDFHost # smss # svchost # csrss # egui # wininit # csrss
11
Több példányban futó folyamat
Elfőfordulhat, hogy a programunk logikájában tiltani szeretnénk azt, hogy egyidejűleg több folyamat induljon ugyanabból a futtatható állományból
12
Több példányban futó folyamat
if (Process.GetProcesses().Where( x => x.ProcessName == Process.GetCurrentProcess().ProcessName && x.Id != Process.GetCurrentProcess().Id ).Count() > 0) { Console.WriteLine("Ez a folyamat már fut!"); return; } Console.WriteLine("Helló világ!"); Console.ReadLine(); Ez a folyamat már fut! Ez a folyamat már fut! Ez a folyamat már fut! Helló világ!
13
Folyamat kimenetének olvasása
Hello.exe static void Main(string[] args) { if (args.Length > 0) Console.WriteLine("Hello " + args[0] + "!"); else Console.WriteLine("Hello világ!"); } c:\Users\kerteszg\source\repos\Process_IPC\03_Hello\bin\Debug>hello.exe Hello világ! c:\Users\kerteszg\source\repos\Process_IPC\03_Hello\bin\Debug>hello.exe Gábor Hello Gábor!
14
Folyamat kimenetének olvasása
Process p = Process.Start(new ProcessStartInfo("hello") { CreateNoWindow = true, UseShellExecute = false, RedirectStandardOutput = true }); p.WaitForExit(); Console.WriteLine(p.StandardOutput.ReadToEnd()); Hello világ!
15
Folyamat kimenetének olvasása
Process p = Process.Start(new ProcessStartInfo("hello", "Pistike") { CreateNoWindow = true, UseShellExecute = false, RedirectStandardOutput = true }); p.WaitForExit(); Console.WriteLine(p.StandardOutput.ReadToEnd()); Hello Pistike!
16
Blokkolásmentes felépítés
A p.WaitForExit() hívás addig blokkolja a végrehajtást, amíg p folyamat véget nem ér. Ez a viselkedés folyamatok esetén megkerülhető például események használatával p.EnableRaisingEvents = true; p.Exited += P_Exited;
17
Blokkolásmentes felépítés
foreach (var h in hosts) { Process p = Process.Start(new ProcessStartInfo("ping", "-n 10 " + h) CreateNoWindow = true, UseShellExecute = false, RedirectStandardOutput = true }); p.EnableRaisingEvents = true; p.Exited += P_Exited; } Console.ReadLine(); //... private static void P_Exited(object sender, EventArgs e) Console.WriteLine((sender as Process).StandardOutput.ReadToEnd());
18
Inter-process Communication
Folyamatok közötti üzenetváltás Többféle megközelítés létezik: Socket Pipe Message queue Shared memory Message passing stb. Shared memory: windowson igazából memory-mapped file, amikor egy fájl tartalma a vitruális memóriában van, és több folyamat is hozzáférhet konkurrens módon – így igazából lett egy közös memóriaterületük Message queue: MSMQ, windows szolgáltatás. Akkor lehet hasznos, ha a kliens(ek) gyakran vannak offline
19
Pipe Amennyiben a host ugyanaz, a legegyszerűbb megközelítési mód a pipe (System.IO.Pipes) //Szerver var server = new NamedPipeServerStream("EzEgyEgyediNev"); Console.WriteLine("Várakozás kliensre..."); server.WaitForConnection(); Console.WriteLine("Kliens csatlakozott!"); StreamReader reader = new StreamReader(server); StreamWriter writer = new StreamWriter(server); while (true) { var line = reader.ReadLine(); writer.WriteLine(string.Join("", line.Reverse())); Console.WriteLine($"Azt az üzenetet kaptam hogy {line}, azt feleltem hogy {string.Join("", line.Reverse())}"); writer.Flush(); } //Kliens var client = new NamedPipeClientStream("EzEgyEgyediNev"); Console.WriteLine("Csatlakozom a szerverhez..."); client.Connect(); Console.WriteLine("Csatlakozva!"); StreamReader reader = new StreamReader(client); StreamWriter writer = new StreamWriter(client); while (true) { Console.WriteLine("Mit üzensz?"); string input = Console.ReadLine(); if (String.IsNullOrEmpty(input)) break; writer.WriteLine(input); writer.Flush(); Console.WriteLine(reader.ReadLine()); } A Pipe streames megoldás, és így felépítve, readerrel-writerrel _nagyon_ hasonlít a socketes megoldásra
20
NamedPipe demo Várakozás a kliensre... Kliens csatlakozott!
Azt az üzenetet kaptam hogy asdasdasd, azt feleltem hogy dsadsadsa Azt az üzenetet kaptam hogy Indul a görög aludni, azt feleltem hogy indula görög a ludnI Csatlakozom a szerverhez... Csatlakozva! Mit üzensz? asdasdasd dsadsadsa Indul a görög aludni indula görög a ludnI
21
MPI A Message Passing Interface egy szabvány, amelyet implementál többek között az OpenMPI nevű keretrendszer is Segítségével megoldható a folyamatok közötti kommunikáció, akár hálózaton keresztül is using (new MPI.Environment(ref args)) { Console.WriteLine( "Hello, from process number " + MPI.Communicator.world.Rank.ToString() + " of " + MPI.Communicator.world.Size.ToString() ); } C:\tmp\MPI_Hello\bin\Debug>mpiexec -n 8 MPI_Hello.exe Hello, from process number 1 of 8 Hello, from process number 0 of 8 Hello, from process number 4 of 8 Hello, from process number 3 of 8 Hello, from process number 6 of 8 Hello, from process number 2 of 8 Hello, from process number 5 of 8 Hello, from process number 7 of 8
22
SZÁLKEZELÉS
23
System.Threading.Thread
A Thread osztály példányosításával hozható létre szál using System; using System.Threading; namespace _01_HelloWorld { class Program static void Main(string[] args) Thread t = new Thread(Koszon); Console.WriteLine("Szál indítása!"); t.Start(); Console.WriteLine("Várakozás a befejezésre..."); t.Join(); Console.ReadLine(); } static void Koszon() Console.WriteLine("Hello világ!");
24
System.Threading.Thread (kivonatos referencia)
Metódusok Start() Szál indítása Suspend(), Resume() Szál felfüggesztése, illetve folytatása Abort() Szál leállítása GetHashCode() Szál azonosítójának lekérése Sleep() Várakozás a megadott időintervallum elteltéig Join() Várakozás az adott szál befejeződésére Tulajdonságok CurrentCulture, CurrentUICulture A szálhoz tartozó aktuális kultúra, illetve a szálhoz tartozó felhasználói felület kiválasztott nyelve IsBackground Az adott szál háttérszál vagy előtérszál* IsThreadPoolThread Az adott szál a ThreadPool egyik szála-e ManagedThreadID A szál egyedi azonosítója Name A szál megnevezése Priority A szál prioritása (fontossági szintje) ThreadState A szál aktuális állapota(i) * A programok futása véget ér, ha az utolsó előtérszál is lefutott (az esetleg még futó háttérszálak ekkor automatikusan megszűnnek).
25
ThreadStart delegate A Thread objektum konstruktora ThreadStart illetve ParameterizedThreadStart delegáltat fogad el bemeneti paraméterként ThreadStart egy visszatérési érték és bemeneti paraméter nélküli metódus lehet, azaz gyakorlatilag void() Ugyanúgy paraméterezhető lambda kifejezéssel mint az Action Thread t = new Thread(Koszon); Thread t2 = new Thread(() => { Thread.Sleep(1500); Console.WriteLine("Hello világ!"); }); t.Start(); t2.Start();
26
Szál paraméterezése A ParameterizedThreadStart delegált egy void(object) szignatúrájú metódus Szálnak bemeneti paramétert objectként kell átpasszolni a Start() metódus paramétereként static void Koszon(object o) { //string nev = (string)o; string nev = o.ToString(); //ebben az esetben eleg ez is Console.WriteLine("Hello " + o + "!"); } static void Main(string[] args) Thread t = new Thread(Koszon); Console.WriteLine("Szál indítása!"); t.Start("Pistike"); Console.WriteLine("Várakozás a befejezésre..."); t.Join(); Console.ReadLine();
27
Több szál végrehajtása egyidejűleg
A konzolra egyszerre csak egy szál tud kiírni: amikor az egyik szál hozzáfér az erőforráshoz, a másik várakozik „versenyhelyzet” Thread t = new Thread(() => { Thread.Sleep(1500); Console.WriteLine("asd"); }); t.Start(); for (int i = 0; i < 20; i++) { Thread.Sleep(100); Console.WriteLine("Várakozás #{0}", i); } Console.ReadLine();
28
Több szál végrehajtása egyidejűleg
A konzolra egyszerre csak egy szál tud kiírni: amikor az egyik szál hozzáfér az erőforráshoz, a másik várakozik „versenyhelyzet” Futtatáskor: Várakozás #0 Várakozás #1 Várakozás #2 Várakozás #3 Várakozás #4 Várakozás #5 Várakozás #6 Várakozás #7 Várakozás #8 Várakozás #9 Várakozás #10 Várakozás #11 Várakozás #12 asd Várakozás #13 Várakozás #14 Várakozás #15 Várakozás #16 Várakozás #17 Várakozás #18 Várakozás #19 Másik futtatáskor: Várakozás #0 Várakozás #1 Várakozás #2 Várakozás #3 Várakozás #4 Várakozás #5 Várakozás #6 Várakozás #7 Várakozás #8 Várakozás #9 Várakozás #10 Várakozás #11 Várakozás #12 Várakozás #13 asd Várakozás #14 Várakozás #15 Várakozás #16 Várakozás #17 Várakozás #18 Várakozás #19
29
További lehetőségek többszálúság megvalósítására
Aszinkron metódusok Thread ThreadPool BackgroundWorker TPL / Task TPL / AsyncAwait TPL / Parallel BackgroundWorker: erre nem mutatok példát, mert WinForms esetén lenne értelme. Amúgy egy alacsony prioritású poolbeli Threadet használ
30
Aszinkron metódusok Aszinkron metódus: a feladat megkezdése után, de még mielőtt az befejeződött, elkezdődhet egy másik feladat végrehajtása //eredeti, szekvencialis megoldas: WebClient wc = new WebClient(); Console.WriteLine("A letöltés elindult..."); wc.DownloadFile(new Uri(" "a_prezi.pptx"); Console.WriteLine("Letöltés vége!");
31
Aszinkron metódusok static void Main(string[] args) {
WebClient wc = new WebClient(); wc.DownloadFileCompleted += Wc_DownloadFileCompleted; wc.DownloadFileAsync(new Uri(" "a_prezi.pptx"); Console.WriteLine("A letöltés elindult..."); Console.ReadLine(); } private static void Wc_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) Console.WriteLine("Letöltés vége!");
32
Thread pooling A szálak (egyenkénti) létrehozása költséges, hatékonyság szempontjából jobb ötlet lenne „újrahasznosítható” szálakat regisztrálni az operációs rendszerben, és amikor szükség lesz rá, csak felhasználni A kép forrása:
33
Thread pooling A QueueUserWorkItem egy WaitCallback delegáltat vár, ami void(object) szignatúrájú Akkor kerül végrehajtásra, ha lesz szabad poolbeli Thread static void Main(string[] args) { for (int i = 0; i < 20; i++) ThreadPool.QueueUserWorkItem(Kalkulacio, i); Console.WriteLine("Várakozunk a nagy válaszra ..."); Console.ReadLine(); } static void Kalkulacio(object o) Thread.Sleep(1000); Console.WriteLine(o + ": az élet értelme 42"); Várakozunk a nagy válaszra ... 3: az élet értelme 42 2: az élet értelme 42 1: az élet értelme 42 0: az élet értelme 42 5: az élet értelme 42 4: az élet értelme 42 6: az élet értelme 42 7: az élet értelme 42 8: az élet értelme 42 9: az élet értelme 42 10: az élet értelme 42 12: az élet értelme 42 11: az élet értelme 42 13: az élet értelme 42 14: az élet értelme 42 16: az élet értelme 42 15: az élet értelme 42 18: az élet értelme 42 17: az élet értelme 42 19: az élet értelme 42
34
További lehetőségek többszálúság megvalósítására
Aszinkron metódusok Thread ThreadPool BackgroundWorker TPL / Task TPL / AsyncAwait TPL / Parallel TPL: köv alkalommal :)
35
Források Szabó-Resch Miklós Zsolt és Cseri Orsolya Eszter Haladó Programozás előadásfóliái Miklós Árpád prezentációi MSDN
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.