Bölüm 5: Süreç Senkronizasyonu

Benzer belgeler
İşletim Sistemleri. Hazırlayan: M. Ali Akcayol Gazi Üniversitesi Bilgisayar Mühendisliği Bölümü

Bölüm 6: İşlem Senkronizasyonu (1) Operating System Concepts with Java 8 th Edition

YZM 3102 İşletim Sistemleri

YZM 3102 İşletim Sistemleri

YZM 3102 İşletim Sistemleri Uygulama

İşletim Sistemleri (Operating Systems)

İşletim Sistemlerine Giriş

Bölüm 6: İşlem Senkronizasyonu (2) Operating System Concepts with Java 8 th Edition

Bölüm 7: Kilitlenme (Deadlocks)

Prosesler Arası Haberleşme ve Senkronizasyon

Multicore/Multithread Programlama

Bölüm 4: Threads (İş Parçaları)

Bölüm 13: Giriş-Çıkış (I/O) Sistemleri

Bölüm 5: İşlemci Zamanlaması. Operating System Concepts with Java 8 th Edition

ve Senkronizasyon Senkronizasyon Eş Zamanlılık Sorunlar Sorunlar Çözüm Örnek

CENG/BILM 341 FINAL REVIEW. Dr. Esma Yıldırım

İŞLETİM SİSTEMLERİ DÖNEMİÇİ SINAVI

İŞLETİM SİSTEMLERİ. (Operating Systems)

REALTIME LINUX. 3. Linux ve Özgür Yazılım Şenliği Murat Demirten, 16 Mayıs 2004, Ankara

Bilgisayar İşletim Sistemleri BLG 312

Dağıtık Sistemler CS5001

YZM 3102 İşletim Sistemleri

Bölüm 7: Kilitlenmeler. Operating System Concepts with Java 8 th Edition

İşletim Sistemlerine Giriş

YZM 3102 İşletim Sistemleri

BM-311 Bilgisayar Mimarisi. Hazırlayan: M.Ali Akcayol Gazi Üniversitesi Bilgisayar Mühendisliği Bölümü

Bölüm 8: Ana Bellek. Operating System Concepts with Java 8 th Edition

İş Parçacıkları (Threads)

İşletim Sistemleri. Hazırlayan: M. Ali Akcayol Gazi Üniversitesi Bilgisayar Mühendisliği Bölümü

İşletim Sistemleri. Hazırlayan: M. Ali Akcayol Gazi Üniversitesi Bilgisayar Mühendisliği Bölümü

BM-311 Bilgisayar Mimarisi

YZM 2116 Veri Yapıları

Görsel Programlama DERS 11. Görsel Programlama - Ders11/ 1

Montoya

Dağıtık Sistemler CS5001

İşletim Sistemleri. Hazırlayan: M. Ali Akcayol Gazi Üniversitesi Bilgisayar Mühendisliği Bölümü

Bilgi ve İletişim Teknolojileri (JFM 102) Ders 10. LINUX OS (Programlama) BİLGİ & İLETİŞİM TEKNOLOJİLERİ GENEL BAKIŞ

İşlem Yönetimi (Process Management)

YZM 3102 İşletim Sistemleri

İşletim Sistemleri (Operating Systems)

YZM 2116 Veri Yapıları

Proses. Prosesler 2. İşletim Sistemleri

PROSESLER. Proses. Proses

Bölüm 4: İş Parçacıkları. Operating System Concepts with Java 8 th Edition

Komutların Yürütülmesi

Bölüm 9. Altprogramlar ISBN

Nesne Yönelimli Programlama

Ders Adı Kodu Yarıyılı T+U Saati Ulusal Kredisi AKTS

İşletim Sistemlerine Giriş

Bölüm 8. İfade Seviyesindeki Kontrol Yapıları ISBN

Giriş. geleneksel işletim sistemlerinde her prosesin. aynı adres uzayında birden fazla akış kontrolü gerekebilir

Bölüm 9: Sanal Bellek

Alıştırma 1: Yineleme

Windows'da çalışırken pek çok durumda bir işe başlamadan önce işletim sisteminin o işe ilişkin bilgileri depolayacağı bir alan yaratması gerekir.

Multithreading & Asynchronous Programlama

İşletim Sistemleri. Hazırlayan: M. Ali Akcayol Gazi Üniversitesi Bilgisayar Mühendisliği Bölümü

ALGORİTMA VE PROGRAMLAMA II

