Professional Documents
Culture Documents
Operating System Concepts – 8th Edition, Silberschatz, Galvin and Gagne ©2009
Bölüm 6: Senkronizasyon
Temel Kavramlar
Kritik Alan Problemi (The Critical-Section Problem)
Peterson’un Çözümü
Senkronizasyon Donanımı (Synchronization Hardware)
Semaforlar (Semaphores)
Klasik Senkronizasyon Problemleri
Monitörler (Monitors)
Senkronizasyon Örnekleri
Atomik işlemler (Atomic Transactions)
Operating System Concepts – 8th Edition 6.2 Silberschatz, Galvin and Gagne ©2009
Temel Kavramlar
Operating System Concepts – 8th Edition 6.3 Silberschatz, Galvin and Gagne ©2009
Üretici (Producer)
while (true) {
Operating System Concepts – 8th Edition 6.4 Silberschatz, Galvin and Gagne ©2009
Tüketici (Consumer)
while (true) {
while (count == 0)
; // Hiçbir şey yapma
nextConsumed = buffer[out];
out = (out + 1) % BUFFER_SIZE;
count--;
Operating System Concepts – 8th Edition 6.5 Silberschatz, Galvin and Gagne ©2009
Yarış Şartı (Race Condition)
Birden fazla sürecin aynı veriye koşutzamanlı olarak erişmek ve
değişiklik yapmak istemesi ve işletimin sonucunun süreçlerin erişim
sıralarına göre değişmesi durumuna yarış şartı adı verilir
count++ aşağıdaki gibi uygulanabilir
register1 = count
register1 = register1 + 1
count = register1 register1 ve register2'nin
aynı fiziksel kayıtçı olabile-
count-- aşağıdaki gibi uygulanabilir
ğini düşünürsek sorun çıkar
register2 = count
register2 = register2 - 1
count = register2
Başlangıçta “count = 5” değerine sahip sistemin çalışması:
S0: üretici çalışır register1 = count {register1 = 5}
S1: üretici çalışır register1 = register1 + 1 {register1 = 6}
S2: tüketici çalışır register2 = count {register2 = 5}
S3: tüketici çalışır register2 = register2 - 1 {register2 = 4}
S4: üretici çalışır count = register1 {count = 6 }
S5: tüketici çalışır count = register2 {count = 4}
Operating System Concepts – 8th Edition 6.6 Silberschatz, Galvin and Gagne ©2009
Kritik Alan (Critical Section) Problemi
Her sürecin kritik alan adı verilen bir kod alanı vardır ve bu alandayken
süreç ortak değişkenleri değiştiriyor, bir dosyaya yazıyor, bir tabloyu
değiştiriyor, vb. işlemler yapıyor olabilir.
Önemli olan bir sürecin kritik alanı içerisindeyken diğer bir süreç
tarafından kesilmesine izin verilmemesidir.
Bu da birden fazla sürecin aynı anda kritik alanlarında bulunmasına izin
vermemek ile gerçekleştirilebilir.
Kritik alan problemi süreçlerin birlikte çalışırken kullanabilecekleri bir
protokol geliştirmektir:
Her süreç kritik alana girmek için izin istemelidir. İzin isteme için
gerekli kod parçasına, giriş kısmı (entry section) adı verilir
Kritik alanın bir de çıkış kısmı (exit section) bulunur.
Geri kalan kod ise kalan kısımdır (remainder section)
Operating System Concepts – 8th Edition 6.7 Silberschatz, Galvin and Gagne ©2009
Kritik Alan (Critical Section) Problemi
do {
Giriş Kısmı
Kritik Alan
Çıkış Kısmı
Kalan Kısım
} while (TRUE)
Operating System Concepts – 8th Edition 6.8 Silberschatz, Galvin and Gagne ©2009
Kritik Alan (Critical Section) Problemine Çözüm
Operating System Concepts – 8th Edition 6.9 Silberschatz, Galvin and Gagne ©2009
Peterson’un Çözümü (Yazılım Çözümü)
İki süreç çözümü
LOAD ve STORE komutlarının atomik olduğu varsayılır; yani
bunlar kesilemez.
Bu iki süreç iki değişkeni paylaşırlar:
int turn;
Boolean flag[2]
turn değişkeni hangi sürecin kritik alanına girme sırası olduğunu
beliritir. turn == i ise Pi ‘nin kritik alana girmesine izin verilir.
flag dizisi ise bir sürecin kritik alana girmeye hazır olduğunu
belirtmek için kullanılır. flag[i] == true Pi sürecinin kritik alana
girmeye hazır olduğunu belirtir!
Operating System Concepts – 8th Edition 6.10 Silberschatz, Galvin and Gagne ©2009
Peterson'un Çözümünde Pi Süreci için Algoritma
do {
flag[i] = TRUE;
turn = j;
while (flag[j] && turn == j);
Kritik alan
flag[i] = FALSE;
Kalan alan
} while (TRUE);
Operating System Concepts – 8th Edition 6.11 Silberschatz, Galvin and Gagne ©2009
Senkronizasyon Donanımı
do {
Kiliti koy
Kritik alan
Kilidi kaldır
Kalan alan
} while (TRUE);
Operating System Concepts – 8th Edition 6.12 Silberschatz, Galvin and Gagne ©2009
Senkronizasyon Donanımı
Birçok sistemde kritik alan kodu için donanım desteği sunmaktadır
Tek işlemcili sistemlerde paylaşılan bir değişken değiştirilirken
kesmeler devre dışı bırakılabilirler
Şu anda çalışan kod kesilmeden çalışmaya devam eder
Çok işlemcili sistemlerde genellikle çok verimsizdir
Bu şekildeki işletim sistemleri genellikle ölçeklenebilir
değildir
Modern makinelerde özel atomik donanım komutları sunmaktadır
Atomik = kesmesiz (non-interruptable)
Ya bellek kelimesini test eder ve değeri değiştirir (TestAndSet)
Ya da iki bellek kelimesinin içeriklerini değiş tokuş eder (Swap)
Operating System Concepts – 8th Edition 6.13 Silberschatz, Galvin and Gagne ©2009
TestAndSet() Komutu
Tanım:
Operating System Concepts – 8th Edition 6.14 Silberschatz, Galvin and Gagne ©2009
TestAndSet()'i Kullanarak Karşılıklı
Dışlama Sunan Bir Çözüm
Paylaşılan boolean değişken lock, ilk değeri false.
Çözüm:
do {
while ( TestAndSet (&lock ))
; // hiçbir şey yapma
// Kritik alan
lock = FALSE;
// Kalan alan
} while (TRUE);
Operating System Concepts – 8th Edition 6.15 Silberschatz, Galvin and Gagne ©2009
Swap Komutu
Tanım:
Operating System Concepts – 8th Edition 6.16 Silberschatz, Galvin and Gagne ©2009
Swap'i Kullanan Çözüm
Paylaşılan Boolean değişkeni lock, ilk değeri FALSE;
Her sürecin bir Boolean değişken anahtarı mevcuttur
Çözüm:
do {
key = TRUE;
while ( key == TRUE)
Swap (&lock, &key );
// Kritik alan
lock = FALSE;
// Kalan alan
} while (TRUE);
Operating System Concepts – 8th Edition 6.17 Silberschatz, Galvin and Gagne ©2009
TestAndSet() Kullanan Bekleme Limitli Karşılıklı
Dışlama
Normalde TestAndSet() ve Swap() karşılıklı dışlamayı sağlar ancak sınırlı beklemeyi
sağlamaz. Aşağıdaki çözüm tüm kritik alan gereksinimlerini karşılar:
do {
waiting[i] = TRUE;
key = TRUE; Başlangıçta;
boolean waiting[n]=false;
while (waiting[i] && key)
boolean lock=false;
key = TestAndSet(&lock);
waiting[i] = FALSE; Pi sadece waiting[i]==false
// Kritik alan veya key== false olduğu
j = (i + 1) % n; durumlarda kritik alanına
girebilir.
while ((j != i) && !waiting[j])
key sadece TestAndSet
j = (j + 1) % n;
çalıştığı zaman false olabilir.
if (j == i)
lock = FALSE;
else
waiting[j] = FALSE;
// Kalan alan
} while (TRUE);
Operating System Concepts – 8th Edition 6.18 Silberschatz, Galvin and Gagne ©2009
Semafor (Semaphore)
Meşgul beklemeye (busy waiting) ihtiyaç duymayan bir senkronizasyon aracıdır
Semafor S – integer değişken
S'i değiştiren iki standart operasyon vardır: wait() ve signal()
P() ve V() olarak adlandırılırlar
Daha az karmaşıktır
Yanlızca iki bölünemeyen (atomik) operasyon tarafından erişilebilir
wait (S) {
while (S <= 0)
; // no-op
S--;
}
signal (S) {
S++;
}
Operating System Concepts – 8th Edition 6.19 Silberschatz, Galvin and Gagne ©2009
Genel Senkronizasyon Aracı Olarak Semafor
Operating System Concepts – 8th Edition 6.20 Silberschatz, Galvin and Gagne ©2009
Semafor Uygulaması
Sayan (counting) semaforlar belirli sayıdaki kaynağa erişimi kontrol etmek
için de kullanılabilir:
Semafor mevcut kaynak sayısına ayarlanır
Bir kaynak kullanmak isteyen tüm süreçler bir wait() operasyonu (sayıyı
bir düşürür) gerçekleştirir.
Süreç kaynağı serbest bırakırken ise signal() operasyonu (sayıyı bir
arttırmak) gerçekleştirir.
Semaforun sayısı 0’a ulaşırsa tüm kaynaklar kullanılmıştır ve kaynak
kullanmayı bekleyen tüm süreçler sayı 0’dan büyük oluncaya kadar
bloklanmalıdır.
Operating System Concepts – 8th Edition 6.21 Silberschatz, Galvin and Gagne ©2009
Semafor Uygulaması
Semafor uygulaması iki sürecin aynı semaforda aynı zamanda wait ()
ve signal () 'i çalıştırmamasını garanti etmelidir
Uygulama wait ve signal kodunun kritik alana yerleştirildiği bir kritik
alan problemine dönüşmüştür.
Kritik alan uygulamasında meşgul bekleme (busy waiting) yer
alabilir
Bir süreç kritik alanında iken diğer bir süreç kendi kritik alanına
girmek isterse sürekli olarak giriş kodunda (entry code)
dönmelidir.
Meşgul bekleme tek CPU'lu sistemlerde problem olabilir.
Meşgul bekleme diğer süreçler verimli bir şekilde kullanabilecekken
CPU döngülerinin harcanmasına yol açar.
Uygulamaların çoğu zamanını kritik alanlarında geçirdiği düşünülürse
bu iyi bir çözüm değildir.
Operating System Concepts – 8th Edition 6.22 Silberschatz, Galvin and Gagne ©2009
Meşgul Beklemesiz Semafor Uygulaması
Operating System Concepts – 8th Edition 6.23 Silberschatz, Galvin and Gagne ©2009
Meşgul Beklemesiz Semafor Uygulaması
C dilinde semafor uygulaması
typedef struct {
int value;
struct process *list;
} semaphore;
Wait uygulaması:
wait(semaphore *S) {
S->value--;
if (S->value < 0) {
add this process to S->list;
block();
}
}
Signal uygulaması:
signal(semaphore *S) {
S->value++;
if (S->value <= 0) {
remove a process P from S->list;
wakeup(P);
}
} – 8th Edition
Operating System Concepts 6.24 Silberschatz, Galvin and Gagne ©2009
Kilitlenme (Deadlock) ve Açlık (Starvation)
Kilitlenme (Deadlock) – iki ya da daha fazla sürecin yalnızca aralarından biri
tarafından oluşturulabilecek bir olayı belirsiz bir süre için beklemesidir.
S ve Q başlangıç değerleri 1 olan iki semafor olsun
P0 P1
wait (S); wait (Q);
wait (Q); wait (S);
. .
. .
. .
signal (S); signal (Q);
signal (Q); signal (S);
Açlık (Starvation) – belirsiz süre için bloklanma. Bir süreç bekletildiği
semafor kuyruğundan hiçbir zaman kaldırılamaz.
Önceliklerin tersine çevrilmesi (Priority Inversion) - Yüksek öncelikli bir
süreç kilide ihtiyaç duyarken düşük öncelikli süreçlerin kilidi tuttuğu durumda
ortaya çıkan iş planlaması problemidir
Operating System Concepts – 8th Edition 6.25 Silberschatz, Galvin and Gagne ©2009
Klasik Senkronizasyon Problemleri
Sınırlı-Tampon Problemi (Bounded-Buffer Problem)
Okuyucular ve Yazıcılar Problemi (Readers and Writers Problem)
Yemek yiyen-Filozoflar Problemi (Dining-Philosophers Problem)
Operating System Concepts – 8th Edition 6.26 Silberschatz, Galvin and Gagne ©2009
Sınırlı Tampon (Bounded-Buffer) Problemi
Operating System Concepts – 8th Edition 6.27 Silberschatz, Galvin and Gagne ©2009
Sınırlı Tampon (Bounded-Buffer) Problemi
Üretici (producer) sürecin yapısı Tüketici (consumer) sürecin yapısı
do { do {
// produce an item in nextp wait (full);
wait (empty); wait (mutex);
wait (mutex); // remove an item from buffer to nextc
Operating System Concepts – 8th Edition 6.28 Silberschatz, Galvin and Gagne ©2009
Okuyucular-Yazıcılar (Readers-Writers)
Problemi
Bir veri kümesi koşutzamanlı süreçler arasında paylaşılır
Okuyucular (Readers) – veri kümesini sadece okurlar; herhangi bir
değişiklik yapmazlar
Yazıcılar (Writers) – hem okuyup hem de yazabilirler
do {
wait (wrt) ;
// writing is performed
signal (wrt) ;
} while (TRUE);
Operating System Concepts – 8th Edition 6.30 Silberschatz, Galvin and Gagne ©2009
Okuyucular-Yazıcılar (Readers-Writers)
Problemi
Okuyucu (reader) sürecin yapısı
do {
wait (mutex) ;
readcount ++ ;
if (readcount == 1)
wait (wrt) ;
signal (mutex)
// reading is performed
wait (mutex) ;
readcount - - ;
if (readcount == 0)
signal (wrt) ;
signal (mutex) ;
} while (TRUE);
Operating System Concepts – 8th Edition 6.31 Silberschatz, Galvin and Gagne ©2009
Yemek yiyen Filozoflar
(Dining-Philosophers) Problemi
Paylaşılan veri
Bir tencere pilav (veri kümesi)
Semafor chopstick [5] başlangıç değeri 1
Operating System Concepts – 8th Edition 6.32 Silberschatz, Galvin and Gagne ©2009
Yemek yiyen Filozoflar
(Dining-Philosophers) Problemi
Filozof i 'nin yapısı:
do {
wait ( chopstick[i] );
wait ( chopStick[ (i + 1) % 5] );
// eat
signal ( chopstick[i] );
signal (chopstick[ (i + 1) % 5] );
// think
} while (TRUE);
Operating System Concepts – 8th Edition 6.33 Silberschatz, Galvin and Gagne ©2009
Yemek yiyen Filozoflar
(Dining-Philosophers) Problemi
ÇÖZÜMLER
En fazla dört filozofun aynı anda masada oturmasına izin ver.
Bir filozofun sadece her iki tarafındaki çubuklar uygunsa çubuk almasına
izin ver.
Tek sayılı bir filozofun ilk olarak solundaki sonra sağındaki çubuğu
almasına, çift sayılı filozofun ise önce sağ sonra solundaki çubuğu almasına
izin ver.
Operating System Concepts – 8th Edition 6.34 Silberschatz, Galvin and Gagne ©2009
Semaforlarla İlgili Problemler
Operating System Concepts – 8th Edition 6.35 Silberschatz, Galvin and Gagne ©2009
Monitörler (Monitors)
Süreç senkronizasyonu için güvenilir ve etkili bir mekanizma sağlayan
üst seviye bir soyutlamadır
Monitör içerisinde aynı anda sadece tek bir süreç aktif olabilir
monitor monitor-name
{
// shared variable declarations
procedure P1 (…) { …. }
…
Operating System Concepts – 8th Edition 6.36 Silberschatz, Galvin and Gagne ©2009
Monitör'ün Şematik Görünümü
Giriş kuyruğu
paylaşılan veri
işlemler
Başlangıç
kodu
Operating System Concepts – 8th Edition 6.37 Silberschatz, Galvin and Gagne ©2009
Durum Değişkenleri (Condition Variables)
condition x, y;
Operating System Concepts – 8th Edition 6.38 Silberschatz, Galvin and Gagne ©2009
Durum Değişkenleri ile Monitör
Giriş kuyruğu
paylaşılan veri
x,y durumlarıyla
ilişkilendirilen kuyruklar
işlemler
Başlangıç
kodu
Operating System Concepts – 8th Edition 6.39 Silberschatz, Galvin and Gagne ©2009
Yemek-yiyen Filozoflara
Monitör Kullanılarak Çözüm
monitor DP
{
enum { THINKING; HUNGRY, EATING} state [5] ; void test (int i) {
condition self [5]; if ( (state[(i + 4) % 5] != EATING) &&
(state[i] == HUNGRY) &&
void pickup (int i) { (state[(i + 1) % 5] != EATING) ) {
state[i] = HUNGRY; state[i] = EATING ;
test(i); self[i].signal () ;
if (state[i] != EATING) self [i].wait; }
} }
Operating System Concepts – 8th Edition 6.40 Silberschatz, Galvin and Gagne ©2009
Yemek-yiyen Filozoflara
Monitör Kullanılarak Çözüm
DiningPhilosophers.pickup (i);
EAT
DiningPhilosophers.putdown (i);
Operating System Concepts – 8th Edition 6.41 Silberschatz, Galvin and Gagne ©2009
Semafor Kullanılarak Monitör Uygulaması
Değişkenler
semaphore mutex; // ( başlangıç değeri = 1)
semaphore next; // ( başlangıç değeri = 0)
int next-count = 0;
wait(mutex);
…
body of F;
…
if (next_count > 0)
signal(next)
else
signal(mutex);
Operating System Concepts – 8th Edition 6.42 Silberschatz, Galvin and Gagne ©2009
Semafor Kullanılarak Monitör Uygulaması
Her x durum değişkeni için:
Operating System Concepts – 8th Edition 6.43 Silberschatz, Galvin and Gagne ©2009
Tek bir Kaynağı Paylaştırmak İçin Monitör
Birden çok süreç x durum değişkeni ve x.signal() kullanılarak durdurulduysa
hangi sürecin bir sonra devam ettirileceğine karar verilmesi gerekir. En basit
çözüm FCFS kullanımıdır.
Ancak bir çok durum için bu çözüm uygun değildir.
Bu sebeple x.wait(c); biçiminde bir şartlı-bekleme yapısı kullanılabilir.
"c" değeri wait() işlemi işletildiğinde değerlendirilen bir tamsayı ifadedir.
"c" değerine öncelik numarası (priority number) adı verilir ve x.signal()
çalıştırıldığında en küçük c değerine sahip süreç işletilir.
Operating System Concepts – 8th Edition 6.44 Silberschatz, Galvin and Gagne ©2009
Tek bir Kaynağı Paylaştırmak İçin Monitör
monitor ResourceAllocator // En kısa kullanım süresine sahip sürece tahsis eder
{
boolean busy;
condition x;
void acquire(int time) { // Her süreç kaynağı max. ne kadar kullanacağını belirtir
if (busy) Problemler:
x.wait(time); • Bir süreç bir kaynağa önceden
busy = TRUE; erişim izni almadan erişebilir
} • Bir süreç kaynağa erişim
sağladıktan sonra onu serbest
void release() {
bırakmayabilir
busy = FALSE; • Bir süreç hiç istek yapmadığı bir
x.signal(); kaynağı serbest bırakmaya
} çalışabilir
initialization code() { • Bir süreç aynı kaynağa ikinci kez
busy = FALSE; istek yapabilir (birinciyi serbest
} bırakmadan)
}
Operating System Concepts – 8th Edition 6.45 Silberschatz, Galvin and Gagne ©2009
Her süreç bir kaynağa erişim istediğinde aşağıdaki süreci işletir:
Operating System Concepts – 8th Edition 6.46 Silberschatz, Galvin and Gagne ©2009
Senkronizasyon Örnekleri
Solaris
Windows XP
Linux
Pthreads
Operating System Concepts – 8th Edition 6.47 Silberschatz, Galvin and Gagne ©2009
Solaris Senkronizasyonu
Çoklu görev (multitasking), çoklu iş parçacığı (multithreading) (gerçek
zamanlı iş parçacıkları dahil) ve çoklu işlemeyi (multiprocessing)
destekleyen çok çeşitli kilitler uygulanmaktadır.
Veriyi kısa kod segmentlerinden koruma sırasında verimlilik için Adaptif
karşılıklı dışlama (adaptive mutexes) (her kritik veriye erişimi koruyan
mutex) kullanılmaktadır
Kodun daha uzun parçaları veriye erişim gereği duyduğunda Durum
değişkenleri (condition variables) ve okuyucular-yazıcılar (readers-writers)
kilitleri (lock) kullanılmaktadır
Adaptif karşılıklı dışlama (adaptive mutex) veya okuyucu-yazıcı kilidi almak
isteyen işparçacığı listesini düzenlemek için turnikeler (turnstiles)
kullanılmaktadır
Operating System Concepts – 8th Edition 6.48 Silberschatz, Galvin and Gagne ©2009
Windows XP Senkronizasyonu
Tek işlemcili sistemlerde global kaynaklara erişimi korumak için kesme
maskeleri (interrupt masks) kullanılır
Çok işlemcili sistemlerde dönen kilitler (spinlocks) (kilit beklerken süreç
dönmeye devam eder) kullanılır
Mutex veya semafor gibi davranabilecek işlemci zamanlayıcısı (dispatcher
objects) kullanılır.
İşlemci zamanlayıcılar (Dispatcher objects) ayrıca olayları (events)
oluştururlar
Bir olay çoğunlukla bir durum değişkeni gibi davranır
Operating System Concepts – 8th Edition 6.49 Silberschatz, Galvin and Gagne ©2009
Linux Senkronizasyonu
Linux:
Kernel Version 2.6'dan önce, kısa kritik alanları işletmek için kesmeler
devre dışı bırakılır, kesmeyen bir yapı mevcuttur.
Version 2.6 ve sonrası, tamamen kesendir (fully preemptive), çekirdek
görevleri işlenirken kesilebilir.
Linux'de:
Semaforlar ve
Döner kilitler (spin locks) kullanılmaktadır
Operating System Concepts – 8th Edition 6.50 Silberschatz, Galvin and Gagne ©2009
Pthreads Senkronizasyonu
Operating System Concepts – 8th Edition 6.51 Silberschatz, Galvin and Gagne ©2009
Bölüm 6 Sonu
Operating System Concepts – 8th Edition, Silberschatz, Galvin and Gagne ©2009