Konkurens TCP Szerver



Hasonló dokumentumok
Szálak szinkronizálása (Ro- Sincronizarea threadurilor)

Vé V g é r g e r h e a h j a tá t s á i s s z s ál á ak a Runnable, Thread

Operációs rendszerek. Az NT folyamatok kezelése

Uniprogramozás. várakozás. várakozás. Program A. Idő. A programnak várakoznia kell az I/Outasítások végrehajtására mielőtt továbbfuthatna

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

C# Szálkezelés. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Szálkezelés / 21

Programozás II. 4. Dr. Iványi Péter

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Concurrency in Swing

Operációs rendszerek. Az Executive és a kernel Policy és mechanizmusok szeparálása Executive: policy - objektum kezelés Kernel: mechanizmusok:

Tervminták a valósidejű gyakorlatban

Processzusok (Processes), Szálak (Threads), Kommunikáció (IPC, Inter-Process Communication)

Programozás C++ -ban

ISA szimulátor objektum-orientált modell (C++)

Programozási nyelvek Java

Számítógép-hálózatok: 4. Labor. TCP kliens. A gyakorlat célja:

Programozási nyelvek és módszerek Java Thread-ek

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

Folyamatok. 6. előadás

Processzusok (Processes), Szálak (Threads), Kommunikáció (IPC, Inter-Process Communication)

Programozás II. ATM példa Dr. Iványi Péter

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Osztályok. 4. gyakorlat

Tartalom DCOM. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés

és az instanceof operátor

Matematikai és Informatikai Intézet. 4. Folyamatok

Java és web programozás

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Programozás C++ -ban 2007/7

Programozás II gyakorlat. 4. Öröklődés

Programozás II gyakorlat. 6. Polimorfizmus

Autóipari beágyazott rendszerek. Komponens és rendszer integráció

Operációs rendszerek Folyamatok 1.1

Osztálytervezés és implementációs ajánlások

Osztálytervezés és implementációs ajánlások

A függvények névvel rendelkező utasításcsoportok, melyeknek információkat adhatunk át, és van egy visszatérési értékük.

OOP #14 (referencia-elv)

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Bevezetés, a C++ osztályok. Pere László

CREATE TABLE student ( id int NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name varchar(100) NOT NULL, address varchar(100) NOT NULL )

Windows ütemezési példa

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

117. AA Megoldó Alfréd AA 117.

RPC Remote Procedure Call Távoli eljárás hívás

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Programozás BMEKOKAA146. Dr. Bécsi Tamás 1. Előadás

Szoftvertechnológia alapjai Java előadások

Szerző. Varga Péter ETR azonosító: VAPQAAI.ELTE cím: Név: Kurzuskód:

Pénzügyi algoritmusok

Szoftvertechnológia alapjai Java előadások

Programozás II gyakorlat. 7. Példák a polimorfizmus alkalmazásaira

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

Végrehajtási szálak - kiegészítések. Szinkronizálás, érvénytelenített metódusok helyettesítése

Elemi Alkalmazások Fejlesztése II.

Bevezető. Servlet alapgondolatok

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

(kernel3d vizualizáció: kernel245_graph.mpg)

4. Öröklődés. Programozás II

Abstract osztályok és interface-ek. 7-dik gyakorlat

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás

Funkcionális és logikai programozás. { Márton Gyöngyvér, 2012} { Sapientia, Erdélyi Magyar Tudományegyetem }

3. Osztályok II. Programozás II

Felhasználó által definiált adattípus

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

A C# programozási nyelv alapjai

Programozási nyelvek Java

Programozás II. 2. Dr. Iványi Péter

OOP: Java 8.Gy: Abstract osztályok, interfészek

Java programozási nyelv 5. rész Osztályok III.

Operációs rendszerek. 6. gyakorlat: Processzusok közti kommunikáció (osztott memória, üzenetsor)

Az adatszolgáltatási rendszer kliens felülete

Programozási nyelvek JAVA EA+GY 1. gyakolat

Java programozási nyelv 4. rész Osztályok II.

Programozás 5. Dr. Iványi Péter

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Utolsó módosítás:

PHP. Telepítése: Indítás/újraindítás/leállítás: Beállítások: A PHP nyelv

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

Párhuzamos programozási platformok

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Java II. I A Java programozási nyelv alapelemei

2. Rekurzió. = 2P2(n,n) 2 < 2P2(n,n) 1

Az operációs rendszer szerkezete, szolgáltatásai

Thread-Specific Storage. Neuwirth István, 2009

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

Objektumorientált programozás C# nyelven

Broadcast Service Widget

Operációs rendszerek MINB240

C++ programozási nyelv Konstruktorok-destruktorok

Java II. I A Java programozási nyelv alapelemei

Kivételkezelés a C++ nyelvben Bevezetés

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Párhuzamos programozási platformok

