İşletim Sistemleri (Operating Systems) 1
PROCESS SENKRONİZASYONU (PROCESS SYNCHRONIZATION)
Kritik Bölge Probleminin Olası Çözümleri Donanıma Dayalı Çözümler
Donanıma Dayalı Çözümler Yazılım tabanlı kritik bölge problemi çözümlerinin (Peterson un algoritması gibi) modern bilgisayar mimarilerinde çalışmasının garantisi yoktur. Özellikle kritik bölge probleminin çözümünde, karşılıklı dışlama kapsamında yazılımsal yaklaşımlarda process ler, kaynağın serbest olup olmadığını sürekli olarak sınamak suretiyle CPU yu gereksiz yere meşgul ediyorlardı.
Donanıma Dayalı Çözümler Dekker ve Peterson'un algoritmaları, N process için genelleştirilebilir. Fakat, N sabitlenmiş ve önceden bilinmelidir. Aynı zamanda, bu algoritmalar çok karmaşıktır ve karşılıklı dışlama mekanizmasının uygulanması zordur! Bu yüzden kritik bölge problemini donanım temelli çözmek için bazı yöntemler geliştirilmiştir.
Donanıma Dayalı Çözümler Kritik bölge probleminin çözümü için İki tür donanıma dayalı senkronizasyon metodu vardır: Kesmeleri kapatmak/açmak (Disabling/Enabling interrupts) : Bu metod, çok işlemcili sistemlerde yavaş ve uygulanması zor. Özel ayrıcalıklı makine komutları kullanmak : Test and set (TS) Swap Compare and Swap (CS)
Kesmeleri kapatmak/açmak (Disabling/Enabling interrupts) Donanım temelli çözüm yöntemlerinden ilk akla gelen, kesmelerin(interrupt) kritik bölge işleminde kapatılmasıdır. Tek işlemcili sistemlerde, kritik bölge problemi paylaşılan veriler üzerinde process lerin kesme almadan gerçekleştirilmesiyle çözümlenebilir. Böylece paylaşılan veriler üzerinde işlem yapılırken, başka bir değişikliğin yapılması söz konusu olmayacaktır. Ancak bu yöntemin de bazı sakıncaları vardır.
Kesmeleri kapatmak/açmak (Disabling/Enabling interrupts) Kesmeler devre dışı bırakıldığından, process kritik bölgede yürütülürken hiçbir bağlam anahtarlama (context switching) oluşmaz. Kesmelere dayanan bazı özellikler (örneğin clock) düzgün çalışmayabilir.
Kesmeleri kapatmak/açmak (Disabling/Enabling interrupts) Normal durumda process kesilene veya sistem çağrısı yapana kadar çalışmaya devam eder. Kritik bölge yürütümünde kesmeleri kapatarak karşılıklı dışlama sağlamış olur. Ancak bu yöntem işlemcinin birden fazla process i zaman paylaşımlı olarak çalıştırma özelliğine aykırı bir durumdur.
Kesmeleri kapatmak/açmak (Disabling/Enabling interrupts) Bu yöntem tek işlemcili sistemlerde çalışır, çok işlemcili sistemlerde uygun çözüm değildir. İşlemciler bağımsız davranırlar. İşlemciler arasında kesme mekanizması yoktur. Çok işlemcili sistemlerde, kesmelerin disable/enable yapılması için tüm işlemcilere mesaj göndermek için zaman gereklidir ve sistem performansı düşer.
Özel Makine Komutlarına Dayalı Çözümler (Special Machine Instructions) Kritik bölge problemi için özel makine komutlarına dayalı çözümler, temel olarak kilitleme (locking) tabanlı yaklaşımlardır. Process kritik bölgeye girmeden önce kilit kullanır, kritik bölgeden çıkarken de kilidi açılır. Günümüzde modern işlemciler, kilidi uygulamak için kullanılabilecek özel atomik donanım komutları sağlar.
Özel Makine Komutlarına Dayalı Çözümler Atomik (non-interruptible) komutlar : Tek bir komut çevriminde gerçekleşen komutlardır, kesilemezler. Böyle bir komut yürütüldüğünde, CPU lar tarafından çeşitli aşamalarla yürütülen diğer tüm komutlar bu komut tamamlanıncaya kadar durdurulacaktır. Bu nedenle, iki farklı komut aynı anda verilirse, farklı CPU'larda olsalar da sırayla çalıştırılacaktır. Ayrıcalıklı (Privileged): Bu komutlar genel olarak ayrıcalıklıdır, yani sadece supervisor veya kernel modunda çalışabilirler.
Özel Makine Komutlarına Dayalı Çözümler Çoğu modern bilgisayar sistemi, bir word ü test etmeyi/güncellemeyi veya iki word ü yer değiştirmeyi sağlayan özel donanım komutları sağlar. bir word içeriğini test edip değiştirme, (test and set lock -TS) test et ve değiştir komutu -TestAndSet() iki word içeriğini yer değiştirme, (swap lock) yer değiştir komutu Swap() bir word içeriğini karşılaştırıp değiştirme, (compare and swap lock -CS) karşılaştır ve yer değiştir komutu - CompareAndSwap()
Özel Makine Komutlarına Dayalı Çözümler Kilitleri Kullanarak Kritik Bölge Problemine Çözüm Kilit çözümünün genel düzeni şöyledir: do { acquire lock critical section release lock remainder section } while (TRUE); Kritik kod bölgesinin mümkün olduğunca küçük olması, yalnızca paylaşılan verilere erişen/değiştiren bölümleri kilitlemesi gerekir.
Test and Set Komutunu Kilitleme için Kullanma Test and Set, TS olarak bilinen tek ve bölünmez bir makine komutudur ve IBM tarafından çok işlemcili Sistem 360/370 bilgisayarlar için tanıtıldı. lock önekini alan bir komutun işletimi sırasında, bu komutu işleten işlemcinin bellek erişim döngüsünün bölünmesine izin verilmez. Yani bu komut kesilemez.
Test and Set Komutunu Kilitleme için Kullanma Shared data: boolean lock = FALSE; Process P i do { while (TestAndSet(&lock)); critical section lock = FALSE; remainder section } while (TRUE);
Test and Set Komutunu Kilitleme için Kullanma lock değişkeni 1 bitlik bellek alanında saklanır. lock = {TRUE, FALSE} Test and Set Lock (TS) komutu ile bellekteki lock değeri önce test edilir dönüş değeri FALSE olduğunda kilit ele geçirilir. Bellekteki lock değişkeni TRUE ile değiştirilir. Process kendi kritik bölgesine girer ve işlemlerini tamamladıktan sonra tekrar lock değişkeninin değerini FALSE olarak değiştirir.
Test and Set Komutunu Kilitleme için Kullanma Eğer lock değeri test edildiğinde TRUE ise, bir başka process zaten kilidi ele geçirmiştir. (ve hala ona sahiptir) lock değişkenin bellekten okunup, alınması ve değerinin değiştirilmesi tek hamlede gerçekleştirilen bir işlemdir. Diğer işlemciler de bu süreçte bu değişkene ulaşamazlar. TS komutunu kullanan işlemciler belleğe giden veri yollarını kilitleyerek diğer işlemcilerin belleğe ulaşımını engeller.
Test and Set Komutunu Kilitleme için Kullanma
Test and Set Komutunu Kilitleme için Kullanma
Test and Set Komutunu Kilitleme için Kullanma Bir kilit sisteme iade edildiğinde ve diğer process ler kilit üzerinde harekete geçmek için beklerken yalnızca bir process in FALSE ile döneceğinden emin olunmalıdır. Bu metod ile karşılıklı dışlama (mutual exclusion) ve ilerleme (progress) sağlansa bile sınırlı bekleme (bounded waiting) gerçekleştirilemeyebilir.
Swap Komutunu Kilitleme için Kullanma Swap komutu da kesilemeyen özel donanım komutudur. lock ve key adı verilen iki değişkeni kullanır. İlk değeri FALSE olan global bir lock değişkeni ve her process için lokal bir key değişkeni tanımlanır. lock FALSE ise, bir process kritik bölgesine girebilir, aksi takdirde giremez. Bellekteki lock değeri, key değerine eşit olmadığı sürece değiştirilmez.
Swap Komutunu Kilitleme için Kullanma Shared data: boolean lock = FALSE; Process P i do { /* Each process has a local Boolean variable key */ key = TRUE; while (key == TRUE) Swap(&lock, &key); critical section lock = FALSE; remainder section } while (TRUE);
Swap Komutunu Kilitleme için Kullanma Swap komutu da, karşılıklı dışlama (mutual exclusion) ve ilerlemeyi (progress) sağlarken, yarış durumunun (race condition) önlenmesi için gerekli sınırlı bekleme (bounded waiting) şartını sağlamamaktadır.
Compare and Swap Komutunu Kilitleme için Kullanma compare and swap komutu (CS), test and set (TS) komutuna benzerdir, ancak daha karmaşıktır. CS komutu üç parametre alır: belirli bir değer, bellek konumundaki "beklenen değer" ve belirli bir yeni değer. Paylaşılan değişken: global bir lock değişkeni başlangıçta 0 yapılır. compare and swap, bir bellek konumunun içeriğini belirli bir değerle atomik olarak karşılaştırır ve yalnızca aynı oldukları zaman, bu bellek konumunun içeriğini belirli bir yeni değere değiştirir.
Compare and Swap Komutunu Kilitleme için Kullanma Shared integer lock initialized to 0; Solution: do { while (compare_and_swap(&lock, 0, 1)!= 0) ; /* do nothing */ /* critical section */ lock = 0; /* remainder section */ } while (true);
Compare and Swap Komutunu Kilitleme için Kullanma bellek konumunun içeriği ile karşılaştırılan değerin aynı olması durumunda, compare and swap metodunu çağıran process lock=1 yapar. Sonra process kritik bölümüne girebilir, compare and swap() için müteakip (subsequent) çağrılar cevaplanamaz, çünkü lock beklenen 0 değerinde değildir. Bir process kendi kritik bölgesinden çıktığında lock değerini tekrar 0 yapar ve böylece başka bir process in kritik bölgesine girebilmesini sağlar.
Özel Makine Komutlarının Dezavantajları Donanımsal özel makine komutları meşgul beklemeye neden olduğundan bekleyen process de işlemci zamanı harcar. Bir process kritik bölgesine girmeden önce kilidi sınamakta, kilidin meşgul olduğu durumlarda bu sınamaları yineleyerek kilidin açılmasını beklemektedir. Bu durumda, erişeceği kilit meşgul olan bir process, sırası gelip CPU ya anahtarlandığında kendisine ayrılan süre boyunca gerçekleşmeyecek bir koşulun oluşmasını bekleyerek, gereksiz yere CPU yu meşgul edecektir.
Özel Makine Komutlarının Dezavantajları Özel makine komutları kritik bölge sorununun çözümünde karşılıklı dışlama (mutual exclusion) ve ilerleme (progress) gereksinimlerini karşılarlar. Ancak kritik bölge sorunun sınırlı bekleme (bounded waiting) gereksinimini karşılamak için diğer mekanizmalarla tamamlanmaları gerekir. Bir process kritik bölgesinden çıktığında birden fazla bekleyen process varsa hangi process in gireceği belirsizdir, sonsuz bekleme durumu yani açlık (starvation) oluşabilir. Açlık (starvation) : Aynı kaynakları kullanan process lerden bazılarının bekledikleri kaynaklara hiç erişememe durumu. Bekleyen process ler sonsuz beklemeye girebilir.
Donanım + Yazılım Desteği ile Kritik Bölge Çözümleri
Semaforlar (Semaphores)
Semaforlar (Semaphores) 1965 yılında Edsger W. Dijkstra, process ler arasındaki senkronizasyonu sağlamak için semafor yapısını geliştirmiştir. Semafor, işletim sistemi tarafından tanınan, donanım + yazılım desteği olan ve tamsayı (integer) değerlerini alabilen özel değişkenlerdir. Semafor değeri, yalnızca bir process in herhangi bir zamanda erişebileceği ve değiştirebileceği paylaşılan bir değerdir. Semaphore, Latince kökenli dillerde deniz feneri anlamına gelmektedir. 32
Semaforlar (Semaphores) Semafor tamsayı değer saklayan bir nesne olarak düşünülebilir. Semafor üzerinde temel olarak DOWN =P(S) ve UP =V(S) isimli iki tür işlem tanımlıdır: P(S) semaforun değerini azaltmak. V(S) semaforun değerini arttırmak. Bu işlemler bölünemez (atomic) işlemlerdir ve işletim sistemi tarafından gerçekleştirilirler.
Semaforlar (Semaphores) Dijkstra çalışmasında, Almanca Proberen : test et manasına gelen P operatörünü ve Verhogen : arttır manasına gelen V operatörünü tamsayı tipinde değişken olan S semaforu üzerinde uygulamıştır. semaphore S; P(S) : while S 0 do {bekle}; S = S-1 V(S) : S = S+1 P(S) atomik biçimde S değişkenini sınayan eğer S sıfırdan küçük veya eşitse beklemeyi sağlayan, değilse içeriğini bir eksilten, bir işlemdir. V(S) ise S değişkenini bir artırmayı sağlayan bir işlemdir. 34
Semaforlar (Semaphores) S semaforu bir tamsayıdır ve sadece wait() ve signal() atomik işlemleri tarafından erişilebilir ve değiştirilebilir. wait(s) işlemi P(S) yerine, signal(s) işlemi V(S) yerine kullanılır. Bir process kritik bölgesine girmeden önce wait(s) işlemini çalıştırır. S nin içerdiği değere göre kritik bölgesine girer yada wait() işlemi üzerinde bekler. Kritik bölge çıkışında mutlaka signal(s) işleminin çalıştırılması gerekir.
Semaforlar (Semaphores) Semaforlar pozitif tamsayılar olarak tanımlanmasına rağmen çoğu kez gerçekleştirmede eksi sayılar da kullanılır. wait() semaforun değerini bir azaltır. signal() semaforun değerini bir arttırır. Bu iki yol dışında semaforun değerini değiştirmek mümkün değildir. wait ve signal işlemleri kesilemez.
Semaforlar (Semaphores) wait() ve signal() bölünemez (atomik) olarak gerçekleştirilirler. Bu sebeple wait() ve signal() içinde process lere müdahele edilmesi ve CPU nun bir başka process e verilmesi söz konusu değildir. Process ler kritik bölgelerine girmeden wait(), kritik bölgelerinden çıkarken de signal() işlemlerini yaparak karşılıklı dışlamayı garanti ederler.
Semaforlar (Semaphores) Semaforlar kullanım alanları ve tasarımları itibariyle ikiye ayrılır: İkili Semafor (Binary Semaphore) Sayma Semaforu (Counting Semaphore) İkili semaforlar sadece iki process arasında senkronizasyon sağlar. Semafor değeri 0 ve 1 ile kısıtlanmıştır. Sayma semaforları ise istenilen miktarda process i kontrol edebilir. Herhangi bir tamsayı değeri alabilirler.
İkili semaforlar (Binary semaphores) waitb(s): if (S.value = 1) { S.value := 0; } else { block this process place this process in S.queue } signalb(s): if (S.queue is empty) { S.value := 1; } else { remove a process P from S.queue place this process P on ready list }
İkili semaforlar (Binary semaphores) Semaforların sadece 0 ve 1 değerleri alabildiği özel durumdur. 40
İkili semaforlar (Binary semaphores)
Sayma Semaforu (Counting Semaphore) Eksi tamsayı değerleri de alabilen semaforlar Sayma Semaforu (Counting Semaphore) ya da genel semaforlar olarak adlandırılır. Semafor başlangıç değeri 0 olabilir. Başlangıç değeri n olan bir semafor n process tarafından kullanılır.
Sayma Semaforu (Counting Semaphore) wait(s): S.count--; if (S.count<0) { block this process place this process in S.queue } signal(s): S.count++; if (S.count<=0) { remove a process P from S.queue place this process P on ready list }
Sayma Semaforu (Counting Semaphore) wait(s): S.value--; if (S.value < 0) { add this process to S.L; block; } signal(s): S.value++; if (S.value <= 0) { remove a process P from S.L; wakeup(p); }
Sayma Semaforu (Counting Semaphore) Bir process, wait() operasyonunu işletirse ve semaforun değerinin pozitif olmadığını bulursa beklemelidir (busy waiting). Meşgul bekleme yerine kendini bloke eder. Bloke edilen process semaforla ilişkilendirilir ve durumu bekler-(waiting) konumuna getirilir. Bir semafor üzerinde bekleyen process ler bir kuyrukta tutulur. Bloke edilen process semafor ile ilişkili bekleme kuyruğuna yazılır.
Sayma Semaforu (Counting Semaphore) Block() Process durumunu running den waiting e çevirir. Process i bekler(waiting) kuyruğuna yerleştirir. Wake up() Bekler kuyruğundan semaforla ilişkili olan 1 process i çıkarır ve hazır kuyruğuna koyar. Block() ve wakeup(): işletim sistemine ait standart sistem çağrıları ile sağlanır.
Sayma Semaforu (Counting Semaphore) Semafor S in üzerinde bekleyen, bloke edilmiş olan process, diğer process lerden bazıları signal() operasyonu işlettiklerinde yeniden başlatılabilir. Process bir wake up operasyonu ile restart edilir. Bu process durumunu beklerden hazır durumuna geçirir.
Sayma Semaforu (Counting Semaphore) Her semafor integer bir değere ve bu semafor üzerinde bekleyen process listesine sahiptir (PCB listesine bir pointer kaydı). Bir process bir semafor üzerinde beklemeli ise semaforun process listesine eklenir. signal() operasyonu process i semafor listesinden çıkarır.
Örnek - Semafor kullanarak paylaşılan verilere erişen üç process. Sayma Semaforu (Counting Semaphore)
İkili Semafor ile Sayım Semaforunu Uygulamak Data structures: binary-semaphore S1, S2; int C; Initialization: S1 = 1 S2 = 0 C = initial value of semaphore S
İkili Semafor ile Sayım Semaforunu Uygulamak wait operation: waitb(s1); C--; if (C < 0) { signalb(s1); waitb(s2); } signalb(s1); signal operation: waitb(s1); C ++; if (C <= 0) signalb(s2); else signalb(s1);
İkili Semafor ile Sayım Semaforunu Uygulamak Tablo daki 5. durumdan sonra, en uzun bekleme süreci olan P3 process i, kritik bölgeye girmek için seçilmişti, ancak sistem ilk giren ilk çıkar seçim politikasını kullanmıyorsa bu zorunlu değildir. Aslında, işlenecek process in seçimi, Process Zamanlayıcısı tarafından kullanılan algoritmaya bağlıdır.
Semaforlar (Semaphore) Semafor ile işlem yapmak, birlikte çalışan process lerin yönetimine hem kuramsal hem de uygulanırlık açısından gerekli ve yeterli desteği sağlıyor olmalarına karşın azımsanamayacak tasarım ve programlama yükünü de birlikte getirirler. Process senkronizasyonu, process lerin içine P() ve V() işlemlerinin serpiştirilmesini gerektirir. Bu durum programların okunurluğu ve anlaşılmasını olumsuz yönde etkiler. Bunun yanı sıra bu işlemlerin yanlış kullanımı, kimi zaman sistem kaynaklarının kilitlenmesine, dolayısıyla sistemin başarımının düşmesine ve güvenirliğinin zedelenmesine de neden olabilir.
Semaforlar (Semaphore) Semaforlar kullanıldığında da senkronizasyon hataları olabilmektedir. Tüm process lerin kritik bölüme girmeden önce wait(), sonra ise signal() işlemlerini yapmaları gereklidir. Program geliştirici bu sıraya dikkat etmezse, iki veya daha fazla process aynı anda kritik bölüme girebilir. Bu durumlar programcılar arasında yeterli işbirliği olmadığı durumlarda da olabilmektedir.
Semaforlar (Semaphore) Kritik bölüm problemine ilişkin tasarımda oluşan sorunlardan dolayı kilitlenmeler veya eşzamanlı erişimden dolayı yanlış sonuçlar ortaya çıkabilmektedir. Bu gerekçeye dayalı olarak, process senkronizasyonunda alt düzey işlemleri doğrudan kullanmak yerine, bunlara dayalı, daha yalın ve sistemli izleyici (monitor) adı verilen üst düzey araçlardan yararlanılır.
Üretici Tüketici Problemi (Producer Consumer Problem) Üretici - Tüketici Problemi (Producer & Consumer Problem), bir dizinin veya kuyruğun içerisinde yer alan elemanların karşılıklı iki semafor tarafından senkronize bir şekilde kullanılmasını tanımlamaktadır. Burada üretici (producer) semafor, veriyi belirli bir miktarda üreterek alanı terkeder ve sırayı tüketici ye (consumer) bırakır. Tüketici ise belirli miktarda üretilen veriyi belirli miktarda tüketerek buffer alanını terkeder. Burada dikkat edilmesi gereken temel nokta üreticinin buffer size miktarını aşmaksızın data üretmesi gerekirken, tüketicinin ise 0 data miktarının altında kalmaksızın datayı tüketmesi gerektiği gerçeğidir. Aksi halde CPU gereksiz yere işgal edilecektir.
Üretici Tüketici Problemi (Producer Consumer Problem) Aynı anda çalışan iki process bulunmaktadır ve bunlardan birisi üretmekte diğeri de bu üretilen ürünü tüketmektedir. Buradaki sorun, üretilen ürün henüz tüketilmeden ikincisinin üretilmemesi veya henüz ürün üretilmeden tüketilmemesidir. Problem tanımı itibariyle, process ler arası senkronizasyonu gerektirmektedir ve iki process birbiri ile senkronize olmalıdır. Yani tüketici, ne zaman tüketeceğine, üreticinin hareketlerine bakarak karar vermeli, benzer şekilde üretici de ne zaman üreteceğine, tüketicinin hareketlerine bakarak karar vermelidir. 57
Üretici Tüketici Problemi (Producer Consumer Problem) Veri üreten bir kullanıcı process i ile bu verileri yazıcıdan döken sistem process i birlikte çalışan iki process dir. Kullanıcı process inin ürettiği verilerin yazıcı sistem process i tarafından dökülebilmesi, ilgili verilerin bir process den diğer process e aktarılmasını gerektirir. Bu aktarım her iki process in ortak erişebildiği bir tampon bellek (buffer memory) alanı üzerinden gerçekleşebilir. 58
Üretici Tüketici Problemi (Producer Consumer Problem) Kullanıcı process i, dökümü alınacak veriyi, sırayla bu tampon bellek alanına yazar. Yazıcı sistem process i de, bu alandan okuduğu verilerin yazıcıdan dökülmesini sağlar. Ortak tampon bellek alanına yazma yapan process üretici, Ortak tampon bellek alanından okuma yapan process ise tüketici olarak nitelenir. Bu nedenle, kullanıcı process üretici, yazıcı sistem process i ise tüketici process konumundadır. 59
Üretici Tüketici Problemi (Producer Consumer Problem) Ortak bir bellek alanı üzerinden veri alış-verişinde bulunan üretici ve tüketici process ler birbirlerinin işletimini etkileyen process lerdir. Bu bağlamda, daha önce verilen örnekte yazıcı sistem process inin işletilebilmesi, kullanıcı process inin yazdırılacak bir veriyi ortak tampon bellek alanı üzerinde hazır etmesine bağlıdır. Bunun gibi kullanıcı process inin, yeni bir veriyi tampon bellek alanına yazabilmesi, bir önce yazılan verinin yazıcı process tarafından okunup dökülmüş olmasını gerektirir. 60
Üretici Tüketici Problemi (Producer Consumer Problem) Bounded (sınırlanmış) buffer üretici / tüketici probleminde n adet sabit buffer vardır. Üretici n buffer dolunca bekler, tüketici n adet buffer boşalınca bekler. Üretici üretmiş olduğu veriyi buffer da boş yer varsa koyabilir. Yer yok ise tüketicinin buffer dan bir veriyi almasını beklemek durumundadır. Tüketici ise ancak buffer boş değilse veri tüketebilir, aksi taktirde üreticinin buffer a veri girmesini beklemesi gerekir. Unbounded (sınırlanmamış) buffer üretici / tüketici probleminde bufferların sayısında bir sınır yoktur. Tüketici yeni ürünler bekler, ve gelenleri tüketir, sadece ürün bitince bekler fakat üretici daima yeni ürün üretip koyabilir. 61
Semafor ile Üretici / Tüketici Problemi (Sınırlanmamış Tampon)
Sınırlanmış (Bounded) buffer Üretici / Tüketici problemi Üretici Process 63
Sınırlanmış (Bounded) buffer Üretici / Tüketici problemi Tüketici Process 64
Semafor ile Üretici-Tüketici Problemi (Sınırlanmış Buffer) Semafor kullanarak üretici tüketici probleminin, sınırlanmış Buffer durumunda çözümü. Üretici ve tüketici birer process olarak oluşturulmaktadır. Burada 3 önemli kısıtlama vardır: Buffer a aynı anda sadece bir process erişebilir (karşılıklı dışlama). Bu maksatla ikili semafor kullanılacaktır. Eğer Buffer boş ise tüketici üreticinin Buffer a veri girmesini bekler. Üretici ve tüketici empty isimli semaforu senkronizasyon amacıyla kullanacaklardır. Eğer Buffer dolu ise üretici tüketicin Buffer dan veri almasını bekler. Üretici ve tüketici full isimli semaforu senkronizasyon amacıyla kullanacaklardır.
Semafor ile Üretici-Tüketici Problemi (Sınırlanmış Buffer) # define N 100 # define TRUE 1 typedef int semaphore; semaphore mutex = 1; semaphore empty = N; semaphore full = 0; producer() { int item; while (TRUE) { produce_item(&item); down(empty); down(mutex); enter_item(item); up(mutex); up(full); } } consumer(){ int item; while (TRUE) { down(full); down(mutex); remove_item(&item); up(mutex); up(empty); } } consume_item(item); / * Buffer daki eleman sayısı */ / * Semaforlar int bir tür olarak tanımlanıyor */ / * kritik kısmı karşılıklı dışarlamak */ / * Buffer daki boş yer sayısı */ / * Buffer daki dolu yer sayısı */ / * yerel değişken */ / * Buffer a konulacak veri oluşturuluyor */ / * Buffer dolu ise bekle yoksa bos yer sayısını 1 azalt */ / * Kritik kısma girebilmek için vize al */ / * Veriyi Buffer a gir (Kritik Kısım) */ / * Kritik Kısımdan çıktığını belirt */ / * Bekleyen tüketici varsa uyandır yoksa Buffer daki */ / * dolu yer sayısını 1 arttır */ / * yerel değişken */ / * Buffer boş ise bekle yoksa dolu yer sayısını 1 azalt */ / * Kritik kısma girebilmek için vize al */ / * Veriyi Buffer dan al (Kritik Kısım) */ / * Kritik Kısımdan çıktığını belirt */ / * Bekleyen üretici varsa uyandır yoksa Buffer daki */ / * dolu boş sayısını 1 arttır */ / * Buffer dan alınan veriyi kullan */