EM205 26/9/2014. Programlamaya giriş Algoritmalar. Amaçlar

Tarih Saat Modül Adı Öğretim Üyesi. 01/05/2018 Salı 3 Bilgisayar Bilimlerine Giriş Doç. Dr. Hacer Karacan

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

BM-311 Bilgisayar Mimarisi

PROGRAMLAMAYA GİRİŞ. Öğr. Gör. Ayhan KOÇ. Kaynak: Algoritma Geliştirme ve Programlamaya Giriş, Dr. Fahri VATANSEVER, Seçkin Yay.

Alıştırmalar 2 - Dağıtık Sistemler. Alıştırma 2. Prof. Dr. Th. Letschert Çeviri: Turgay Akbaş FB MNI 16. Mai 2013

ALGORİTMA VE PROGRAMLAMA I

DOSYA ORGANİZASYONU. Sıralı erişimli dosya organizasyonu yöntemleri ÖZLEM AYDIN TRAKYA ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

PROCESS YARATIMI (TEKRAR):

PROGRAMLAMAYA GİRİŞ DERS 2

DÖNGÜLER BMÜ-111 ALGORİTMA VE PROGRAMLAMA-I YRD. DOÇ. DR. İLHAN AYDIN

Bilgisayar İşletim Sistemleri BLG 312

Görevler Arası Zamanuyumlama

İşletim Sistemleri-II

ALGORİTMA VE PROGRAMLAMA I

İşletim Sistemleri. Dr. Binnur Kurt Omega Eğitim ve Danışmanlık İşletim Sistemleri

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

Java da Program Denetimi ve Operatörler

Yrd. Doç. Dr. Caner ÖZCAN

Bölüm 4: İş Parçacıkları. Operating System Concepts with Java 8 th Edition

BIL1202 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ

Bölüm 3: İşlemler Operating System Concepts with Java 8th Edition 3.1 Silberschatz, Galvin and Gagne 2009

Bölüm 3: İşlemler Operating System Concepts with Java 8th Edition 3.1 Silberschatz, Galvin and Gagne 2009

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 2

İŞ SIRALAMA. İş Sıralamanın Amaçları. İş Sıralama Türleri - 1. İş Sıralama. İş Sıralama Türleri - 2

BM-311 Bilgisayar Mimarisi

Önemli noktalar. Paradigma Nesnelere Giriş Mesajlar / Ara bağlantılar Bilgi Gizleme (Information Hiding ) Sınıflar(Classes) Kalıtım/Inheritance

C Dersi Bölüm 1. Bilgisayar Donanımı

Göstericiler (Pointers)

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Yrd. Doç. Dr. Caner ÖZCAN

10/17/2007 Nesneye Yonelik Programlama 3.1

Görsel Programlama DERS 01. Görsel Programlama - Ders01/ 1

İş Parçacıkları Thread(s)

VERİ YAPILARI DERS NOTLARI BÖLÜM 5 QUEUE (KUYRUK) Yard. Doç. Dr. Deniz KILINÇ

BİLGİSAYAR MİMARİSİ. Bilgisayar Bileşenleri Ve Programların Yürütülmesi. Özer Çelik Matematik-Bilgisayar Bölümü

YMT219 VERİ YAPILARI ÖDEV-1

İşletim Sistemlerine Genel Bakış

YZM 2116 Veri Yapıları

Giriş. İplik Modeli. geleneksel işletim sistemlerinde her prosesin özel adres uzayı ve tek akış kontrolü var.

Linux Assembly Programlamaya Giriş

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

1 PROGRAMLAMAYA GİRİŞ

Transkript:

Bölüm 5: Süreç Senkronizasyonu Mehmet Demirci tarafından çevrilmiştir. Silberschatz, Galvin and Gagne 2013

Bölüm 5: Süreç Senkronizasyonu Giriş Kritik bölüm problemi Peterson ın Çözümü Senkronizasyon Donanımı Mutex Kilitleri Semaforlar Klasik Senkronizasyon Problemleri İzleyiciler Senkronizasyon Örnekleri Alternatif Yaklaşımlar 5.2 Silberschatz, Galvin and Gagne 2013

Hedefler Süreç senkronizasyonu kavramına giriş Paylaşılan verinin tutarlılığına ilişkin kritik bölüm problemine giriş Kritik bölüm problemine yazılım ve donanım çözümleri sunmak Klasik süreç senkronizasyonu problemlerini incelemek Süreç senkronizasyonu problemlerini çözmekte kullanılan araçları incelemek 5.3 Silberschatz, Galvin and Gagne 2013