Mobil alkalmazások fejlesztése

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

Átírás:

A gyakorlat célja: Konkurens TCP Szerver Megismerkedni a párhuzamos programozás és a konkurens TCP szerver készítésének az elméleti és gyakorlati alapjaival és egy egyidejűleg több klienst is kiszolgáló visszhang szerver elkészítése. Elméleti bevezető: Az előző laboron bemutatott TCP szerver egyidejüleg csak egyetlen egy klienset képes kiszolgálni. Meghatározás: A szál egy független vezérfonal egy folyamaton belül, amely egy kontextusból és egy utasítás szekvenciából áll. A szálak (threadek) a legkisebb futatható egységek rendszermag szinten. A folyamat létrejöttének pillanatában létrejön az elsődleges-szál is (fő szál ami egy rendszermag típusú szál). Ebben létre lehet hozni a továbbiakban más szálakat is. Egy folyamat szálai osztoznak a folyamat közös címtartományán és más erőforrásain. Ezen kívül minden szál rendelkezik saját kontextussal és veremmel. Kontextus és a szálak állapotai: Szál: Sajátos tulajdonságokkal rendelkező kontextus o Azonosító \ név o Ütemezési politika o Prioritás o Mi vezérli a szálat: rendszer magja vagy a folyamat Felhasználói struktúra o PC program számláló o SP Verem Mutató Verem Saját adat terület Végrehajtandó utasítások A szálak kezdeti állapota a Created amikor a szál objektum létre van hozva de meg nincs elindítva. Ebből az állapotból kerül a futatható (Runnable) állapotba, amikor várakozási listában várja a beütemezését. A futó állapot (Running) amikor effektív a fut szál a processzoron. Ez lehet felhasználói vagy rendszermag típusú futási állapot annak függvényében, hogy milyen típusú a szál és milyen műveletet hajt végre. Abban az esetben, ha egy rendszer hívás eredményeként várakoznia kell egy IO műveletre vagy egy eseményre, akkor alvó állapotba található (Sleeping), ebben az esetben nem ütemeződik újra a válasz megérkezéséig. Ha az utasítások, végrehajtását felfüggeszti egy

időre önmagának vagy egy külsőszál akkor a felfüggesztett állapotba (Stopped) kerül. Abban az esetben, ha a futást véglegesen befejezi, akkor a befejezett (Terminated) állapotban kerül.. Szálak osztályzása: 1.Ábra A szálak lehetséges állapotai A szálakat implementációja történhet rendszerhívásokkal vagy egy speciális könyvtár API-ján keresztül a felhasználói program szintjén. Ennek alapján a szálakat három csoportba soroljuk: Rendszer szálak Rendszerhívások segítségével van implementálva. Láthatók az operációs rendszer magjában. Nagyobb erőforrást használnak mert a operációs rendszer kell kezeljen adatstruktúrákat, ütemezést. Előnyei közé tartozik, hogy a rendszer párhuzamos ütemezheti végrehajtásra egy folyamat több szálát is, ha a rendszer több processzorral rendelkezik. Valamint ha a folyamat egyik szálának várakoznia kell egy IO műveletre a többi szálat azért beütemezhető. Felhasználói szálak Speciális könyvtár segítségével vannak implementálva. Az operációs rendszernek nincs tudomása róluk. Ha rendszerhívásra van szükség azt csak a folyamaton vagy a folyamathoz rendelt rendszerszálon keresztül, lehet elvégezni. A rendszernek mivel nincs tudomása a felhasználói szálakról, csak a folyamatokat beütemezésével foglakozik, a szálak ütemezését a felhasználó kell elvégezze. A szálak létrehozása, szinkronizálás, befejezése a speciális könyvtár API-án keresztül történik. A szálak egy jelzés hatására felszabadítják a processzor erőforrást a következő szál részére. Abban az esetben, ha egy szálnak rendszerhívása van akkor az többi szál meg kell várja amíg a rendszerhívás befejeződik. Nem ajánlott az olyan feladatok alkalmazásánál ahol gyakoriak a rendszerhívások.

