Title: Pattern Oriented Software Architecture
1Pattern Oriented Software Architecture
2Pattern Oriented Software Architecture
3Pattern Oriented Software Architecture
- Vol. 1 - A System of Patterns
- 2. Architectural Patterns
- 2.2 From Mud to Structure
- Layers, Pipes and Filters, Blackboard
- 2.3 Distributed Systems
- Broker
- 2.4 Interactive Systems
- Model-View-Controller, Present.-Abstraction-Contro
l - 2.5 Adaptable Systems
- Microkernel, Reflection
- 3. Design Patterns
- 3.2 Structural Decomposition
- Whole-Part
- 3.3 Organization of Work
- Master-Slave
- 3.4 Access Control
- Proxy
- Vol. 2 - Patterns for Concurrent and Networked
Objects - 2. Service Access and Configuration Patterns
- Wrapper Facade
- Component Configurator
- Interceptor
- Extension Interface
- 3. Event Handling Patterns
- Reactor
- Proactor
- Asynchronous Completion Token
- Acceptor-Connector
- 4. Synchronization Patterns
- Scoped Locking
- Strategized Locking
- Thread-Safe Interface
- 5. Concurrency Patterns
- Active Object
- Monitor Object
4Vol. 1 - A System of Patterns
52.4 Interaktivnà systémy2.5 Adaptovatelné systémy
Martin Berger
- Interaktivnà systémy
- Popis problému
- Vzor MVC
- Vzor PAC
- Adaptovatelné systémy
- Popis problému
- Vzor Microkernel
- Vzor Reflection
6Interaktivnà systémyVzory MVC a PAC
7Interaktivnà systémy popis problému
- ChovánĂ rĂzeno vstupy uĹľivatele
- GUI
- Webové aplikace
- Soucásti systému
- Funkcnà jádro
- PrezentacnĂ vrstva
- Vstupy uĹľivatele
- Požadované vlastnosti
- Nezávislost soucástĂ
- MoĹľnost pouĹľĂvánĂ ruznĂ˝ch front-endu
8MVC
- Model-View-Controller
- Model
- Data logika aplikace
- View
- Pohled na model prezentovanĂ˝ uĹľivateli
- Controller
- PrijĂmá vstupy uĹľivatele a zajištuje následnĂ©
zmeny v modelu a pohledech - Pri vytvárenà se všechny pohledy a controllery
zaregistrujĂ u modelu - NV Observer
9MVC chovánĂ
10MVC varianty, pouĹľitĂ
- Document view
- MFC
- Implementace MVC
- Java EE model, JavaServer Page, servlet
- Swing
- Spring MVC
- Zend Framework
- ASP.NET MVC Framework
11PAC
- Presentation-abstraction-control
- Stromová hierarchie kooperujĂcĂch agentu
- Prezentacnà a abstrakcnà cásti agentu zcela
oddelené - Abstrakcnà cást
- Data a aplikacnĂ logika
- Prezentacnà cást
- ZobrazenĂ dat uĹľivateli
- Controller
- Komunikace s ostatnĂmi agenty
- Komunikace prezentacnà a abstrakcnà cásti
- Zpracovánà vstupu uživatele
- PrĂklad rĂzenĂ letovĂ©ho provozu
Zdroj wikipedia
12PAC - vlastnosti
- Dynamická tvorba hierarchie
- DistribuovanĂ© prostredĂ
- Je treba najĂt kompromis mezi jemnostĂ
dekompozice systému a efektivitou komunikace mezi
agenty - Komunikace probĂhá jen s prĂmo propojenĂ˝mi agenty
- Ješte závaĹľnejšĂ, pokud jsou agenti distribuovanĂ
- V praxi se pouĹľĂvá mnohem mĂ©ne neĹľ napr. MVC
- Komplexita návrhu
- PrĂliš velká reĹľie spojená s komunikacĂ
- Drupal redakcnà systém
13Adaptovatelné systémyVzory Microkernel a
Reflection
14Adaptovatelné systémy popis problému
- SystĂ©my se obvykle v prubehu casu vyvĂjĂ
- Nová funkcionalita
- Podpora novejšĂch verzĂ OS
- Prechod na novou verzi GUI, knihoven,...
- Podpora nového hardwaru
- Ruzné požadavky uživatelu
- Požadované vlastnosti
- Relativne snadnĂ© modifikace a rozšĂrenĂ aplikace
- NeuvaĹľujeme modifikace základnĂho návrhu systĂ©mu
15Microkernel
- Použità zejména pro operacnà systémy
- Mikrojádro
- Základnà služby
- Komunikace
- Správa zdroju
- InternĂ server
- RozšĂrenĂ funkcionality mikrojádra
- Casto závislá na použitém HW
- ExternĂ server
- Konkrétnà prostredà pro klienty
- Abstrakce nad vrstvou mikrojádra a internĂch
serveru - Klient
- SvázanĂ˝ s konkrĂ©tnĂm externĂm serverem
- Adaptér
- Prenositelné rozhranà pro klienty
16Microkernel pouĹľitĂ, vĂ˝hody, nevĂ˝hody
- Operacnà systémy
- Windows NT
- Chorus
- Pridánà nové funkcionality
- InternĂ server
- Nový pohled na logiku implementovanou mikrojádrem
- ExternĂ server
- PouĹľitĂ v distribuovanĂ©m prostredĂ
- Nevýhody
- Komplexnà návrh aplikace
- Rychlost v porovnánàs monolitickými aplikacemi
17Reflection
- Idea programu umoĹľnĂme prĂstup ke svĂ© vlastnĂ
strukture - 2 vrstvy metavrstva a skutecnĂ˝ kĂłd aplikace
- Vrstva metaobjektu
- Aspekty systému, u kterých požadujeme možnost
zmeny - Strukturálnà metaobjekty
- FunkcnĂ metaobjekty
- Informace o stavu vrstvy s aplikacnĂm kĂłdem
- PrĂklady funkcionality poskytovanĂ© metavrstvou
- Typové informace
- VolacĂ konvence
- Vyhledávánà komponent systému
- Komunikace mezi komponentami systému
- TransakcnĂ protokoly
- Vrstva s aplikacnĂm kĂłdem
- VlastnĂ logika aplikace
- Cinnosti, u kterých predpokládáme možnost zmeny,
vykonává pomocà metavrstvy
18Reflection
- MOP metaobject protocol
- Provádà zmeny v metavrstve
- Poskytuje interface umoĹľnujĂcĂ vyvolánĂ zmen
- PrĂstupnĂ˝ aplikacnĂ vrstve a/nebo systĂ©movĂ©mu
administrátorovi - Modifikace nekterého aspektu aplikace
- Specifikace nového metaobjektu
- Ăšprava stávajĂcĂho metaobjektu
- Aktualizace v mĂstech pouĹľitĂ v metavrstve
- MuĹľe vyĹľadovat preloĹľenĂ/prilinkovánĂ k aplikaci
- Reflection výhody
- Pri zmenách nemenĂme kĂłd, pouze voláme metody MOP
- PouĹľĂvánĂ metod MOP je typicky snadnĂ©
- Reflection nevýhody
- Nutná podpora programovacĂho jazyka
- Nižšà efektivita
- Modifikace mohou bĂ˝t destruktivnĂ
193.3 Master-Slave3.4 Command processor3.5 View
handler
- Martin DobrouckĂ˝, 19.5.2010
20Master-Slave
- Ăšcel
- RozdelenĂ velkĂ© Ăşlohy na vĂce menšĂch podĂşloh a
vĂ˝pocet finálnĂho vĂ˝sledku - Definuje zpusob rozdelenĂ Ăşlohy, rozhranĂ pro
komponenty Master a Slave - Aplikace principu Rozdel a panuj
- Kategorie
- Organization of work Organizace práce
- VyuĹľitĂ
- ParalelnĂ programovánĂ
- Každá podúloha se vykoná paralelne jako
samostatné vlákno/program - Odolnost vuci chybám
- N-modular redundancy
- Struktura
- Podúlohy obvykle identické algoritmy
- Nekdy vhodnĂ© pouĹľĂt najednou ruznĂ© algoritmy,
které však rešà stejnou úlohu
21Master-Slave
- Struktura
- Návrh pouĹľitĂ
- Klient si vyžáda službu od mastera
- Master rozdelĂ Ăşlohu na podĂşlohy
- Master deleguje vykonánà podúloh na otroky,
spustà je a ceká na výsledky - Otroci vypoctou výsledky a odešlou je
- Master zpracuje obdržené výsledky od otroku do
finálnĂho vĂ˝sledku - Master odešle vĂ˝sledek klientovi
22Command processor
- Ăšcel
- ZapouzdrenĂ sloĹľitejšĂch Ăşkonu do jednoho
objektu, se kterým lze snadno pracovat - Kategorie
- Management zpracovánà objektu/služeb/komponent
obdobnĂ©ho druhu - SouvisejĂcĂ vzory
- Command processor stavĂ na vzoru Command
- NavĂc se stará i o správu command objektu
- Intepreter
- VyuĹľitĂ
- Tvorba flexibilnĂho UI
- Undo-Redo operace
23Command processor undo/redo
- Struktura
- Návrh pouĹľitĂ
- Controller dostane poĹľadavek na akci a k nemu
priradà konkrétnà Command - Controller predá objet Command na Command
processor - Command processor spustĂ Command a zaradĂ ho do
zásobnĂku provedenĂ˝ch akcĂ - Command se provede
- Klient zavolá prĂkaz Undo - Controller zavolá
Undo prĂmo na Command processoru
24View handler
- Ăšcel
- Poskytuje uživateli ruzné pohledy nad stejnými
daty - Úpravy, synchronizace a management jednotlivých
pohledu - Jednotlivé pohledy by na sobe mely být navzájem
nezávislé - Kategorie
- Management
- SouvisejĂcĂ vzory
- View handler je vlastne
- Abstract factory vytvárà pro klienta pohledy
- Mediator sám se stará o koordinaci mezi pohledy
- VyuĹľitĂ
- OddelenĂ prezentacnĂ vrstvy od funkcnĂ
- MVC
- TextovĂ˝ editor
- VĂce oken pro jeden dokument najednou
25View handler
- Struktura
- Kroky
- Klient požádá View handler o vytvorenà nového
pohledu - Viev handler inicializuje nový pohled a predá mu
jeho Supplier - NovĂ˝ pohled se zaradĂ do seznamu pohledu a otevre
ho - View nacte data ze svého Supplier a zobrazà je
- Opakuje pro dalšà pohledy
- Pohled pri každé zmene predá nová data pres
Supplier - Viev handler zavolá update pro všechny pohledy a
ty se aktualizujĂ
263.6 Komunikacnà návrhové vzory
Forwarder-Receiver Client-Dispatcher-Server Publi
sher-Subscriber
Michal Folk 1.5.2010
27Komunikacnà návrhové vzory
- CĂl prednášky
- ObeznámenĂ se skupinou komunikacnĂch NV
- Prezentace hlavnĂch myšlenek
- Motivace pro dalšà (samo)studium
- CĂlem nenĂ podrobnĂ˝ vĂ˝klad všech moĹľnostĂ a
implementace - Obsah
- PrĂklad
- Forwarder-Receiver
- Client-Dispatcher-Server
- Publisher-Subscriber
- Varianty
- ShrnutĂ
28Komunikacnà návrhové vzory
- PrĂklad
- SystĂ©m pro správu pocĂtacovĂ© sĂte
- Monitorovánà událostà a zdroju
- Konfigurace sĂte
- Peer to peer komunikace mezi uzly sĂte
- Podpora ruzného hardware
Zdroj PATTERN-ORIENTED SOFTWARE ARCHITECTURE, A
System of Patterns, p. 307
29Komunikacnà návrhové vzory
-
- Realizace
- VytvorenĂ agentu beĹľĂcĂch na uzlech v sĂti
- Low-level mezi-procesová (IPC) komunikace
- Efektivnejšà než high-level mechanizmy
- Problémy
- Závislost na OS
- Závislost na sĂtovĂ˝ch protokolech
- OmezenĂ prenositelnosti
- Omezená podpora heterogennĂch prostredĂ
- Pozdejšà zmena IPC mechanizmu
30Forwarder-Receiver
-
- RešenĂ
- Spolupráce mezi agenty
- Agent figuruje jako klient i jako server, nebo
oboje - Zapouzdrenà IPC mechanizmu do samostatných
komponent
PrijetĂ poĹľadavku
Odeslánà požadavku
Klient poĹľaduje sluĹľbu
Server poskytne žádanou službu
31Forwarder-Receiver
Poskytuje všeobecnĂ© rozhranĂ pro posĂlánĂ
zpráv Marshalling a dorucenĂ zpráv MapovánĂ
symbolických jmen na fyzické adresy
Poskytuje všeobecnĂ© rozhranĂ pro prijĂmanĂ
zpráv PrijĂmánĂ a unmarshalling zpráv
Poskytuje aplikacnĂ sluĹľby Komunikuje s ostatnĂmi
peer-mi
Zdroj PATTERN-ORIENTED SOFTWARE ARCHITECTURE, A
System of Patterns, p. 311
32Forwarder-Receiver
- Použità návrhového vzoru
- Kontext
- Peer to peer komunikace
- Rešený problém
- Vymenitelnost komunikacnĂho mechanizmu
- Spolupráce komponent na základe symbolických jmen
- Komunikace bez vlivu na výkon aplikace
- RešenĂ
- UkrytĂ komunikacnĂho mechanizmu mimo Peer-u
vytvorenĂ forwarder a receiver komponent - Dusledky pouĹľitĂ
- Efektivnà mezi-procesová komunikace
- ZapouzdrenĂ IPC prostredku
- Žádná podpora pro rekonfiguraci komponent
33Client-Dispatcher-Server
- ProblĂ©my se systĂ©mem pro správu pocĂtacovĂ© sĂte
- VyrešenĂ predcházejĂcĂch problĂ©mu
- Závislost na OS, omezená prenositelnost, zmena
IPC mechanizmu apod. - Zavlecenà nového problému
- ProblĂ©my s prizpusobenĂm se zmenám distribuce
Peer komponent za behu -
- RešenĂ
- VytvorenĂ mezivrstvy mezi komunikujĂcĂmi Peer-mi,
resp. mezi Forwarderem a Receiverem - Dispatcher komponenta
34Client-Dispatcher-Server
- Úlohy Dispatcher komponenty v systému pro správu
pocĂtacovĂ© sĂte - Implementace name service sluĹľby
- TransparentnĂ lokalizace Peer-u
- Jiné úlohy Dispatcher-a
- NavázánĂ spojenĂ, (od)registrace serveru a pod.
Client-Dispatcher-Server with communication
managed by clients
35Client-Dispatcher-Server
Implementuje systĂ©movĂ© Ăşlohy ZĂskává spojenĂ na
server od Dispatcher-a Vyvolává služby serveru
Vytvárà komunikacnà kanál mezi klientem a
serverem Lokalizuje server Registruje
server Odregistruje server Udržuje databázi
fyzických adres serveru
Poskytuje sluĹľby klientum Registruje se u
Dispatcher-a
Zdroj PATTERN-ORIENTED SOFTWARE ARCHITECTURE, A
System of Patterns, p. 326
36Client-Dispatcher-Server
- Použità návrhového vzoru
- Kontext
- SystĂ©m integrujĂcĂ mnoĹľinu distribuovanĂ˝ch
serveru - Rešený problém
- PouĹľitĂ sluĹľeb bez závislosti od jejich umĂstnenĂ
- OddelenĂ implementace konzumenta sluĹľby od
navazovánĂ spojenĂ se sluĹľbou - RešenĂ
- VytvorenĂ vrstvy mezi klientem a serverem
poskytujĂcĂ transparentnĂ vyhledávánĂ sluĹľeb a
navazovánà spojenà - Odkazovánà se na server podle jména
- Dusledky pouĹľitĂ
- Vymenitelnost serveru, transparentnĂ umĂstnenĂ a
presun serveru, rekonfigurace, odolnost vuci
poruchám, neefektivnĂ navazovánĂ spojenĂ,
citlivost na zmeny dispatcher-a
37Publisher-Subscriber
- Aliasy
- Observer, Dependents
- Soucást základnĂch návrhovĂ˝ch vzoru (behavioral
patterns) - PripomenutĂ
- Odstranenà tesné vazby
- One to many závislost
- Subject (Publisher),Observer (Subscriber)
- Notifikace,aktualizace
Zdroj MFF UK, predmet Návrhové vzory, prezentace
Obeserver pattern, Miroslav Baron
38Publisher-Subscriber
-
- Varianty
- Gatekeeper
- Distribuované systémy
- Vzdálená notifikace
- Event Channel
- Distribuované systémy
- Silné oddelenà Publisher-a a Subscriber-a
- Kanál pro zachycenà událostà mezi Publisher-om a
Subscriber-om, Proxy Publisher/Subscriber - Producer-Consumer
- OddelenĂ Producer-a a Consumer-a vyrovnávacĂ
pametĂ - Obvykle vztah 11
39Komunikacnà návrhové vzory
-
- ShrnutĂ
- Forwarder-Receiver
- Transparentnà mezi-procesová komunikace
- Peer to peer model
- OddelenĂ Peer-u od komunikacnĂch mechanizmu
- Client-Dispatcher-Server
- Zavádà vrstvu mezi klientem a serverem
Dispatcher - Transparentnà vyhledávánà serveru podle jmen
- NavazovánĂ spojenĂ
- Publisher-Subscriber
- UdrĹľuje stav spolupracujĂcĂch komponent
synchronizovaný - Jednosmerná propagace zmen
40Vol. 2 - Concurrent and Networked Objects
412. Service access and configuration patterns
Dalibor FrĂvaldskĂ˝
- Wrapper facade
- Component configurator
- Interceptor
- Extension interface
42Wrapper facade
- Fasáda zakrývá ( komplexnà ) vztahy mezi objekty
- Wrapper fasáda zakrĂ˝vá nĂzkoĂşrovnová rozhranĂ
- Low-level API
- NĂzká Ăşroven abstrakce
- Nekompatibilita mezi platformami
- NárocnĂ© na uĹľĂvánĂ
- Náchylné na chyby
43Abstrakce, zapouzdrenĂ, sjednocenĂ
- Zvýšit úroven abstrakce
- Funkce prevĂ©st na trĂdy a rozhranĂ
- Jednotné rozhranà na všech platformách
- ZadnĂ dvĂrka
44Jak na to
- Seskupit funkce pracujĂcĂ se stejnĂ˝mi datovĂ˝mi
strukturami - Identifikovat prunik funkcionalit na
podporovanĂ˝ch platformách - Skupiny pruniky trĂdy wrapper fasády
- Ponechat prĂstup k nĂzkorĂşrovnovĂ˝m datovĂ˝m
strukturám (handle, ukazatel)
45Component configurator
- Motivace konfigurovatelnost aplikace za jejĂho
behu - Statická logika aplikacĂ
- Zmena implementace znamená rekompilaci celého
programu - Zmena konfigurace znamená restart celé aplikace
- Ruzná prostredà ruzné konfigurace
46Komponenta s ĹľivotnĂm cyklem
- VyuĹľitĂ sluĹľeb OS nebo runtime platformy
- Umožnenà dynamického pripojenà komponent k
aplikaci - Komponenta s ĹľivotnĂm cyklem inicializace,
zastavenĂ, opetovnĂ© spuštenĂ, deinicializace - Zmena stavu komponenty neovlivnĂ celou aplikaci
47Jak na to
- Vytvorit rozhranĂ pro pripojenĂ komponent
- Repozitár komponent udržuje jejich seznam
- Konfigurátor správa ĹľivotnĂho cyklu
- Nárocné na implementaci
- ExistujĂcĂ rešenĂ
- OSGi framework ( základ Eclipse )
- Windows NT service control manager
48Interceptor
- Motivace rozširitelnost systému o nové služby
- Neznalost všech potreb klienta v dobe vývoje
- RešenĂ
- MonolitickĂ˝ systĂ©m obsahujĂcĂ vše
- Úplná otevrenost systému
- Nevýhody
- VelkĂ© a neflexibilnĂ
- Nebezpecné
49Události a callbacky
- Pridávánà služeb do systému na presne urcených
mĂstech - MĂsto událost ( prĂjem zprávy, spracovánĂ
dotazu, ) - SluĹľba callback ( logovánĂ, kryptovánĂ, )
- CástecnĂ© otevrenĂ a zprĂstupnenĂ vnitrnĂ
funkcionality systému
50Jak na to
- Zmena systému na stavový automat
- Prechod mezi stavy potenciálnĂ mĂsto pro
událost - DefinovánĂ rozhranĂ pro callback zpracovánĂ
události - Vytvorenà kontextu pro událost
- Informace o události
- Modifikovánà chovánà systému
- Vztah událost callback je 1 ku n
- EJB, CORBA components, COM ( proxy varianta )
51Extension interface
- Motivace evoluce rozhranĂ komponent
- V pocátcĂch vĂ˝voje teĹľkĂ© predpovedet, jak a kam
se systĂ©m rozroste - PridávánĂ funkcionalit prehuštenĂ rozhranĂ
metodami - Težké udržovat zpetnou kompatibilitu
52Mám vĂce tvárĂ
- CĂl rozdelit jedno velkĂ© rozhranĂ na vĂcero
malých - Jedna komponenta implementuje nekolik rozhranà (
tvárĂ ) - VĂ˝ber rozhranĂ pro prĂstup ke komponente je na
uĹľivateli - JednotnĂ˝ prĂstup ke všem rozhranĂm
53Jak na to
- Vytvorit jedno základnà všeobecné ( root )
rozhranà - Implementuje každá komponenta
- Poskytuje prĂstup k ostatnĂm rozhranĂm
- Muže obsahovat spolecnou funkcionalitu všech
komponent - Každé rozhranà má jedinecný identifikátor a
rozširuje root rozhranĂ - Komponenta implemetuje všechna rozhranĂ, která
podporuje - Klient nemá prĂmĂ˝ prĂstup ke komponente
- COM, CORBA component model
543. Event Handling Patterns
55Ăšvod
- Ăšcel
- PoskytujĂ zpusob jak inicializovat, prijmout,
demultiplexovat, dispatchovat a spracovat
události (eventy) v sĂtove orientovanĂ˝ch
systĂ©mech - SouvisejĂcĂ návrhovĂ© vzory
- Reactor, Proactor, Asynchronous Completion Token
a Acceptor-Connector
56Reactor - Ăşvodem
- Také známý jako Dispatcher nebo Notifier
- ArchitekturálnĂ návrhovĂ˝ vzor poskytujĂcĂ
event-driven aplikacĂm vyvolávat poĹľadavky
jednoho ci vĂce klientu podle Hollywood principu - Dont call us, well call you
- Jeho Ăşkolem je prevzĂt veškerou zodpovednost za
požadavky odeslané klienty a prevést je na
požadované služby tak, aby se aplikace už
nemusela o nic starat
57Reactor - MotivacnĂ prĂklad
- DistribucnĂ logovacĂ sluĹľba
- Máme aplikaci, která potrebuje pravidelne ukládat
svuj soucasný stav na server v distribuovaném
systému. - Logovacà služba má za úkol tyto data uložit do
databáze (nebo vytisknout) - Klient muže vyvolat pouze dve události
- Connect žádost o pripojenà k serveru
- Read žádost o prectenà logu
- HloupĂ© rešenĂ
- Vytvorit pro každé pripojenà nové vlákno
- Problémy
- NeefektivnĂ, neškálovatelnĂ© nelze menit kontext
- Vyžaduje složitou správu vláken
- Vlákna nejsou podporována na všech systémech
58Reactor - Myšlenka
- Vytvorenà event-driven aplikace, která bude
schopná prijĂmat vĂce poĹľadavku zároven a bude je
schopna je postupne synchronne spracovat. - Problémy
- SluĹľba musĂ bĂ˝t schopna spracovat vĂce poĹľadavku
najednou - Každý z požadavku je oznacen identifikátorem
události a služba musà být schopna tento
poĹľadavek demultiplexovat a vyvolat adekvátnĂ
událost - RešenĂ
- Synchronne cekat na prĂchozĂ poĹľadavky
- Integrovat demultiplexor a dispatcher jako
sluĹľby, kterĂ© se starajĂ o poĹľadavky - Oddelit dispatcher a demultiplexor od aplikacnĂ
logiky
59Reactor - Struktura
60Reactor - PrĂklad ze Ĺľivota
- TelefonnĂ linka
- TelefonnĂ sĂt je Reactor.
- Vy jste event handler registrovanĂ˝ telefonnĂm
cĂslem (handle). - Pokud se vás nekdo pokoušà dovolat, telefonnĂ sĂt
vás na hovor upozornĂ zvonenĂm a vy tuto událost
spracujete tĂm, Ĺľe zvednete telefon.
61Proactor - Ăşvodem
- Architekturálnà návrhový vzor, který dokáže
efektivne demultiplexovat a dispatchovat
poĹľadavky sluĹľby spouštenĂ© dokoncenĂm
asynchronnĂch operacĂ, aby tak dosáhl vyššĂch
výkonu a soubežnosti - Jeho aplikacnà komponenty (klient, completion
handlers) jsou proaktivnĂ
62Proactor - MotivacnĂ prĂklad
- WebServer
- pokud si uživatel chce zobrazit webovou stránku,
musĂ dojĂt k následujĂcĂm událostem - ProhlĂĹľec naváže spojenĂ se serverem a zašle
poĹľadavek GET - Server obdržà událost s žádostĂ o pripojenĂ,
prijme spojenĂ a precte si poĹľadavek - Server otevre a precte poĹľadovanĂ˝ soubor
- Server odešle obsah souboru zpet prohlĂĹľeci a
uzavre spojenĂ - HloupĂ© rešenĂ
- PouĹľĂt návrhovĂ˝ vzor Reactor
- Problémy
- Nedostatecne škálovatelnĂ˝ pro velkĂ© mnoĹľstvĂ
soucasne pripojených uživatelu - Uživatelé by museli cekat než by na ne došla rada
63Proactor - Myšlenka
- Event-driven aplikace schopná prijĂmat a
spracovávat požadavky asynchronne - Problémy
- Po dokoncenĂ asynchronnĂho spracovávánĂ poĹľadavku
musĂ bĂ˝t vĂ˝sledek spracován pomocĂ dalšĂch
prĂslušnĂ˝ch událostĂ - RešenĂ
- RozdelenĂ aplikacnĂch sluĹľeb na dve cásti
- DlouhotrvajĂcĂ operace
- Completion handlery
- Completion handler se stará o spracovánà vysledku
dlouhotrvajĂcĂch operacĂ po jejich dokoncenĂ
64Proactor - Struktura
65Proactor PrĂklad ze Ĺľivota
- Upozornenà neprijatých hovoru
- Pokud zavolám kamarádovi, který je momentálne
nedostupnĂ˝, ale vĂm, Ĺľe pokud uvidĂ upozornenĂ,
tak zavolá zpet. V tomto prĂpade jsem initiator,
kterĂ˝ poĹľaduje asynchronnĂ operaci na
asynchronous operation processoru (telefon mého
kamaráda). MezitĂm neĹľ se kamarád ozve si muĹľe
zatĂm procvicovat návrhovĂ© vzory. TĂm Ĺľe si
kamarád precte upozornenà neprijatých hovoru a
zavolá mi zpet se chová jako proactor a tĂm Ĺľe
ten telefon zvednu se chovám jako completion
handler, který práve spracovává callback.
66Asynchronous Completion Token (ACT)
- Dalšà názvy Active Demultiplexing, Magic Cookie
- UmoĹľnuje aplikaci efektivne demultiplexovat a
spracovat asynchronnà operace závislé na službách
aplikace
67ACT MotivacnĂ prĂklad
- Rozsáhlý internetový burzovnà systém
- Nutnost kontroly, aby veškeré aktivity byly
provádeny bezchybne chyba muže znamenat ušlý
zisk a zpusobit žaloby - Vytvárenà management agentu, kterà delajà analýzy
a snažà se detekovat možné chyby - Techto agentu mužou být stovky a na každý z nich
muĹľe bĂ˝t zachyceno hned nekolik událostĂ, kterĂ©
majĂ informovat administrátory. NavĂc kaĹľdá z
techto událostà muže být vyhodnocena jiným
zpusobem.
68ACT - Myšlenka
- Evet-driven systém, ve kterém aplikace
asynchronne vyvolajá službu a následne se
spracuje vĂ˝sledek tĂ©to sluĹľby prirazenou akcĂ. - ProblĂ©my
- Pokud se vyšle poĹľadavek na vĂce asynchronnĂch
sluĹľeb najednou, tak sluĹľby nemusĂ vedet kterĂ˝
handler na kterĂ˝ poĹľadavek pouĹľĂt - Po spracovánĂ sluĹľby by mela aplikace strávit co
nejmĂ©ne casu zjištovánĂm co s vĂ˝sledkem udelat - RešenĂ
- S kaĹľdou asynchronnĂ sluĹľbou, kterou initiator
vyvolá zároven pošle informaci, která
identifikuje jak by mel initiator spracovat
výsledek použité služby. - Po skoncenà operace se tato informaci vratà zpet
initiatorovi , tak aby mohla být efektivne
pouĹľita k demultiplexovanĂ odpovedi.
69ACT - Struktura
70ACT PrĂklad ze Ĺľivota
- FeDex
- Tato poštovnà služba má možnost odeslánà úctu po
uspešnĂ©m dorucenĂ balĂcku, ve kterĂ©m je volnĂ©
pole, do kterĂ©ho si mohl odesĂlatel pred
odeslánĂm balĂku napsat libovolnou hodnotu napr.
vlastnĂ identifikátor balĂku, nebo odkaz na dalšĂ
operace, kterĂ© je po dorucenĂ balĂku nutno udelat.
71Acceptor-Connector
- Oddeluje pripojenĂ a inicializaci
spolupracujĂcĂch peer sluĹľeb v sĂtove
orientovaném systému od spracovávánà provádené
temito peer sluĹľbami po jejich pripojenĂ a
inicializaci
72Acceptor-Connector MotivacnĂ prĂklad
- Rozsáhlá distribucnĂ aplikace monitorujĂcĂ a
kontrolujĂcĂ shlukovánĂ satelitu. - Takováto sĂt se typicky skládá z multi-service
brány na aplikacnĂm levelu, která prepojuje
posĂlánĂ dat mezi ruznĂ˝mi peery - Aplikace pouĹľĂvá TCP-IP protokol s tĂm, Ĺľe
jednotlivĂ© porty poskytujĂ ruznĂ© sluĹľby - SluĹľby by meli mĂt pres bránu následujĂcĂ
moĹľnosti - Aktivne vytvorit spojenĂ
- Pasivne prijĂmat spojenĂ od jinĂ˝ch peeru
- Chovat se ruzne za danĂ˝ch situacĂch
73Acceptor-Connector Myšlenka
- SĂtove zaloĹľenĂ˝ systĂ©m nebo aplikace, ve kterĂ©
jsou connection-oriented protokoly pouĹľity ke
komunikaci mezi peery. SluĹľby techto peeru jsou
propojeny transportnĂmi koncovĂ˝mi body. - ProblĂ©my
- Aplikace v sĂtove orientovanĂ˝ch systĂ©mech typicky
obsahujà velké množstvà kódu na konfiguraci
pripojenĂ a inicializaci sluĹľeb. Tento kĂłd je
casto nezávislý spracovávánà služeb pro presun
dat. SeskupovánĂ konfiguracnĂho kĂłdu s aplikacnĂm
kódem muže vést k problémum.
74Acceptor-Connector - RešenĂ
- RozdelenĂ pripojujĂcĂch a inicializacnĂch sluĹľeb
od ostatnĂch sluĹľeb peeru - ZapouzdrenĂ aplikacnĂch sluĹľeb pomocĂ peer
service handleru - VytvorenĂ acceptor factory
- VytvorenĂ connector factory
75Acceptor-Connector - Struktura
76Acceptor-Connector PrĂklad ze Ĺľivota
- Manažeri a sekretárky
- Manažer se chce spojit s jiným manažerem, tak
požádá svou sekretárku, aby za nej uskutecnila
hovor. Sekretárka zavolá druhému manažerovi, ale
na telefon odpovà jiná sekretárka. Sekretárka,
která hovor uskutecnila by byla v tomto prĂpade
connector a sekretárka, která hovor prijala by
byla acceptor. JednotlivĂ˝ manaĹľeri by byli peer
service handlers.
774. Synchronization Patterns
78Scoped Locking
- Jaký má úcel?
- Zajištuje zamknutà zámku pred vstupem do kritické
sekce a jeho uvolnenà po opuštenà této sekce
- ModernĂ programovacĂ jazyky uĹľ majĂ tento koncept
prĂmo jako jazykovĂ˝ konstrukt
// C int foo() lock.acquire() // do
critical // stuff lock.release()
return 0
// Java int foo() synchronized
(lockObject) // do critical //
stuff return 0
// C int foo() lock (lockObject)
// do critical // stuff
return 0
JakĂ˝ je mezi temito kĂłdy rozdĂl?
79Scoped Locking
// C int foo(int bar) lock.acquire()
// do critical // stuff if (bar 42)
return -1 // do another //
critical // stuff lock.release()
return 0
// Java int foo(int bar) synchronized
(lockObject) // do critical //
stuff if (bar 42) return -1 // do
another // critical // stuff return 0
// C int foo(int bar) lock (lockObject)
// do critical // stuff if (bar
42) return -1 // do another //
critical // stuff return 0
- ProblĂ©my s rucnĂm zamykánĂm a odemykánĂm
- Ne vždy programátor promyslà všechny možné toky
rĂzenĂ (control flow) programu - Duplikuje se kĂłd
Programátor zapomnel, že se nacházà v kritické
sekci zámek zustal zamknut i po jejĂm opuštenĂ
- RešenĂ
- Odemykat zámek automaticky, jakmile tok rĂzenĂ
opustĂ kritickĂ˝ blok
80Scoped locking - implementace
- Co se v C deje automaticky na konci bloku ci
pri vyvolávánĂ vĂ˝jimky? - VolajĂ se destruktory lokálnĂch promennĂ˝ch toho
muĹľeme vyuĹľĂt
class MutexGuard public MutexGuard(Lock
lock) _lock(lock)
_lock-gtlock() MutexGuard()
_lock-gtunlock() private Lock
_lock MutexGuard(const MutexGuard )
void operator (const MutexGuard )
MutexGuard je zkonstruován na zácátku
synchronizovaného bloku (kritické sekce), uvolnen
je pak uĹľ automaticky
int foo(int bar) // do non-critical stuff
MutexGuard guard(lock) // do
critical stuff if (bar 42)
return -1 // another
critical stuff // another non-critical
stuff return 0
Chceme zabránit kopĂrovánĂ a prirazovánĂ
MutexGuardu
81Scoped Locking - poznámky
- ExplicitnĂ odemykánĂ
- acquire() zamkne zámek, pokud je odemcený a
zapĂše si, Ĺľe nynĂ byl zamknut - release() uvolnuje zámek jen v prĂpade, Ĺľe je
zamcený, a zaznamená, že zámek byl odemcen - konstruktor volá acquire(), destruktor release()
- prĂznak uzamknutĂ se vyplatĂ i v prĂpade, Ĺľe
zamykánà zámku muže selhat - programátor proto nesmà volat metody zámku
prĂmo!!! - ProblĂ©my
- deadlock pri rekurzivnĂm volánĂ metody (bez
rekurzivnĂho mutexu) - rešà pattern Thread-safe Interface
- nezvládne systémové veci (abort threadu uvnitr
kritické sekce) ani Cckové longjmp() - kompiler vypisuje varovánà ohledne nepoužité
lokálnà promenné - použijeme makro, které neco udelá
- PouĹľitĂ
- všechny vetšà ucelené knihovny (Boost,
Threads.h, ACE)
- SouvisejĂcĂ vzory
- Strategized Locking (modularita), Thread-safe
Interface (rekurze)
82Strategized Locking
- Motivace
- chceme mĂt jednovláknovou verzi systĂ©mu, která se
nezpomaluje zamykánĂm, a vĂcevláknovou verzi,
která zamyká kritické sekce - multiplatformnà prostredàs ruznými
synchronizacnĂmi primitivy - chceme se vyhnout duplikaci kĂłdu
- Zpusoby parametrizace
- polymorfismus konkrétnà primitiva jsou známa až
za behu - templates konkrétnà primitiva známá už behem
kompilace
- Realizace
- navrhneme abstraktnĂ rozhranĂ, kterĂ© bude systĂ©m
pouĹľĂvat - je vhodnĂ© pouĹľĂt Guard (Scoped Locking pattern)
83Strategized locking - polymorfismus
class AbstractLock public void lock()
0 void unlock() 0 class
Guard private AbstractLock
_lock public Guard(AbstractLock lock)
_lock(lock)
_lock-gtlock() Guard()
_lock-gtunlock()
class MutexLock public AbstractLock private
Mutex _mutex public MutexLock(Mutex
mutex) _mutex(mutex) /
override / void lock()
_mutex-gtacquire() / override / void
unlock() _mutex-gtrelease()
class NullLock public AbstractLock public
NullLock() / override / void
lock() / override / void unlock()
84Strategized locking - templates
Nekteré prekladace umožnujà defaultnà template
argumenty, v tom prĂpade je vhodnĂ© nastavit je na
nejpravdepodobnejšà prĂpad
class MutexLock private Mutex
_mutex public MutexLock(Mutex mutex)
_mutex(mutex) void lock()
_mutex-gtacquire() void
unlock() _mutex-gtrelease()
class NullLock public NullLock()
void lock() void unlock()
template class Guardltclass LOCKgt private
LOCK _lock public Guard(LOCK lock)
_lock(lock) _lock-gtlock()
Guard() _lock-gtunlock()
85Strategized locking hybridnĂ varianta
- Varianty
- pokud nekdy vĂme typ uĹľ behem kompilace a nekdy
ne, muĹľeme zvolit hybrid
class AbstractPolymorficLock public void
lock() 0 void unlock() 0 class
PolymorficMutexLock public
AbstractPolymorficLock private Mutex
_mutex public PolymorficMutexLock(Mutex
mutex) _mutex(mutex)
/ override / void lock()
_mutex-gtacquire() / override / void
unlock() _mutex-gtrelease()
template class Guardltclass LOCKgt private
LOCK _lock public Guard(LOCK lock)
_lock(lock) _lock-gtlock()
Guard() _lock-gtunlock()
PolymorficMutexLock lock ... GuardltAbstractPol
ymorficLockgt guard(lock)
86Strategized locking - shrnutĂ
- Výhody
- flexibilita a snadná rozširitelnost
- jednoduššà údržba, nenà duplicitnà kód
- nezávislost a opetovná použitelnost (reusability)
- Problémy
- pri pouĹľitĂ templates prĂliš vyniká strategie
zámku - nekdy aĹľ prĂliš flexibilnĂ nezkušenĂ˝
programátor muže omylem zvolit nevhodné
synchronizacnĂ primitivum
- PouĹľitĂ
- v jazycĂch jako C ci Java jsme omezeni na
polymorfismus - Adaptive Communication Environment (ACE)
opensource framework pro sĂtovĂ© a distribuovanĂ©
aplikace - ATL (COM objekty)
- kernel operacnĂho systĂ©mu Dynix/PTX
- Windows HAL.dll ruzné spinlocky podle poctu
procesoru
87Thread-safe Interface
- Motivace
- nemáme reentrantnà zámky a synchronizované metody
volajà jiné (synchronizované) metody téhož
objektu - s reentrantnĂmi zámky zpusobuje zamykánĂ prĂliš
velkĂ˝ overhead
class HashMap private Lock
_lock public void insert(int key, int
value) Guard guard(_lock) if
(value lt 0) return
if (this-gtget(key) -1) // do
insert int get(int key)
Guard guard(_lock) // pick up
return value
Pri volánà synchronizované metody se zamceným
zámkem nastane deadlock
- RešenĂ
- verejnĂ© metody POUZE zamykajĂ a volajĂ vnitrnĂ
metody - vnitrnĂ metody NIKDY nezamykajĂ
88Thread-safe Interface - implementace
class HashMap private Lock
_lock public void insert(int key, int
value) Guard guard(_lock) if
(value lt 0) return
this-gt_insert(key, value) int
get(int key) Guard guard(_lock)
return this-gt_get(key) private void
_insert(int key, int value) if
(this-gt_get(key) -1) // do
insert int _get(int key)
// pick up value return value
Vnejšà metody jsou synchronizované
Vnejšà metoda volá vnitrnà metodu - OK
Vnitrnà metoda volá vnitrnà metodu OK, deadlock
nemuĹľe nastat
89Thread-safe Interface - varianty
- Thread-safe Facade
- Thread-safe Interface pro celý systém komponent
- je treba refaktorovat systém, jinak nested
monitor lockout - Thread-safe Wrapper
- pro trĂdy, kterĂ© nepocĂtajĂ s multithreadingem
- verejnĂ© metody zamknou zámek, zavolajĂ
implementaci a opet uvolnĂ - prĂklad java.util.Collections.getSynchronizedMap()
90Thread-safe Interface - shrnutĂ
- Výhody
- robustnost snĂĹľenĂ© nebezpecĂ self-deadlocku
- snĂĹľenĂ overheadu
- zjednodušenà oddelenà logiky od potreby
synchronizace - Problémy
- zvýšenà poctu metod
- deadlocku se Ăşplne nevyhneme pri volánĂ dalšĂho
objektu (muže volat zpet) - volánà privátnà metody na jiném objektu téže
trĂdy - pevná granularita zámku (per objekt)
- SouvisejĂcĂ vzory
- Decorator transparentne pridává funkcionalitu
- Scoped Locking, Strategized Locking
91Double-checked locking
- Motivace
- nejaká cást kódu musà být provedena nanejvýš
jednou behem behu programu - uĹľ jsme videli u Singletonu
NenĂ thread-safe
ZbytecnĂ˝ overhead kvuli zamykánĂ
class Singleton private static Singleton
_instance NULL public static
getInstance() if (instance
NULL) _instance
new Singleton() return
_instance
class Singleton private static Singleton
_instance NULL static Lock
_lock public static getInstance()
Guard guard(_lock) if (_instance
NULL) _instance new
Singleton() return instance
92Double-checked locking
- Problémy
- kompiler muĹľe prohodit poradĂ instrukcĂ
- cache procesoru na nekterých platformách nejsou
transparentnà (Intel Itaniu, COMPAQ Alpha) - prirazenà pointeru nenà atomické
class Singleton private static Singleton
_instance NULL static Lock
_lock public static getInstance()
if (_instance NULL)
Guard guard(_lock) if (_instance
NULL) _instance
new Singleton()
return instance
- RešenĂ
- MSVC volatile keyword nebo _ReadWriteBarrier()
- GCC asm volatile ("""memory") nebo
__sync_synchronize() - ICC __memory_barrier() nebo __sync_synchronize()
93Double-checked locking C, Java
// C public class Singleton private static
volatile Singleton instance
private static object syncRoot
new Object() private Singleton()
public static Singleton Instance get
if (instance null)
lock (syncRoot)
if (instance null)
instance new
Singleton()
return instance
// Java version 5.0 and higher class Singleton
private static volatile Singleton
instance null private
Singleton() public static Singleton
getInstance() Singleton
result instance if (result null)
synchronized(this)
result instance if (result
null) instance
result new Singleton()
return result
94Rešenà pomocà thread-local promenné
public class Singleton private static object
syncRoot new Object() private static
Singleton globalInstance null
ThreadStaticAttribute private static
Singleton threadLocalInstance null private
Singleton() public static Singleton
Instance get if
(threadLocalInstance null)
lock (syncRoot)
if (globalInstance null)
globalInstance new Singleton()
threadLocalInstance
globalInstance
return threadLocalInstance
Promenná soukromá pro každé vlákno
PrĂstup k datum spolecnĂ˝m pro všechna vlákna je
synchronizován
955. Concurrency Patterns
BohumĂr ZámecnĂk
96Concurrency
- Concurrency
- vĂce procesu bežà soucasne
- duvody
- vyššà výkon
- mĂ©ne cekánĂ
- vyuĹľitĂ paralelnĂho hardwaru vĂc procesoru ci
jader - zdroje problému
- sdĂlenĂ zdroju mezi procesy
- nedeterminismus
KdyĹľ si nedáme pozor, muĹľe dojĂt k poškozenĂ dat
ci deadlocku!
97Možné rešenà Concurrency Patterns
- Active Object
- Monitor Object
- Half-Sync/Half-Async
- Leader/Followers
- Thread-Specific Storage
- Pattern-Oriented Software Architecture
- Patterns for Concurrent and Networked Objects,
Volume 2 - Douglas Schmidt, Michael Stal, Hans Rohnert and
Frank Buschmann - John Wiley Sons, 2000
- kapitola 5 Concurrency Patterns
98Klasifikace Concurrency Patterns
- Design Patterns
- Active Object
- Monitor Object
- Thread-Specific Storage
- Architectural Patterns
- Half-Sync/Half-Async
- Leader/Followers
99Active Object
100Active Object návrhový vzor
- Kontext
- vĂce klientu bežà v samostatnĂ˝ch vláknech a
pristupuje ke sdĂlenĂ©mu objektu - Ăšcel
- zjednodušit soubeĹľnĂ© prĂstupy k objektu, kterĂ˝
Ĺľije ve vlastnĂm vlákne - oddelit volánĂ metody na tomto objektu od jejĂho
vykonánĂ - PrĂklad komunikacnĂ brána
- procesy ze dvou komponent chtejĂmezi sebou
komunikovat, alenechtejĂ bĂ˝t na sobe prĂmo
závislé
Active Object An Object Behavioral Pattern for
Concurrent Programming, R. Greg Lavender, Douglas
C. Schmidt
101Active Object problémy
- Problémy
- nechceme, aby nárocnejšà metody blokovaly celý
systĂ©m - synchronizovanĂ˝ prĂstup ke sdĂlenĂ˝m objektum musĂ
bĂ˝t transparentnĂ - chceme vyuĹľĂt paralelnĂ hardware vĂce jader a
procesoru - chceme, aby celý systém byl škálovatelný
- RešenĂ
OddelĂme volánĂ metody od jejĂho vykonánĂ!
102Active Object struktura
103Active Object dynamickĂ© chovánĂ
Active Object An Object Behavioral Pattern for
Concurrent Programming, R. Greg Lavender, Douglas
C. Schmidt
104Active Object varianty
- VĂce rolĂ
- ruzná rozhranĂ pro vĂce druhu klientu, vĂc
rozširitelné - Integrovaný Scheduler
- práci Proxy a Servanta delá Scheduler
- jednodušà implementace, hur znovupoužitelné
- Predávánà zpráv
- logika Proxy a Servanta mimo Active Object
- vĂc práce pro programátory aplikace, vĂc chyb
- Volánà metod s casovým limitem
- Polymorfnà návratová hodnota (Future)
- DistribuovanĂ˝ Active Object
- rozdelenĂ Proxy na Stub a Skeleton
- podobnĂ˝ je vzor Broker, ale ten pracuje s mnoha
Servanty - Active Object s Thread Poolem Servantu
- lepšà paralelismus, muže být nutné synchronizovat
105Active Object prĂklady pouĹľitĂ
- Komunikacnà brána
- Casovac v Jave
- java.util.Timer a java.util.TimerTask
- zjednodušený Active Object
- PrĂklad ze Ĺľivota restaurace
- Client zákaznĂk
- Proxy cĂšnĂci a servĂrky
- Scheduler šéfkuchar
- Servant kuchar
- Activation Queue seznam jĂdel k prĂprave
106Active Object souvislosti
- Method Request
- je moĹľno povaĹľovat za instaci vzoru Command
- Activation Queue
- muže být implementována s pomocà vzoru Robust
Iterator - Scheduler
- je instancĂ vzoru Command Processor
- pro vĂce plánovacĂch politik je moĹľno pouĹľĂt
Strategy - Future
- muže být implementována pomocà vzoru Counted
Pointer
107Active Object shrnutĂ
- Výhody
- volánĂ a vykonávánĂ metod probĂhá v ruznĂ˝ch
vláknech - zjednodušenà složité synchronizace
- metody se vykonávajĂ v jinĂ©m poradĂ, neĹľ byly
volány - ruznĂ© strategie pro plánovánĂ poradĂ
- je moĹľnĂ© rozšĂrit pro distribuovanĂ© pouĹľitĂ
- Nevýhody
- reĹľie
- prepĂnánĂ kontextu
- synchronizace
- kopĂrovánĂ dat
- složitejšà plánovánà v Scheduleru
- sloĹľitĂ© debugovánĂ
- Kdy je Active Object vhodnĂ˝?
- pri práci s relativne velkými objekty
- jinak pouĹľĂt spĂš Monitor Object
108Monitor Object
Theodore Norvell, http//en.wikipedia.org/wiki/Fil
eMonitor_28synchronization29-SU.png
109Monitor Object návrhový vzor
- Kontext
- vĂce vláken volá soucasne metody na stejnĂ©m
objektu - objekt sám žádnĂ© vlákno nemá (je pasivnĂ)
- volánĂ metody probĂhá ve klientove vlákne
- Ăšcel
- serializovat soubežné volánà metod na objektu
- tĂm vynutit, aby s objektem pracovala vĹľdy nejvýš
jedna metodav jedinĂ©m vlákne - PrĂklad
- komunikacnà brána ze vzoru Active Object
- pro malé objekty muže být overhead Active Objectu
prĂliš velkĂ˝ - sloĹľitá plánovacĂ strategie nemusĂ bĂ˝t potreba
110Monitor Object problémy
- Problémy
- soucasné volánà metod objektu muže poškodit jeho
vnitrnĂ stav - race conditions
- podobne jako interface je nutné definovat
synchronizacnĂ hranice - chceme transparentnĂ synchronizaci
- aby klient nemusel pouĹľĂvat low-level primitiva
- má-li metoda blokovat, musà se dobrovolne vzdát
rĂzenĂ - ochrana proti deadlocku a zbytecnĂ©mu cekánĂ
- pred uspánĂm a probuzenĂm musĂ bĂ˝t objekt v
korektnĂm stavu
111Monitor Object struktura
112Monitor Object dynamickĂ© chovánĂ
Monitor Object An Object Behavioral Pattern for
Concurrent Programming, Douglas C. Schmidt
113Monitor Object varianty
- Timed Synchronized Method Invocations
- casovĂ˝ limit na cekánĂ
- Strategized Locking
- flexibilnĂ konfigurace zámku a podmĂnek
- Multiple Roles
- objekt implementuje vĂce rolĂ pro ruznĂ© skupiny
klientu - klient vidĂ z objektu jen specifickĂ© rozhranĂ
- lepšà rozširitelnost
114Monitor Object prĂklady
- Dijkstra Monitor, Hoare Monitor
- Monitory na objektech v Jave
- PrĂklad ze Ĺľivota fast food restaurace
Java
Hoare Monitor
115Monitor Object shrnutĂ
- Výhody
- jednoduchĂ© rĂzenĂ konkurence
- jednoduššà plánovánĂ, kde se majĂ metody
vykonávat - kooperativnĂ plánovánĂ
- pouĹľitĂ podmĂnek
- Nevýhody
- omezená škálovatelnost
- sloĹľitá zmena synchronizacnĂch mechanizmu a
politik - tesná vazba mezi funkcnostà a logikou
synchronizace a plánovánĂ - nelze znovu pouĹľĂt implementaci s jinĂ˝mi
synchronizacnĂmi mechanizmy - problĂ©my s vnorovánĂm Nested Monitor Lockout
116Active Object vs. Monitor Object
- Monitor Object a Active Object delajĂ podobne
veci, ale trochu se lišà - Active Object
- sloĹľitejšĂ
- metody bežà v jiném vlákne než klient
- sofistikovanejšĂ, ale dražšà vykonávánĂ a prĂjem
novĂ˝ch poĹľadavku - kvuli vetšà reĹľii se hodĂ spĂš na vetšà objekty
- asynchronnĂ zĂskánĂ vĂ˝sledku
- lépe rozširitelný
- Monitor Object
- jednoduššĂ
- metody bežà ve vlákne klienta
- menšà režie, hodà se i na menšà objekty
- tesnejšà vazba mezi funkcionalitou a
synchronizacnĂ logikou
117Half-Sync/Half-Async
http//homes.bio.psu.edu/people/faculty/bshapiro/s
piral-clock.jpg
118Half-Sync/Half-Async architektonickĂ˝ vzor
- Kontext
- vĂcevláknovĂ˝ systĂ©m s komunikacĂ synchronnĂch a
asynchronnĂch sluĹľeb - Ăšcel
- zjednodušit použità takových služeb bez ztráty
vĂ˝konnosti - PrĂklad
- sĂtovánĂ v BSD UNIXu
Half Sync/Half Async, Douglas C. Schmidt, 1998
119Half-Sync/Half-Async problémy
- Problémy
- synchronnà zpracovánà služeb
- jednoduššà programovánĂ, ale muĹľe dlouho blokovat
- typicky high-level sluĹľby
- asynchronnà zpracovánà služeb
- sloĹľitejšà programovánĂ, moĹľnost vyššĂho vĂ˝konu
- nekdy je vynuceno prĂmo hardwarem
- typicky low-level sluĹľby
- tyto sluĹľby spolu potrebujĂ komunikovat
- jak to vše skloubit?
120Half-Sync/Half-Async struktura
- RešenĂ
- rozdelit systĂ©m na synchronnĂ a asynchronnĂ
vrstvu - mezi ne vloĹľit komunikacnĂ mezivrstvu s frontou
Half Sync/Half Async, Douglas C. Schmidt, 1998
121Half-Sync/Half-Async dynamickĂ© chovánĂ
Half Sync/Half Async, Douglas C. Schmidt, 1998
122Half-Sync/Half-Async varianty
- Varianty
- AsynchronnĂ rĂzenĂ, synchronnĂ data
- Half-Async/Half-Async
- asynchronnĂ zpracovánĂ je prĂstupnĂ© i pro
high-level sluĹľby - Half-Sync/Half-Sync
- synchronnà zpracovánà i pro low-level služby
- vĂce vláken v jádre OS
- prĂklady Mach, Solaris
- Half-Sync/Half-Reactive
- v objektove orientovaných systémech
- sloĹľenĂ vzoru Reactor a Active Object s thread
poolem - asynchronnĂ vrstva Reactor
- mezivrstva Activation Queue
- synchronnĂ vrstva Servant
- Souvislosti
- vrstvenĂ v Half-Sync/Half-Async je prĂkladem
vzoru Layers
123Half-Sync/Half-Async prĂklad
PrĂklad z BSD UNIXu
Sync TELNETDProcess
Sync HTTPDProcess
Sync FTPDProcess
SynchronnousService Layer
1 read(data)
4 sbwait()
read()
2 soreceive()
soreceive()
Queueing Layer
put to sleep
awake
sbwait()
sowakeup()
Socket Queues
3, 8 dequeue(data)
7 sowakeup()
AsynchronnousService Layer
Async TCP/IPProtocol Processing
EthernetNetwork Interface
5 interrupt
6 enqueue(data)
Pattern-Oriented Software Architecture Patterns
for Concurrent and Networked Objects, Volume 2,
D. Schmidt, M. Stal, H. Rohnert and F. Buschmann,
Wiley, 2000
124Half-Sync/Half-Async shrnutĂ
- Princip
- oddelenĂ synchronnĂch a asynchronnĂch sluĹľeb do
dvou vrstev - Výhody
- jednoduššà programovánĂ synchronnĂch sluĹľeb pri
zachovánà výkonnosti