Giriş Süreçler eşzamanlı olarak yürütülebilir. Herhangi bir anda kesilebilirler, yürütülme yarım kalabilir. Paylaşılan veriye eşzamanlı erişim veri tutarsızlığına yol açabilir. Veri tutarlılığını ve işbirliği yapan süreçlerin sıralı yürütülmesini sağlamak için mekanizmalar gereklidir. 5.4 Silberschatz, Galvin and Gagne 2013

Giriş Üretici-tüketici problemi için bütün buffer ları dolduran bir çözüm istiyoruz. Bunu yapmak için bir sayaçla dolu buffer sayısını takip edebiliriz. Sayaç 0 dan başlar ve üretici tarafından arttırılır, tüketici tarafından azaltılır. 5.5 Silberschatz, Galvin and Gagne 2013

Üretici while (true) { /* produce an item in next produced */ } while (counter == BUFFER_SIZE) ; /* do nothing */ buffer[in] = next_produced; in = (in + 1) % BUFFER_SIZE; counter++; 5.6 Silberschatz, Galvin and Gagne 2013

Tüketici while (true) { while (counter == 0) ; /* do nothing */ next_consumed = buffer[out]; out = (out + 1) % BUFFER_SIZE; counter--; /* consume the item in next consumed */ } 5.7 Silberschatz, Galvin and Gagne 2013

Yarış Durumu counter++ farklı şekillerde gerçekleştirilebilir: register1 = counter register1 = register1 + 1 counter = register1 counter-- farklı şekillerde gerçekleştirilebilir: register2 = counter register2 = register2-1 counter = register2 count = 5 durumundan başlayan örnek yürütme: S0: producer execute register1 = counter {register1 = 5} S1: producer execute register1 = register1 + 1 {register1 = 6} S2: consumer execute register2 = counter {register2 = 5} S3: consumer execute register2 = register2 1 {register2 = 4} S4: producer execute counter = register1 {counter = 6 } S5: consumer execute counter = register2 {counter = 4} 5.8 Silberschatz, Galvin and Gagne 2013

Kritik Bölüm Problemi n süreçli {p 0, p 1, p n-1 } bir sistem düşünün. Her sürecin kritik bölüm denen bir kod parçası var Süreç ortak değişkenleri değiştiriyor, tablo güncelliyor, dosyaya yazıyor vs. olabilir. Bir süreç kendi kritik bölümündeyken başka hiçbir süreç kritik bölümde olamaz. Kritik bölüm problemi bu durumu çözmek için protokol geliştirmeyi hedefler. Her süreç kritik bölüme girmek için izin istemeli (entry section giriş bölümü), daha sonra çıkış bölümü - exit section bulunabilir, daha sonra kalan bölüm - remainder section 5.9 Silberschatz, Galvin and Gagne 2013

Kritik Bölüm P i sürecinin genel yapısı 5.10 Silberschatz, Galvin and Gagne 2013

P i Sürecinin Algoritması do { while (turn == j); critical section turn = j; remainder section } while (true); 5.11 Silberschatz, Galvin and Gagne 2013

Kritik Bölüm Problemine Çözüm 1. Karşılıklı Dışlama (Mutual Exclusion) - Eğer P i süreci kritik bölümündeyse, başka bir süreç kritik bölümde olamaz. 2. İlerleme Eğer hiçbir süreç kritik bölümde değilse ve kritik bölüme girmek isteyen süreçler varsa, kritik bölüme girecek sonraki sürecin seçimi süresiz ertelenemez. 3. Sınırlı Bekleme (Bounded Waiting) Bir sürecin kritik bölüme girme isteği yapmasından bu isteğin yerine getirilmesine kadarki sürede diğer süreçlerin kendi kritik bölümlerine kaç kere girebilecekleri sınırlanmış olmalıdır. Her sürecin sıfır olmayan bir hızda yürütüldüğü varsayılır. n sürecin göreceli hızları hakkında varsayım yapılmaz. 5.12 Silberschatz, Galvin and Gagne 2013

OS içinde Kritik Bölüm Yönetimi İki yaklaşım Preemptive çekirdek modundaki süreçlerin boşa çıkarılmasına izin verir Non-preemptive çekirdek modundan çıkana kadar çalışır, engeller, veya CPU yu kendisi verir. Çekirdek modunda yarış durumları oluşmaz. 5.13 Silberschatz, Galvin and Gagne 2013

