Thread-Specific Storage. Neuwirth István, 2009

Hasonló dokumentumok
Konkurens TCP Szerver

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

DCOM Áttekintés. Miskolci Egyetem Általános Informatikai Tanszék. Ficsor Lajos DCOM /1

Szoftvertechnológia alapjai Java előadások

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

Segédanyag: Java alkalmazások gyakorlat

OOP #14 (referencia-elv)

Collections. Összetett adatstruktúrák

Concurrency in Swing

Segédanyag: Java alkalmazások gyakorlat

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Java I. A Java programozási nyelv

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

CORBA Áttekintés. Mi a CORBA? OMG and OMA. Ficsor Lajos. Miskolci Egyetem Általános Informatikai Tanszék

Bevezető. Servlet alapgondolatok

Programozási nyelvek Java

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

Szoftver labor III. Tematika. Gyakorlatok. Dr. Csébfalvi Balázs

Java I. A Java programozási nyelv

OOP. Alapelvek Elek Tibor

JNDI - alapok. Java Naming and Directory Interface

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

GENERIKUS PROGRAMOZÁS Osztálysablonok, Általános felépítésű függvények, Függvénynevek túlterhelése és. Függvénysablonok

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

Objektumorientált programozás C# nyelven

7. rész: A specifikációtól az implementációig az EJB rétegben

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

Iman 3.0 szoftverdokumentáció

és az instanceof operátor

C#, OOP. Osztályok tervezése C#-ban

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

Objektumorientált programozás C# nyelven

Programozási nyelvek Java

Objektumorientált programozás C# nyelven III.

Osztott alkalmazások fejlesztési technológiái Áttekintés

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

Globális operátor overloading

Programozás C++ -ban 2007/7

Objektum orientált kiterjesztés A+ programozási nyelvhez

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

Osztott rendszerek (Distributed. systems) Bevezetés. Tartalom. Ficsor Lajos. Miskolci Egyetem Általános Informatikai Tanszék

Generikus Típusok, Kollekciók

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

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

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

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

Operációs rendszerek. Windows NT. A Windows NT

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

Ficsor Lajos Általános Informatikai Tanszék Miskolci Egyetem

Tartalom. Történeti áttekintés. Történeti áttekintés Architektúra DCOM vs CORBA. Szoftvertechnológia

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

Hálózatbiztonság Androidon. Tamas Balogh Tech AutSoft

Fordított és szkript nyelvek összehasonlító elemzése. Sergyán Szabolcs

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

Pénzügyi algoritmusok

Adatbázis rendszerek II. Adatbázis elérése C# kliens programból ADO.NET API-n keresztül

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

Se S r e ial a iza z t a ion o n (in n Ja J v a a v ) a Szerializáció

