Dağıtık Sistemler CS5001 Th. Letschert Çeviri: Turgay Akbaş TH Mittelhessen Gießen University of Applied Sciences İstemci-Sunucu Uygulamaları: Aktive Monitörler
Pasif monitörden(paylaşılan durum) aktif monitöre Monitör (Hoare, Brinch-Hansen, 1975) Bir monitör içinde süreçler tarafından ortak olarak kullanılan veri ve erişim protokollerinin(ya da metotların) birleştirildiği bir modül/nesnedir. Monitör = Senkronizasyon olarak sınıf tanımı Senkronize edilmiş giriş metotları ile kapsüllenmiş veri Senkronizasyon: Karşılıklı Hariç Tutma(Dışlama) Garantie edilen özel erişim (race conditions önler) Java: synchronized / Lock Durum(Şart) Senkronizasyonları Gerekli durumlar halinde erişimi garanti eder (conditional synchronisation) Java: wait/notify, Condition Monitörler pasif yapılardır Paylaşımlı bellek üzerine kurulmuşlardır. Aktif birimler(süreçler) isteklerini senkronize eden pasif kaynaklara erişirler. Seite 2
Pasif Monitör: Örnek Buffer Karşılıklı hariç tutma Aynı anda erişimler yasaklanmıştır Şartlı Senkronizasyon dolu buffer'a yazım, boş buffer'dan veri silme yoktur. monitor Buffer { Token place; boolean public class Buffer<TokenType> { TokenType place; boolean synchronized void put(tokentype t) throws InterruptedException { while (! empty ) wait(); place = t; notify(); // one call must not interfere with other calls // Pre: empty void put(token t) { place = t; // one call must not interfere with other calls // Pre: not empty Token get() { return place; synchronized TokenType get() throws InterruptedException { while ( empty ) wait(); notify(); return place; shared state Buffer: Konsept shared state Buffer: Gerçekleştirim Seite 3
Pasif Monitör: Örnek Buffer public class Main { static enum Token { PING, PONG ; static Buffer<Token> buffer = new Buffer<>(); public static void main(string[] args) { new Thread(new Runnable(){ // Producer public void run() { while (true) { try { buffer.put(token.ping); Thread.sleep(1000); System.out.println(buffer.get()); catch (InterruptedException e) { ).start(); pasif paylaşılan durumlu Buffer: Producer ve Consumer'lar kullanıcılardır. new Thread(new Runnable(){ // Consumer public void run() { while (true) { try { buffer.put(token.pong); Thread.sleep(1000); System.out.println(buffer.get()); catch (InterruptedException e) { ).start(); Seite 4
Pasif yerine aktif monitör: Senkronizasyon yerine iletişim Ortak durum mümkün değildir Süreçler ortak bir kaynağa ulaşamazlar. Ortak kaynak aşağıdaki özellikleri taşıyan bir sunucuya dönüştürülmelidir Kendine ait bir kontrol yapısı Istekleri mesajlar olarak alan ve işleyebilen Pasif yerine aktif monitör: Senkronizasyon yerine iletişim Prozesse ohne gemeinsamen Zustand haben nur Ortak bir kaynak olmadığı için senkronizasyon talimatları gereksizdir: Karşılıklı dışarıda bırakma üzerinde düşünmeye gerek yoktur. Ancak işlemlerin düzgün sırada gerçekleştirildiğinden emin olmak gerekir: Şartlı senkronizasyon devam eden bir konudur. Consumer Producer Producer Pasıf Buffer Seite 5 Aktif Buffer Consumer
Aktif Buffer Aktif monitör olarak Buffer: Mesaj işleme süreci passiv => aktiv geçiş stratejisi Senkron çağrı => Mesaj tipi, bir yanıt gönderme, alma wait => Mesajın kaydedilmesi Notify => Kayıt edilmiş mesajın işlenmesi Mesajları işle: Put-Mesajı gönder OK-Yanıt Get-Mesajı gönder Daten-Yanıt public class Buffer<TokenType> { TokenType place; boolean synchronized void put(tokentype t) throws InterruptedException { while (! empty ) wait(); place = t; notify(); synchronized TokenType get() throws InterruptedException { while ( empty ) wait(); notify(); return place; Put-Mesaj göndericisiyle birlikte kaydedildi gecikmiş Get-Mesajının işlenmesi Get-Mesajı göndericisiyle birlikte kaydedildi gecikmiş Put-Mesajı işlenmesi Seite 6
Aktif Buffer Aktif monitör olarak Buffer : Mesajları işleyen süreç (Pseudocode) process Buffer { Queue<PutMsg> pendingputs; Queue<GetMsg> pendinggets; Token place; boolean void processpendingget() { if (! pendinggets.empty) { getmsg, sender = pendinggets.remove() send DataMsg(place) to sender processpendingput(); void process(msg msg, sender) { case msg { PutMsg(item) => if (!empty) { pendingputs.enqueue(msg, sender) else { place = msg.item; send OK to sender; processpendingget(); void processpendingput() { if (! pendingputs.empty) { putmsg, sender = pendinggets.remove() send OKMsg to sender place = putmsg.item processpendingget(); GetMsg(item) => if (empty) { pendinggets.enqueue(msg, sender) else { send Data(place) to sender; processpendingput(); do (forever) { reveive msg from sender process(msg, sender) Seite 7
Aktif Buffer Aktif monitör olarak Buffer Veri-Bufferı Mesaj-Bufferı put get Producer Buffer Producer Consumer Seite 8 Buffer Consumer
Aktif Monitör: Özet Monitör aktif monitör ~> Sunucu süreci Monitör kullanıcısı ~> İstemci süreçleri pasif => aktif Monitör Sınıflar => Süreç Bir monitör prosedürünün çağırımı => Bir mesaj alınması Bir monitör prosedürünün gövdesi => Bir mesajın işlenmesi, göndericilere sonuçlar Karşılıklı dışarıda bırakmanın gerçekleştirimi tamamiyle sorunsuz: Ardışık sunucu süreci => kaynağa kesinlikle sıralı erişim Şartlı senkronizasyonun gerçekleştirimi Sunucu süreci(wait içinde) bloklanamaz wait ~> Mesajın kaydedilmesi / cevabın gecikmesi istemciyi bloklar notify ~> kayıt edilmiş mesajların işlenme fırsatları. Seite 9