Peterson Çözümü İki süreç için çözüm load ve store makine dili komutlarının atomik olduğunu, yani kesilemeyeceklerini varsayalım. Süreçler iki değişken paylaşır: int turn; Boolean flag[2] turn değişkeni kritik bölüme girme sırasının kimde olduğunu gösterir. flag dizisi bir sürecin kritik sürece girmeye hazır olup olmadığını gösterir. flag[i] = true ise P i hazırdır. 5.14 Silberschatz, Galvin and Gagne 2013

P i Sürecinin Algoritması do { flag[i] = true; turn = j; while (flag[j] && turn == j); critical section flag[i] = false; remainder section } while (true); 5.15 Silberschatz, Galvin and Gagne 2013

Peterson Çözümü Üç kritik bölüm gereksiniminin karşılandığı ispatlanabilir: 1. Karşılıklı dışlama korunur. P i kritik bölüme ancak şu koşulda girer: flag[j] == false veya turn == i 2. Süreç ilerlemesi sağlanır. 3. Sınırlı bekleme gereksinimi karşılanır. 5.16 Silberschatz, Galvin and Gagne 2013

Senkronizasyon Donanımı Birçok sistemde kritik bölüm kodunun gerçekleştirimini destekleyen donanım vardır. Bundan sonra açıklanacak bütün çözümler locking (kiliteme) fikrine dayalıdır. Kritik bölümler kilitlerle korunur. Tekli işlemciler kesmeleri devre dışı bırakabilir. Çalışan kod preemption olmadan yürütülür. Çok işlemcili sistemlerde verimsizdir. Modern makineler özel atomik donanım komutları sunar. Atomic = kesilemez Ya bellek kelimesini sına (test) ve değerini değiştir (set). Veya iki bellek kelimesinin değerlerini değiş-tokuş et (swap). 5.17 Silberschatz, Galvin and Gagne 2013

Kritik Bölüm Problemine Kilitlerle Çözüm do { acquire lock critical section release lock remainder section } while (TRUE); 5.18 Silberschatz, Galvin and Gagne 2013

test_and_set Komutu Tanım: boolean test_and_set (boolean *target) { boolean rv = *target; *target = TRUE; return rv: } 1. Otomatik olarak yürütülür. 2. Verilen parametrenin orijinal değerini döndürür. 3. Verilen parametrenin yeni değerini TRUE olarak değiştirir. 5.19 Silberschatz, Galvin and Gagne 2013

test_and_set() Kullanan Çözüm Paylaşılan boolean değişken - lock, ilk değeri FALSE Çözüm: do { while (test_and_set(&lock)) ; /* do nothing */ lock = false; } while (true); /* critical section */ /* remainder section */ 5.20 Silberschatz, Galvin and Gagne 2013

compare_and_swap Komutu Tanım: int compare _and_swap(int *value, int expected, int new_value) { int temp = *value; if (*value == expected) *value = new_value; return temp; } 1. Otomatik olarak yürütülür. 2. Verilen value parametresinin orijinal değerini döndürür. 3. Ancak value == expected ise, value parametresine verilen new_value parametresinin değerini yaz. Değiş-tokuş için yukarıdaki eşitlik şarttır. 5.21 Silberschatz, Galvin and Gagne 2013

compare_and_swap Kullanan Çözüm Paylaşılan tamsayı lock ilk değeri 0 Çözüm: do { while (compare_and_swap(&lock, 0, 1)!= 0) ; /* do nothing */ /* critical section */ lock = 0; /* remainder section */ } while (true); 5.22 Silberschatz, Galvin and Gagne 2013

test_and_set ile Sınırlı Beklemeli Karşılıklı Dışlama do { waiting[i] = true; key = true; while (waiting[i] && key) key = test_and_set(&lock); waiting[i] = false; /* critical section */ j = (i + 1) % n; while ((j!= i) &&!waiting[j]) j = (j + 1) % n; if (j == i) else lock = false; waiting[j] = false; /* remainder section */ } while (true); 5.23 Silberschatz, Galvin and Gagne 2013