Osztott rendszerek (Distributed

BME MOGI Gépészeti informatika 8.

Access adatbázis elérése OLE DB-n keresztül

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

Programozás I. Első ZH segédlet

Szoftvertechnolo gia gyakorlat

A Java EE 5 plattform

C# osztálydeníció. Krizsán Zoltán 1. .net C# technológiák tananyag objektum orientált programozás tananyag

Java programozási nyelv 6. rész Java a gyakorlatban

ios alkalmazásfejlesztés Koltai Róbert

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.

Programozási nyelvek Java

Osztályok. 4. gyakorlat

Objektumorientált programozás C# nyelven III.

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

1. Alapok. Programozás II

Kommunikáció. Távoli eljáráshívás. RPC kommunikáció menete DCE RPC (1) RPC - paraméterátadás. 3. előadás Protokollok. 2. rész

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

Pénzügyi algoritmusok

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

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

Programozási nyelvek Java

.Net adatstruktúrák. Készítette: Major Péter

Programozási nyelvek II.: JAVA

Java. Perzisztencia. ANTAL Margit. Java Persistence API. Object Relational Mapping. Perzisztencia. Entity components. ANTAL Margit.

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

Szoftver Tervezési Dokumentáció. Nguyen Thai Binh

JAVA PROGRAMOZÁS 2.ELŐADÁS

Kommunikáció. Folyamatok közötti kommunikáció. Minden elosztott rendszer alapja

ELTE SAP Excellence Center Oktatóanyag 1

eseményvezérelt megoldások Vizuális programozás 5. előadás

Szoftver-technológia II. Tervezési minták. Irodalom. Szoftver-technológia II.

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

Objektumorientált programozás C# nyelven

Objektumorientált paradigma és programfejlesztés Bevezető

Operációs rendszerek. A Windows NT felépítése

C# osztályok. Krizsán Zoltán

C++ programozási nyelv Konstruktorok-destruktorok

Függőség injekció Konstantinusz Kft 2010

Enterprise JavaBeans. Ficsor Lajos Általános Informatikai Tanszék Miskolci Egyetem. Az Enterprise JavaBeans

Átírás:

Thread-Specific Storage Neuwirth István, 2009

Thread-Specific Storage Más néven: Thread-Local Storage (TLS) Konkurens tervminta Többszálú programozással kapcsolatban fellépı problémákra

A minta célja Lehetıvé teszi, hogy több szál használjon egy logikailag globális hozzáférési pontot, amelyen keresztül egy szál szempontjából lokális objektumot nyerhet ki, az elérések többletköltsége nélkül.

Egy példa Adott egy több szálon futó hálózati naplózó szerver, amely kiszolgálja a klienseket, az állapotaikat naplózza Kapcsolatonként indított szálak vannak Minden szál a hozzá rendelt TCP socket-en keresztül olvassa a naplórekordokat, majd kiírja valamilyen output egységre, legyen az nyomtató, monitor vagy háttértár. Az alacsonyszintő IO mőveletekrıl az operációs rendszerek többségében (Unix és Windows rendszereken is) egy globális hozzáférési ponton keresztül szerezhetünk információt. Ez a pont az errno. (Tipikusan egy int.)

Egy példa : handlea :loggera : handleb :loggerb : handlec :loggerc Naplózó szerver

Egy példa // Egy globális <errno> folyamatonként. extern int errno; void *logger (HANDLE socket) { } // Olvassuk a naplórekordokat a kapcsolat lezártáig for (;;) { } char log_record[maxrec]; if (recv (socket, log_record, MAXREC, 0) == -1) { // Ellenırizzük, miért nem sikerült a <recv>. if (errno == EWOULDBLOCK) sleep (1); // Késıbb újra megpróbáljuk. else // Megjelenítjük a hiba eredményét. cerr << "recv failed, errno=" << errno; } else // Normál esetben...

Egy példa if (recv (socket, log_record, MAXREC, 0) == -1) // errno-t beállítja EWOULDBLOCKra if (recv (socket, log_record, MAXREC, 0) == -1) // errno-t beállítja EINTR // T1 rosszul értesül arról, hogy // a recv() megszakították T1 szál T2 szál

Megoldás? Valamilyen zárolás Versenyhelyzetek Holtponthoz vezethet Gyakori ellenırzések jelentısen csökkentik a teljesítményt, a zárolási overhead miatt akár egy egyszálon futó program is bírhat olyan teljesítménnyel, mint egy többszálú megfelelıje. Amire szükség van, az valamilyen mechanizmus, amely minden szálnak ad másolatokat (fizikailag lokálisak) a logikailag globális objektumokról, mint amilyen az errno.

Szerkezet Hat féle osztály alkotja a mintát Thread-Specific Object Egy objektumpéldány, amelyet csak egy szál tud elérni (például errno int-ként, minden szálnak egy-egy példánya van belıle). Key Azonosítja a szálspecifikus objektumot Key Factory Kulcsokat generál Például, egy többszálú operációs rendszer implementálja az errno-t, egy globálisan egyedi kulcsot létrehozva. Minden egyes szál ezt a kulcsot használja, hogy elérje a saját errno példányát.

Szerkezet Thread-Specific Object Set Egy győjteményét tartalmazza a különálló szálakhoz rendelt szálspecifikus objektumoknak. Minden egyes szál rendelkezik egy ilyen halmazzal. Metódusai: get()/set(). Thread-Specific Object Proxy Minden proxy tárol egy kulcsot, amely egyedien azonosít egy szálspecifikus objektumot. Épp ezért, egy ilyen objektum van kulcsonként és szálanként. Application Threads Használják a proxy-kat, hogy elérjék a szálspecifikus objektumokat. Mint a példában a logger() függvényt futtató szál.

Szerkezet Application Thread m <<uses>> Thread-Specific Object Proxy key method1() methodn() n m calls Thread-Specific Object Set get(key) set (key, object) maintains n m n kulcs, m szál Key Factory create_key() Thread-Specific Object Proxy key method1() methodn()

Szerkezet Thread-Specific Object Proxy accesses key1 keyn thread 1 Thread-Specific Object Set manages thread m Thread-Specific Object

Dinamikus viselkedés Szálspecifikus objektum létrehozása: Egy alkalmazásszál meghív egy proxy metódust a proxy interfészén. Ha a proxy-nak még nincs társított kulcsa, akkor létrehoz egyet, amit tárol. A proxy létrehoz egy új objektumot dinamikusan. Aztán a halmaz set() mőveletével társítja a kulcshoz. A következıkben látottak szerint lefut az alkalmazásszál által meghívott metódus.

Dinamikus viselkedés Szálspecifikus objektum létrehozása: : Application Thread : Thread-Specific Object Proxy : Key Factory : Thread-Specific Object Set method() create_key() key TSObject key set() : Thread-Specific Object

Dinamikus viselkedés Létezı szálspecifikus objektum elérése: Egy alkalmazásszál meghív metódust a proxy-n. A proxy átadja a kulcsát az alkalmazásszál halmazának get() mőveletéhez. Ez a függvény visszaad egy mutatót a szóbanforgó szálspecifikus objektumra. A proxy használja ezt a mutatót, hogy meghívja az eredeti metódust az objektumon.

Dinamikus viselkedés Létezı szálspecifikus objektum elérése: : Application Thread : Thread-Specific Object Proxy : Thread-Specific Object Set : Thread-Specific Object method() key get() TSObject method() result result

Implementáció Részek az implementációból (POSIX Pthreads könyvtár) int pthread_key_create (pthread_key_t *key, void (*thread_exit_hook)(void *)) { } if (total_keys_ >= _POSIX_THREAD_KEYS_MAX) { } // Use our internal <errno> macro. INTERNAL_ERRNO = ENOMEM; return -1; thread_exit_hook_[total_keys_] = thread_exit_hook; *key = total_keys_++; return 0;

Implementáció Részek az implementációból (POSIX Pthreads könyvtár) int pthread_setspecific (pthread_key_t key, void *value) { } if (key < 0 key >= total_keys) { } // Use our internal <errno> macro. INTERNAL_ERRNO = EINVAL; return -1; // Store value into appropriate slot in the thread- // specific object set. pthread_self ()->object_set_[key] = value; return 0;

Implementáció Részek az implementációból (POSIX Pthreads könyvtár) int pthread_getspecific (pthread_key_t key, void **value){ } if (key < 0 key >= total_keys) { } // Use our internal <errno> macro. INTERNAL_ERRNO = EINVAL; return -1; *value = pthread_self ()->object_set_[key]; return 0;

Ismert felhasználások Operációs rendszerek (Win32, Solaris, ), az errno mechanizmus támogatására. Win32-es API-ban, a szálak rendelkezhetnek ablakkal, amelyeknek van egy-egy message queue-ja. Az, ahogy a hívásokkal leszedjük a sorból a következı elemet, szintén TLS-sel valósul meg. OpenGL glvertex() függvény, állapotváltozók befoglalt globális változóként Telefonszolgáltatások (valós életbeli példa)

Elınyök Négy fı elınye van a Thread-Specific Storage minta használatának: Hatékonyság a szálspecifikus adat elérése implementálható zárolás nélkül. Újrahasználhatóság Wrapper Facade minta segítségével. Könnyő használhatóság csomagolóosztály mögé rejtve eltőnik a forráskódszintő absztrakció (makrók, egyebek). Hordozhatóság A TLS a legtöbb többszálú operációs rendszer alatt elérhetı. A platformfüggı mőveletek egy egységes hordozható interfész mögé elrejthetık.

Hátrányok Sok alkalmazás nem igényel több szálat a futásához. Használjunk csak abból az egy szálból elérhetı adatot. Nehezíti a rendszer megértését. Megkövetel implementációs opciókat, mint például a paraméteres típusok. Más esetben kevésbé elegánsan és hatékonyan valósítható meg.

Felhasználás különbözı nyelvekben 1.2-es JDK-tól kezdve a Java támogatja a TLS mintát a java.lang.threadlocal osztályon keresztül. Egy példánya ennek az osztálynak egy szálspecifikus objektum proxy. ThreadLocal<Integer> local = new ThreadLocal<Integer>() { @Override protected Integer initialvalue() { return 1; } }; local.set( local.get()+1 );

Felhasználás különbözı nyelvekben Visual C++ Külön kulcsszóval támogatja: declspec(thread) int number; C# Attribútum alkalmazásával: class FooBar { [ThreadStatic] static int foo; }

Forrás Schmidt, Douglas C.; Michael Stal, Hans Rohnert, Frank Buschmann (2000). Pattern-Oriented Software Architecture, Volume 2: Patterns for Concurrent and Networked Objects. John Wiley & Sons. ISBN 0-471-60695-2. http://en.wikipedia.org/wiki/thread-specific_storage

Köszönöm a figyelmet!