1 Prof. Dr. Th. Letschert Çeviri: Turgay Akbaş FB MNI 16. Mai 2013 Alıştırmalar 2 - Dağıtık Sistemler Alıştırma 1 1. Neden dağıtık algoritmalar ardışık algoritmaların aksine her zaman literatürde bir modelin açıkça tanımı olarak tanımlanırlar? 2. Javada soket-gerçekleştirim modelinin aşağıdaki özelliklerini tanımlayınız. • Aktif birimler nelerdir? • İletişim senkronmudur yoksa asenkron mu? • İletişim kanalları nelerdir? FIFO özelliğini varmıdır? Kapasiteleri nedir? • Kanallarda hangi hata davranışları bulunmaktadır? • İşlemlerde hangi hata davranışları bulunmaktadır? • İşlemler(Activities) bir programlama dilinde(örn: Java) olaya-dayalı mı yoksa kontrole-dayalı olarak mı tanımlanırlar? • Deterministik olmayan yapılar varmıdır? 3. Asenkron iletişim kanallarına sahip dağıtık bir sistem semafor gibi davranmaktadır. Açıklayınız! 4. Aşağıda verilen özelliklere sahip programlar dağıtık programlarmıdır: • Bir makine üzerinde başlatılan ve soketler üzerinden iletişim kuran birden fazla java programı. • Bir makine üzerinde başlatılan ve RMI üzerinden iletişim kuran birden fazla java programı. • Bir makine üzerinde birden çok JVM tarafından çalıştırılan ve soketler üzerinden iletişim kuran programlar. • Bir makine üzerinde birden çok JVM tarafından çalıştırılan ve diğerleriyle RMI üzerinden iletişim kuran aynı java programı. • Bir makine üzerinde bir JVM tarafından birbirleriyle sadece soketler üzerinden iletişim kuran birden fazla Thread ile başlatılan bir program. • Bir makine üzerinde bir JVM tarafından birbirleriyle sadece Queue’lar üzerinden iletişim kuran birden fazla Thread ile başlatılan program. Alıştırma 2 Kontrole-dayalı gösterimde tanımlanmış: MAXLINE = 5 channel input(char), output(char[0..MAXLINE]); process CharToLine: char[] line; int i=0; do true : receive input( line[i] ) -> { do line[i] != CR && i < MAXLINE -> { i++; receive input( line[i] ); } od 2 send output(line); i = 0; } od process Source: int i = 0 char[] c = "a\n bcd\n efgh\n ijklmn\n opqrstu\n vw\n 123456789\n0" do true : send input(c[(i++) % c.size]) od process Sink: do line = receive output println(line) od 1. Bu gösterim dağıtık sistem, dağıtık uygulama, dağıtık program,dağıtık algoritma,... tanımlarından hangisidir? 2. Psedocode ile verilen tanımlamayı kolay bir yoldan java’da gerçekleştiriniz. Gerçekleştiriminizi test ediniz. 3. Gerçekleştirimin doğruluğu ve yeterliliğini tartışınız: Tanımlandığı gibi mi çalışıyor? Dil özelliklerinin gerçekleştirimini ve programın, özelliklerini dolaylı olarak kabul ettiği JRE’nin tutarlılığını düşününüz. İpucu Bir producer: package aufgabe_2; public class Source implements Runnable { Channel<Character> channel; protected Source(Channel<Character> channel) { this.channel = channel; } @Override public void run() { int i = 0; char[] c = {’a’,’\n’,’ ’,’b’,’c’,’d’,’\n’,’ ’,’e’,’f’,’g’,’h’,’\n’,’ ’, ’i’,’j’,’k’,’l’,’m’,’n’,’\n’,’ ’,’o’,’p’,’q’,’r’,’s’,’t’,’u’,’\n’,’ ’, ’v’,’w’,’\n’,’ ’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’\n’,’0’}; while (true) { channel.send(c[(i++) % c.length]); try { Thread.sleep(100); } catch (InterruptedException e) { // ignore } } } } Daha basit bir kanal aşağıda gösterildiği gibi gerçekleştirilebilir: package aufgabe_2; import java.util.concurrent.LinkedBlockingDeque; 3 public class Channel<T> { private LinkedBlockingDeque<T> mailbox = new LinkedBlockingDeque<>(); public void send(T v) { try { mailbox.put(v); } catch (InterruptedException e) { e.printStackTrace(); } } public T receive() { try { return mailbox.take(); } catch (InterruptedException e) { e.printStackTrace(); } return null; } } Alıştırma 3 Aşağıda pseudocode olarak verilen süreç tanımı hakkında düşününüz: channel in1(int), in2(int), out(int) process Merge: int v1, int v2 receive in1(v1) receive in2(v2) do v1 != EOF && v2 != EOF -> { if v1 <= v2 -> { send out(v1) receive in1(v1) } v2 <= v1 -> { send out(v2) receive in2(v2) } fi } v1 != EOF && v2 == EOF -> { send out(v1) receive in1(v1) } v1 == EOF && v2 != EOF -> { send out(v2) receive in2(v2) } od send out(EOF) 1. Gösterim olaya-dayalı ya da kontrole-dayalı bir gösterim midir? 4 2. Süreç ilişkileri nasıl tanımlanmıştır,kullanılmıştır: İletişim partnerlerinin doğrudan yönlendirildikleri port / kanal vb. unsurlar varmıdır? ... 3. Bu süreç tanımı bir dağıtık sistemin tanımlanmasında nasıl kullanılabilir? 4. Buna benzer bir sistemi kolay yoldan java’ da gerçekleştiriniz. İpucu Burada değerlerin iki sonlu dizileri karıştırılmalıdır. Bunun için bir sıranın sonunda iletişim mümkün olmalıdır. Bu işlem tipik olarak, kanal kapatılarak ve veriyi taşıyarak yapılır. Kapatılabilen kanalların gerçekleştirimi, kapatılamayan kanallara göre daha karmaşıktır. Verilen kod kapatılabilen bir kanal olarak kullanılabilir: package aufgabe_3; import import import import java.util.NoSuchElementException; java.util.concurrent.locks.Condition; java.util.concurrent.locks.Lock; java.util.concurrent.locks.ReentrantLock; /** * Closable blocking Channel. * * @author TLE * * @param <T> Type of elements. */ public class Channel<T> { // max capacity of a channel private static final int queueSize = 10; // global lock: lock for all channels private static final Lock globalLock = new ReentrantLock(); // condition: await that a message is available on any channel private static final Condition globalNotEmpty = globalLock.newCondition(); // condition: private final // condition: private final channel not full Condition notFull = globalLock.newCondition(); channel not empty Condition notEmpty = globalLock.newCondition(); @SuppressWarnings("unchecked") private final T[] items = (T[]) new Object[queueSize];// channel queue private int putptr; // channel management: where to put private int takeptr; // where to take private int count; // number of messages stored private boolean closed;// channel is closed /** * Send message to channel. * Blocking operation. Waits for storage if channel is full. * Writing to a closed channel is forbidden. * @param x the message * @throws InterruptedException IllegalStateException if the channel is closed * */ public void send(T x) throws InterruptedException { globalLock.lock(); if (closed) { throw new IllegalStateException("put on closed channel"); } try { 5 while (count == items.length) { notFull.await(); // wait for not full } if (closed) { throw new IllegalStateException("put on closed channel"); } items[putptr] = x; if (++putptr == items.length) putptr = 0; ++count; notEmpty.signal(); globalNotEmpty.signalAll(); } finally { globalLock.unlock(); } } /** * Get message from channel. * Blocking operations. Waits for message if none is available. * @return a message from channel * @throws InterruptedException NoSuchElementException if the channel has no elements and is closed * */ public T receive() throws InterruptedException { globalLock.lock(); try { while (count == 0) { if (closed) { throw new NoSuchElementException("take on closed channel"); } notEmpty.await(); } T x = items[takeptr]; if (++takeptr == items.length) takeptr = 0; --count; notFull.signal(); return x; } finally { globalLock.unlock(); } } /** * Close the channel. * Channels should be closed by the producer. * All receivers blocked on the channel will be informed. * Closed channels may not be reopened. */ public void close() { globalLock.lock(); try { closed = true; notFull.signalAll(); notEmpty.signalAll(); globalNotEmpty.signalAll(); } finally { globalLock.unlock(); } } public boolean eof() { return closed; } 6 } Alıştırma 4 Aşağıda verilen Dijkstra’nın pseudocode gösterimlerini açıklayınız ve java’da doğru gerçekleştirimlerini yapınız. 1. guarded if if guard1 -> Aktion1 guard2 -> Aktion2 .... fi 2. guarded do do guard1 -> Aktion1 guard2 -> Aktion2 .... od 3. guarded communication do guard1 : Comm1 -> Aktion1 guard2 : Comm2 -> Aktion2 .... od Alıştırma 5 1. Deterministik olmayan algoritmadan ne anlıyorsunuz? 2. Non-deterministlik, deterministik olmayan otomatalarda hangi amaca hizmet eder? 3. Deterministik olmayan bir otomatayı deterministik olmayan bir algoritmayla gerçekeştirmek gerekli, kullanışlı yoksa anlamsızmıdır? 4. Bir deterministik olmayan (mesaj) alma işlemini deterministik olmayan bir algoritmayla gerçekleştirmek gerekli, kullanışlı yoksa anlamsızmıdır? 5. asenkron modeldeki bir kontrole-dayalı süreç tanımında neden deterministik olmayan receive işlemi varken deterministik olmayan broadcasting işlemi yoktur? 6. Senkron modelde kontrole-dayalı süreç tanımı için kullanılan gösterimde neden deterministik olmayan receive işlemleri bulunmalıdır?