Mutex Kilitleri Bundan önce sunulan donanım çözümleri karmaşıktır ve genelde uygulama programcılarının kullanımına açık değildir. OS tasarımcıları kritik bölüm problemini çözmek için yazılım araçları geliştirirler. En basiti mutex kilididir. Kritik bölümü korumak için önce kilit acquire() ile alınır, sonra release() ile bırakılır. Kilidin alınabilir olup olmadığını bir boolean değişken belirler. acquire() ve release() çağrıları atomik olmalıdır. Çoğunlukla donanımdaki atomik komutlarla gerçekleştirilirler. Fakat bu çözüm busy waiting (meşgul bekleme) gerektirir. 5.24 Silberschatz, Galvin and Gagne 2013

acquire() ve release() acquire() { while (!available) } ; /* busy wait */ available = false;; release() { } do { available = true; acquire lock critical section release lock remainder section } while (true); 5.25 Silberschatz, Galvin and Gagne 2013

Semafor Süreçlerin senkronize olması için mutex kilitlerinden daha ileri yöntemler sunan senkronizasyon aracı Semafor S tamsayı değişken Sadece iki bölünemez (atomik) işlem ile erişilebilir. wait() ve signal() Eski isimleri P() ve V() wait() işlemi wait(s) { } while (S <= 0) S--; ; // busy wait signal() işlemi signal(s) { } S++; 5.26 Silberschatz, Galvin and Gagne 2013

Semafor Kullanımı Sayan semafor sınırsız tamsayı değer İkili semafor sadece 0 veya 1 olabilen tamsayı değer mutex kilidi ile aynı Çeşitli senkronizasyon problemlerini çözebilir. P 1 ve P 2 süreçlerinde S 1 olayı S 2 den önce gerçekleşmek zorunda olsun. synch semaforu oluştur ve 0 yap. P1: S 1 ; signal(synch); P2: wait(synch); S 2 ; Sayan semafor S ikili semafor olarak gerçekleştirilebilir. 5.27 Silberschatz, Galvin and Gagne 2013

Semafor Gerçekleştirimi Aynı semafor üzerinde aynı anda iki sürecin wait() ve signal() yürütememesi garantilenmelidir. wait ve signal kodunun kritik bölüme koyulduğu bir kritik bölüm problemine dönüştü. Şimdi kritik bölüm gerçekleştiriminde meşgul bekleme bulunabilir. Ama kod kısa Kritik bölüm nadiren doluysa meşgul bekleme azdır. Uygulamalar kritik bölümlerde uzun zaman harcayabilir, dolayısıyla bu iyi bir çözüm değildir. 5.28 Silberschatz, Galvin and Gagne 2013

Meşgul Beklemesiz Semafor Gerçekleştirimi Her semafor için bir bekleme kuyruğu bulunur. Kuyruktaki her girdi iki tür veri tutar: değer (tamsayı) bir sonraki kayda pointer İki işlem: block (engelle) işlemi çağıran süreci uygun bekleme kuyruğuna yerleştir. wakeup (uyan) bekleme kuyruğundaki süreçlerden birini oradan çıkarıp hazır kuyruğuna yerleştir. typedef struct{ int value; struct process *list; } semaphore; 5.29 Silberschatz, Galvin and Gagne 2013

Meşgul Beklemesiz Semafor Gerçekleştirimi wait(semaphore *S) { } S->value--; if (S->value < 0) { add this process to S->list; } block(); signal(semaphore *S) { } S->value++; if (S->value <= 0) { remove a process P from S->list; } wakeup(p); 5.30 Silberschatz, Galvin and Gagne 2013

Deadlock and Starvation Deadlock (kilitlenme) iki veya daha fazla sürecin yalnızca içlerinden birinin sebep olabileceği bir olayı süresiz beklemesi S ve Q semafor, ilk değerleri 1 P 0 P 1 wait(s); wait(q); wait(q); wait(s);...... signal(s); signal(q); signal(q); signal(s); Starvation (açlık) süresiz engelleme Sürecin askıda beklediği semafor kuyruğundan hiç çıkamaması Priority Inversion (önceliğin ters dönmesi) düşük öncelikli sürecin elindeki bir kilide yüksek öncelikli sürecin ihtiyaç duyması Çözüm için priority-inheritance (öncelik kalıtım) protocol 5.31 Silberschatz, Galvin and Gagne 2013

Klasik Senkronizasyon Problemleri Önerilen yeni senkronizasyon yöntemlerini sınamak için kullanılan klasik problemler: Bounded-Buffer (Sınırlı Arabellek) Problemi Readers and Writers (Okurlar ve Yazarlar) Problemi Dining-Philosophers (Yemek Yiyen Felsefeciler) Problemi 5.32 Silberschatz, Galvin and Gagne 2013