Az előnyei közé tartozik, hogy az ütemezés független a rendszertől ezért könnyen kialakítható az alkalmazás szükségleteinek megfelelő ütemezőt. A kontextus váltáskor nincs szükség a rendszerre. Hordozható az alkalmazás, ha a megfelelő speciális könyvtár a másik típusú operációs rendszeren is megtalálható. Kombinált szálak Felhasználói szálak képezik, amelyek multiplikálva vannak egy rendszermag alapú szálra. A két típusú szál előnyeit próbálja ötvözni Több típusú van: Mx1 modell (many to one) 1x1 modell (one to one) MxN modell (many to many) Szálak a Microsoft Windows platformon A Windowsban is megtalálhatók a: felhasználói szálak, ami a FIBER vagy FIBERS név alatt szerepelnek rendszerszálak THREADS név alatt. Ebből két típusú létezik: o Felhasználó interface (User-Interface UI) szálak ezekhez a szálakhoz egy vagy több ablak rendelhető. Ebben az esetben létezik egy hurok ami várja az események érkezését és meghívja azt metódust ami kiszolgálja az eseményt. o Feldolgozói WORKER szálak Szálak létrehozása: HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpthreadattributes, // Egy biztonsági beállításokat tartalmazó struktúra ami megmondja, hogy a HANDLE azonosító örökölheti-e a gyerek szál. Ha NULL érték van akkor nem. SIZE_T dwstacksize, // szál vermének a kezdeti nagysága LPTHREAD_START_ROUTINE lpstartaddress, // szál függvénye ami vezérli a működését. Ha ez egy nem létező (nem megfelelő) függvényre mutat akkor a szál futása azonnal befejeződik és hibát térít vissza. LPVOID lpparameter, // szál argumentuma DWORD dwcreationflags, // Létrehozási opciók egyelőre csak a 0 van implementálva- a szál létrejöttekor egyből a fut. LPDWORD lpthreadid // Egy mutató amiben tároljuk a szál azonosítóját );

Ha sikeres a szál létrehozása, akkor egy operációs rendszer szinten egyedi azonosítót (HANDLE) térít vissza. Miután létrejött a szál az lpstartaddress-ben megadott függvényt kezdi végrehajtani. A visszatérítési értéket a GetExitCodeThread() metódus segítségével kapom meg. Szál befejezése Egy szál a futását a következő esetekben fejezi be: Befejeződik a hozzá rendelt metódus futása A konkurens szálból meghívjuk a ExitPrecess() vagy az ExitThread()é Egy másik szálból meghívódik a ExitPrecess() vagy az ExitThread() argumentumként megadva a megfelelő szál azonosítóját (HANDLE), ha a biztonsági beállítások ezt megengedik. A szál befejezése után a hozzá rendelt verem felszabadul és a szál objektum jelzett állapotba kerül. A szál mindaddig a memóriában marad, amíg az összes hozzárendelt HANDLE nincs felszabadítva a CloseHandle segítségével. Feladat: 1. Valósítsatok meg egy visszhang szervert amely egyidejüleg több klienst is kiszolgál. Megvalósítás: objektum orientáltan szekvenciálisan Objektum orientált implementálása a szálaknak Cél a szálak használatát megkönnyíteni és a szál által használt változókat és metódusokat egy objektumba zárni. Példaprogram: class SysThread public: SysThread( void ); virtual ~SysThread(); virtual bool start( void ); virtual bool stop( unsigned int timeout = 0 ); inline volatile bool& isrunning( void ) return m_brunning; inline volatile bool& isexited( void ) return m_bexited;

protected: virtual void run( void ); //Ezt a metodust a származtatott osztályban felül kell írni. Ide kell beírni az utasítás szekvenciát amit a szálunk végre kell hajtson private: friend DWORD WINAPI runstub( LPVOID mthread ); public: static const unsigned int INFINIT_WAIT; private: volatile bool m_brunning; volatile bool m_bexited; HANDLE m_thread; ; #include "SysThread.h" #include <limits.h> #include <windows.h> #define INVALID_HANDLE_VALUE 0 const unsigned int SysThread::INFINIT_WAIT = UINT_MAX; SysThread::SysThread( void ) m_bexited = true; m_thread = INVALID_HANDLE_VALUE; SysThread::~SysThread() bool SysThread::start( void ) if( m_bexited ) m_bexited = false; DWORD dw; if( (m_thread = CreateThread( NULL, 4096, runstub, this, 0, &dw )) == INVALID_HANDLE_VALUE ) m_bexited = true; return false; return true; bool SysThread::stop( unsigned int timeout )

if(!m_bexited ) for( unsigned int i = 0; (i <= timeout/100) (timeout == INFINIT_WAIT); i++) if( m_bexited ) break; Sleep( 10 ); if( m_thread!= INVALID_HANDLE_VALUE ) CloseHandle( m_thread ); m_thread = INVALID_HANDLE_VALUE; return m_bexited; void SysThread::run( void ) DWORD WINAPI runstub( LPVOID mthread ) SysThread* pthread = static_cast<systhread* >(mthread); pthread->m_brunning = true; pthread->run(); pthread-> pthread->m_bexited = true; return 0; //Itt meghívom a leszármaztatott osztály run függvényt, ami tartalmazza a szál utasításait. Kérdések: 1. MI a szerepe a friend és a virtual kulcsszónak? 2. Mikor hozok létre új szálat a szerverben? Könyvészet: [1] Florian Mircea Boian : Programare concurenta pe platforme Unix, Windows, Java Albastra kiadó 2002