Sınırlı Arabellek Problemi n arabellek, her biri bir item tutabilir. mutex semaforunun ilk değeri 1 full semaforunun ilk değeri 0 empty semaforunun ilk değeri n 5.33 Silberschatz, Galvin and Gagne 2013

Sınırlı Arabellek Problemi Üretici sürecin yapısı do {... /* produce an item in next_produced */... wait(empty); wait(mutex);... /* add next produced to the buffer */... signal(mutex); signal(full); } while (true); 5.34 Silberschatz, Galvin and Gagne 2013

Sınırlı Arabellek Problemi Tüketici sürecin yapısı Do { wait(full); wait(mutex);... /* remove an item from buffer to next_consumed */... signal(mutex); signal(empty);... /* consume the item in next consumed */... } while (true); 5.35 Silberschatz, Galvin and Gagne 2013

Okurlar Yazarlar Problemi Eşzamanlı süreçler arasında paylaşılan veri kümesi Okurlar yalnızca okuyabilir; güncelleme yapamazlar Yazarlar hem okuyup hem yazabilir Problem birden fazla okurun aynı anda okumasına izin verme Bir anda sadece bir yazar veriye erişebilir Paylaşılan veri Veri kümesi rw_mutex semaforunun ilk değeri 1 mutex semaforunun ilk değeri 1 read_count semaforunun ilk değeri 0 5.36 Silberschatz, Galvin and Gagne 2013

Okurlar Yazarlar Problemi Yazar sürecin yapısı do { wait(rw_mutex);... /* writing is performed */... signal(rw_mutex); } while (true); 5.37 Silberschatz, Galvin and Gagne 2013

Okurlar Yazarlar Problemi Okur sürecin yapısı do { wait(mutex); read_count++; if (read_count == 1) wait(rw_mutex); signal(mutex);... /* reading is performed */... wait(mutex); read count--; if (read_count == 0) signal(rw_mutex); signal(mutex); } while (true); 5.38 Silberschatz, Galvin and Gagne 2013

Okurlar ve Yazarlar Probleminin Çeşitleri İlk farklı çeşit yazarın paylaşılan nesneye erişim izni olmadığı sürece okurlar bekletilmez. İkinci farklı çeşit yazar hazır olur olmaz yazma işlerimi yapar. İki durumda da açlık olabilir. Çözüm bazı sistemlerde çekirdekteki okur-yazar kilitleri ile sağlanır. 5.39 Silberschatz, Galvin and Gagne 2013

Yemek Yiyen Filozoflar Problemi Çinli filozoflar düşünerek ve yiyerek hayatlarını sürdürürler. Tabaktaki pilavı yemek için iki çubuk almaları gerekir. Yedikten sonra ikisini de bırakırlar. 5 filozoflu durum Paylaşılan veri Pilav tabağı (veri kümesi) chopstick [5] semaforunun ilk değeri 1 5.40 Silberschatz, Galvin and Gagne 2013

Yemek Yiyen Filozoflar Problemi Algoritması Filozof i: do { wait (chopstick[i] ); wait (chopstick[ (i + 1) % 5] ); // eat signal (chopstick[i] ); signal (chopstick[ (i + 1) % 5] ); // think } while (TRUE); Bu algoritmadaki sorun nedir? 5.41 Silberschatz, Galvin and Gagne 2013

Yemek Yiyen Filozoflar Problemi Algoritması Deadlock yönetimi En fazla 4 filozofun masada oturmasına izin ver. Filozofun çubukları almasına ancak iki çubuk da boştaysa izin ver. (alma kritik bölümde olmalı) Asimetrik çözüm kullan tek numaralı filozof önce sol sonra sap çubuğu, çift numaralı filozof önce sağ sonra sol çubuğu alsın. 5.42 Silberschatz, Galvin and Gagne 2013

Semafor Sorunları Semafor işlemlerinin yanlış kullanımı: signal (mutex). wait (mutex) wait (mutex) wait (mutex) wait (mutex) veya signal (mutex) ten birini (veya ikisini) yazmamak Kilitlenme ve açlık mümkün. 5.43 Silberschatz, Galvin and Gagne 2013

İzleyiciler Süreç senkronizasyonu için kolay ve etkin bir mekanizma sunan bir soyutlama Abstract data type (soyut veri tipi), iç değişkenlere ancak yordam içindeki kodla erişilebilir. İzleyici içinde bir anda sadece bir süreç aktif olabilir. Bazı senkronizasyon yöntemlerini modellemek için yeterince güçlü değildir. monitor monitor-name { // shared variable declarations procedure P1 ( ) {. } procedure Pn ( ) { } } } Initialization code ( ) { } 5.44 Silberschatz, Galvin and Gagne 2013

İzleyicinin Şematik Görüntüsü 5.45 Silberschatz, Galvin and Gagne 2013

Koşul Değişkenleri condition x, y; Koşul değişkeni ile iki işlem yapılabilir: x.wait() çağıran süreç x.signal() işlemine kadar askıya alınır x.signal() x.wait() i çağırmış olan süreçlerden birini devam ettir x.wait() çağıran yoksa değişkene etkisi olmaz. 5.46 Silberschatz, Galvin and Gagne 2013

Koşul Değişkenleri ve İzleyici 5.47 Silberschatz, Galvin and Gagne 2013

Koşul Değişkeni Seçenekleri Eğer süreç P x.signal() çağırırsa, ve süreç Q x.wait() içinde askıdaysa, ardından ne olmalı? Q ve P paralel olarak çalışamaz. Eğer Q devam ederse, P bekler. Seçenekler Signal and wait P, Q izleyiciden ayrılana kadar veya başka bir koşul gerçekleşene kadar bekler. Signal and continue Q, P izleyiciden ayrılana kadar veya başka bir koşul gerçekleşene kadar bekler. İkisinin de iyi ve kötü yanları vardır. Concurrent Pascal içindeki izleyiciler P signal yürütünce anında izleyiciden ayrılır, Q devam eder. Mesa, C#, Java gibi başka dillerde gerçekleştirilmiştir. 5.48 Silberschatz, Galvin and Gagne 2013

Yemek Yiyen Filozoflara İzleyici Çözümü monitor DiningPhilosophers { enum { THINKING; HUNGRY, EATING) state [5] ; condition self [5]; } } void pickup (int i) { state[i] = HUNGRY; test(i); if (state[i]!= EATING) self[i].wait; void putdown (int i) { state[i] = THINKING; // test left and right neighbors test((i + 4) % 5); test((i + 1) % 5); 5.49 Silberschatz, Galvin and Gagne 2013

Yemek Yiyen Filozoflara İzleyici Çözümü void test (int i) { if ((state[(i + 4) % 5]!= EATING) && (state[i] == HUNGRY) && (state[(i + 1) % 5]!= EATING) ) { state[i] = EATING ; self[i].signal () ; } } } initialization_code() { for (int i = 0; i < 5; i++) state[i] = THINKING; } 5.50 Silberschatz, Galvin and Gagne 2013

Yemek Yiyen Filozoflara İzleyici Çözümü Her filozof i, pickup() ve putdown() işlemlerini aşağıdaki sırada çağırır: DiningPhilosophers.pickup(i); EAT DiningPhilosophers.putdown(i); Deadlock yok, ama açlık mümkün 5.51 Silberschatz, Galvin and Gagne 2013

Semaforlarla İzleyici Gerçekleştirimi Değişkenler semaphore mutex; // (başta = 1) semaphore next; // (başta = 0) int next_count = 0; Her yordam F yerine şu koyulur: wait(mutex); body of F; if (next_count > 0) signal(next) else signal(mutex); İzleyici içinde karşılıklı dışlama garanti edilir. 5.52 Silberschatz, Galvin and Gagne 2013

Koşul Değişkenleriyle İzleyici Gerçekleştirimi Her koşul değişkeni x için: semaphore x_sem; // (başta = 0) int x_count = 0; x.wait işlemi şöyle gerçekleştirilebilir: x_count++; if (next_count > 0) signal(next); else signal(mutex); wait(x_sem); x_count--; 5.53 Silberschatz, Galvin and Gagne 2013

Koşul Değişkenleriyle İzleyici Gerçekleştirimi x.signal işlemi şöyle gerçekleştirilebilir: if (x_count > 0) { next_count++; signal(x_sem); wait(next); next_count--; } 5.54 Silberschatz, Galvin and Gagne 2013

İzleyici İçindeki Süreçlerin Sürdürülmesi Birkaç süreç x koşulunun kuyruğundaysa, x.signal() yürütülünce hangisi devam etmelidir? FCFS (ilk gelene ilk hizmet) yetersiz olabilir. conditional-wait (koşullu bekleme) - x.wait(c) c - priority number (öncelik sayısı) En küçük sayı (yani en yüksek öncelik) sahibi süreç ilk sıraya koyulur. 5.55 Silberschatz, Galvin and Gagne 2013

Tek Kaynak Ayırma Her sürecin kaynağı en çok ne kadar süreyle kullanacağını belirten öncelik sayıları var. Bunlar kullanılarak tek bir kaynak rakip süreçler arasında paylaştırılır. R.acquire(t);... kaynağa eriş;... R.release; R, ResourceAllocator tipinin bir örneği 5.56 Silberschatz, Galvin and Gagne 2013

Tek Kaynak Ayırma için İzleyici monitor ResourceAllocator { boolean busy; condition x; void acquire(int time) { if (busy) x.wait(time); busy = TRUE; } void release() { busy = FALSE; x.signal(); } initialization code() { busy = FALSE; } } 5.57 Silberschatz, Galvin and Gagne 2013

Senkronizasyon Örnekleri Solaris Windows Linux Pthreads 5.58 Silberschatz, Galvin and Gagne 2013

Solaris te Senkronizasyon Çok görevli, çok iş parçalı ve çok süreçli yapı için çeşitli kilitler vardır. Adaptive mutexes kısa kod bölümlerinden veriyi korumada verimlilik için Standard semafor gibi başlar Kilidi başka CPU üzerinde çalışan bir thread tutuyorsa, thread bekler Kilidi tutan thread çalışır durumda değilse, thread engellenir ve kilit bırakılana kadar uyur Koşul değişkenleri kullanılır. Uzun kod bölümlerinin veriye erişmesi gerektiğinde okur-yazar kilitleri kullanılır. Adaptive mutex veya okur-yazar kilidi bekleyen threadleri sıralamak için turnike kullanılır. 5.59 Silberschatz, Galvin and Gagne 2013

Windows ta Senkronizasyon Tek işlemcili sistemlerde global kaynaklara erişimi kontrol etmek için kesme maskeleri kullanılır. spinlocks - çok işlemcili sistemlerde Kilitleyen thread boşa çıkartılmaz. dispatcher objects - mutexler, semaforlar, olaylar, süreölçerler Events (olaylar) Koşul değişkeni gibi davranır. Süreölçerler süre dolunca bir veya daha fazla thread e haber verir Dispatcher objects signaled-state (nesne boşta) veya non-signaled state (thread engellenir) içinde bulunabilir. 5.60 Silberschatz, Galvin and Gagne 2013

Linux ta Senkronizasyonu Linux: Çekirdek Versiyon 2.6 öncesinde, kesmeleri devre dışı bırakarak kısa kritik bölümleri gerçekleştirirdi. Versiyon 2.6 ve sonrasında, tamamen preemptive Linux şunları sağlar: Semaforlar atomik tamsayılar spinlocks Okur-yazar kilitleri Tek cpu lu sistemde, spinlock yerine çekirdek preemption açılır ve kapanır. 5.61 Silberschatz, Galvin and Gagne 2013

Pthreads ile Senkronizasyon Pthreads API OS-bağımsızdır. Şunları sunar: mutex kilitleri Koşul değişkeni Taşıabilir olmayan eklentiler: Okur-yazar kilitleri spinlocks 5.62 Silberschatz, Galvin and Gagne 2013

Diğer Yaklaşımlar Transactional Memory OpenMP İşlevsel Programlama Dilleri 5.63 Silberschatz, Galvin and Gagne 2013

Transactional Memory Memory transaction atomik olarak yapılan okuma-yazma işlemleri dizisi void update() { /* read/write memory */ } 5.64 Silberschatz, Galvin and Gagne 2013

OpenMP OpenMP paralel programlamayı destekler. void update(int value) { #pragma omp critical { count += value } } #pragma omp critical altındaki kod kritik bölgedir ve atomik olarak çalışır. 5.65 Silberschatz, Galvin and Gagne 2013

İşlevsel Programlama Dilleri İşlevsel programlama dilleri farklı bir paradigma sunar, durum bilgisi tutmazlar. Değişkenler değer atamasından sonra değiştirilemez. Erlang, Scala gibi işlevsel dillere ilgi giderek artmaktadır. 5.66 Silberschatz, Galvin and Gagne 2013

Bölüm 5 Sonu Silberschatz, Galvin and Gagne 2013