Bölüm 6: Senkronizasyon
Giriş
Nasıl Çalışalım?
Kod sorularında satırlar elle izlenir; her adım tek bir makine işlemi kabul edilir. Semaforlarda wait (P, down) değeri 1 azaltır ve sonuç negatifse çağıranı bloke eder; signal (V, up) değeri 1 artırır ve bekleyen varsa birini uyandırır.
Soru 1 · Yarış Durumu ve Kritik Bölge
Kaybolan Artışlar
İki iş parçacığı, paylaşılan sayac değişkenini kilitsiz olarak 500’er kez artırıyor. Program her çalıştırmada 1000 yerine 734, 912 gibi farklı sonuçlar veriyor. Bu olgunun adı nedir?
- Kilitlenme (deadlock)
- Yarış durumu (race condition)
- Açlık (starvation)
- Canlı kilit (livelock)
- Öncelik terslemesi
Cevabı göster
Doğru cevap: B) Yarış durumu (race condition)
Sonuç, paylaşılan veriye eşzamanlı erişimlerin sırasına bağlıdır: sayac++ oku–artır–yaz adımlarına ayrılır ve araya giren iş parçacığının güncellemesi kaybolur. Çözüm, artırmayı kritik bölge olarak korumak ya da atomik artırma kullanmaktır.
Soru 2 · Yarış Durumu ve Kritik Bölge
Araya Girme İzleme
Başlangıçta sayac = 5. T1 sayac = sayac + 1, T2 sayac = sayac + 2 çalıştırır; her biri LOAD, ADD, STORE olarak derlenir. Sıra: T1 LOAD, T2 LOAD, T2 ADD, T2 STORE, T1 ADD, T1 STORE. Son değer nedir? Tüm olası son değerler nelerdir?
Cevabı göster
Son değer 6: T1 eski değeri (5) okuduğu için T2’nin yazdığı 7’nin üzerine 6 yazar; T2’nin güncellemesi kaybolur. Olası sonuçlar 6, 7, 8’dir: sıralı çalışırlarsa 8, T1’in güncellemesi kaybolursa 7, T2’ninki kaybolursa 6.
Soru 2 · Çözüm
Adım Adım Çözüm
Her satır tek bir makine işlemidir; R1 ve R2 iş parçacıklarının kendi yazmaçlarıdır.
Başlangıç: sayac = 5; iki iş parçacığı da artırma yapacak.
T1 değeri yazmacına okur (5). Ardından zamanlayıcı T2’ye geçer.
T2 de 5 okur: iki iş parçacığı aynı eski değeri tutuyor.
T2 artırır ve 7 yazar.
T1 elindeki eski 5’i artırıp 6 yazar: T2’nin +2’si kayboldu.
T1: LOAD R1, sayac T2: LOAD R2, sayac T2: ADD R2, 2 T2: STORE sayac, R2 T1: ADD R1, 1 T1: STORE sayac, R1
Soru 3 · Yarış Durumu ve Kritik Bölge
Çözümün Üç Koşulu
Kritik bölge problemine bir çözümün sağlaması gereken üç koşulu yazın. “Sınırlı bekleme” koşulunu kesin biçimde tanımlayın.
Cevabı göster
- Karşılıklı dışlama: Aynı anda en fazla bir süreç kritik bölgesinde olabilir.
- İlerleme: Kritik bölgede kimse yokken, girmek isteyenler arasından seçim sonsuza ertelenemez ve seçime yalnızca girmek isteyenler katılır.
- Sınırlı bekleme: Bir süreç giriş isteğinde bulunduktan sonra, isteği karşılanana dek diğer süreçlerin kritik bölgeye kaç kez girebileceğinin bir üst sınırı vardır; bu açlığı önler.
Ayrıca hiçbir varsayım CPU sayısı ya da hızı üzerine kurulmamalıdır.
Soru 4 · Yarış Durumu ve Kritik Bölge
Kilit Gerekmeyen Durum
Bir yapılandırma tablosu program başlarken bir kez dolduruluyor, ardından 8 iş parçacığı onu yalnızca okuyor; tabloya bir daha yazılmıyor. Hangisi doğrudur?
- Her okuma bir mutex ile korunmalıdır, yoksa yarış durumu oluşur.
- Okumalar için senkronizasyon gerekmez; hiçbir iş parçacığı veriyi değiştirmiyor.
- Tablo bir semaforla korunmalı ve semaforun başlangıç değeri 0 olmalıdır.
- Yalnızca tek çekirdekli makinelerde güvenlidir.
- Okuyucular birbirini kilitlenmeye sokabilir.
Cevabı göster
Doğru cevap: B) Okumalar için senkronizasyon gerekmez; hiçbir iş parçacığı veriyi değiştirmiyor.
Yarış durumu için en az bir erişimin yazma olması gerekir. Yalnızca okunan veri eşzamanlı olarak güvenle paylaşılır (tablonun doldurulması iş parçacıkları başlamadan bitmiş olmalıdır).
Soru 5 · Yarış Durumu ve Kritik Bölge
Hangisi Eşzamanlılık Sorunu Değil?
Aşağıdakilerden hangisi eşzamanlı (concurrent) programlarda karşılaşılan bir sorun değildir?
- Kilitlenme
- Canlı kilit
- Yarış durumu
- Açlık
- Belady anomalisi
Cevabı göster
Doğru cevap: E) Belady anomalisi
Belady anomalisi FIFO sayfa değiştirmede çerçeve sayısı artarken sayfa hatasının da artabilmesidir (Bölüm 9); eşzamanlılıkla ilgisi yoktur. Diğer dördü birden çok iş parçacığının etkileşiminden doğar.
Soru 6 · Yarış Durumu ve Kritik Bölge
Hangisi Senkronizasyon Aracı Değil?
Aşağıdakilerden hangisi bir senkronizasyon aracı (ilkeli) değildir?
- Sayan semafor
- Monitör
- Koşul değişkeni
- Okur-yazar kilidi
- Önbellek satırı (cache line)
Cevabı göster
Doğru cevap: E) Önbellek satırı (cache line)
Önbellek satırı, belleğin önbellekte taşındığı donanım birimidir; erişimi düzenlemez. Semafor, monitör, koşul değişkeni ve okur-yazar kilidi paylaşılan kaynağa erişimi koordine eden araçlardır.
Soru 7 · Yarış Durumu ve Kritik Bölge
Kesmeleri Kapatmak
Aşağıdaki ifade doğru mu, yanlış mı? Gerekçenizi yazın.
“Kullanıcı programlarının kritik bölgeye girerken kesmeleri kapatması, hem tek hem çok çekirdekli sistemler için iyi bir çözümdür.”
Cevabı göster
Yanlış. Kesmeleri kapatmak ayrıcalıklı bir işlemdir; kullanıcıya verilirse süreç bir daha açmayarak sistemi ele geçirebilir. Çok çekirdekte de işe yaramaz: yalnızca kendi çekirdeğindeki kesmeler kapanır, diğer çekirdekler belleğe erişmeye devam eder. Yöntem yalnızca çekirdeğin kendi içinde, çok kısa bölümler için kullanılır.
Soru 8 · Donanım Desteği ve Spinlock
Dönerek Bekleyen Kilit
Kilidi alamayan iş parçacığı uyumuyor; bir döngü içinde kilit değişkenini durmadan yeniden sınıyor. Bu davranış hangi yapıya özgüdür?
- Futex tabanlı mutex
- Koşul değişkeni
- Döngüsel kilit (spinlock)
- Monitör
- Mesaj kuyruğu
Cevabı göster
Doğru cevap: C) Döngüsel kilit (spinlock)
Spinlock meşgul bekleme (busy waiting) yapar: bekleyen CPU’yu bırakmaz. Mutex, koşul değişkeni ve monitörde bekleyen iş parçacığı uyutulur ve kuyruğa alınır; CPU başkasına verilir.
Soru 9 · Donanım Desteği ve Spinlock
Spinlock Ne Zaman Mantıklı?
Spinlock hangi durumda uyuyan bir mutex’ten daha uygun olur?
- Tek çekirdekli bir makinede, kilit uzun süre tutulurken
- Kilit tutulurken disk G/Ç’si bekleniyorsa
- Çok çekirdekli makinede, kritik bölge iki bağlam değiştirmeden daha kısa sürüyorsa
- Kullanıcı arayüzü iş parçacığında, saniyelerce süren işlemlerde
- Bekleyen iş parçacığı sayısı çok fazlaysa
Cevabı göster
Doğru cevap: C) Çok çekirdekli makinede, kritik bölge iki bağlam değiştirmeden daha kısa sürüyorsa
Kısa beklemede dönmek, uyuyup uyanmanın (iki bağlam değiştirme) maliyetinden ucuzdur. Tek çekirdekte dönen iş parçacığı kilidi tutanın çalışmasını engeller; uzun beklemede ise CPU çevrimleri boşa harcanır.
Soru 10 · Donanım Desteği ve Spinlock
TSL ile Kilit
Kilit while (test_and_set(&kilit)) ; ile alınıyor, kilit = 0 ile bırakılıyor (başlangıçta 0). T1 kilidi alıyor; ardından T2 deniyor ve T1 kilidi bırakana kadar 3 tur dönüyor; sonra T2 kilidi alıyor. Çalışan TSL çağrılarının döndürdüğü değerler sırasıyla nedir? T2 kaç kez TSL çalıştırır?
Cevabı göster
Dönüş değerleri 0, 1, 1, 1, 0. T1’in tek çağrısı 0 döner (kilit boştu, artık 1). T2’nin ilk üç çağrısı 1 döner (kilit dolu); T1 kilit = 0 yaptıktan sonraki çağrı 0 döner. T2 toplam 4 kez TSL çalıştırır. TSL eski değeri döndürüp 1 yazmayı tek atomik adımda yapar.
Soru 10 · Çözüm
Adım Adım Çözüm
T1 ve T2 aynı fonksiyonları çağırır; TSL tek atomik komuttur.
Kilit boş.
T1: TSL 0 döndürür ve kilidi 1 yapar → döngüden çıkar, kritik bölgeye girer.
T2: TSL 1 döner (kilit doluydu); 1 yeniden yazılır. T2 döner.
T2 iki tur daha döner: CPU çevrimleri yararlı iş yapılmadan harcanır.
T1 kritik bölgeden çıkar: kilit = 0.
T2’nin dördüncü TSL çağrısı 0 döner → T2 kritik bölgeye girer.
int kilit = 0;
void gir(void) {
while (test_and_set(&kilit))
; /* dön */
}
void cik(void) {
kilit = 0;
}Soru 11 · Donanım Desteği ve Spinlock
Peterson: Kim Girer?
Peterson algoritmasında P0 ve P1 aynı anda girmek istiyor. Sıra: P0 flag[0] = 1; P1 flag[1] = 1; P1 turn = 0; P0 turn = 1; sonra ikisi de while koşulunu sınıyor. Kritik bölgeye hangisi girer, neden?
Cevabı göster
P1 girer. turn’e son yazan P0 olduğu için turn = 1 kalır. P0’ın koşulu flag[1] && turn == 1 doğrudur → P0 bekler. P1’in koşulu flag[0] && turn == 0 yanlıştır → P1 girer. Sırayı karşıya son veren bekler; bu, ikisinin aynı anda girmesini engeller.
Soru 11 · Çözüm
Adım Adım Çözüm
i: kendi numarası, j = 1 − i: karşı taraf. Satırlar iki süreçte de aynı koddur.
Başlangıç: kimse girmek istemiyor.
P0 (i = 0) niyetini bildirir.
P1 (i = 1) de niyetini bildirir.
P1 sırayı P0’a verir: turn = 0.
P0 sırayı P1’e verir: turn = 1 (son yazan P0).
P0: flag[1] = 1 ve turn == 1 → koşul doğru, P0 döner.
P1: turn == 0 yanlış → döngüden çıkar ve kritik bölgeye girer.
P1 çıkınca flag[1] = 0; P0’ın koşulu yanlışlanır ve P0 girer.
int flag[2] = {0, 0};
int turn;
void gir(int i) {
int j = 1 - i;
flag[i] = 1; /* niyetliyim */
turn = j; /* sıra sende */
while (flag[j] && turn == j)
;
}
void cik(int i) { flag[i] = 0; }Soru 12 · Donanım Desteği ve Spinlock
Peterson Bugün
Aşağıdaki ifade doğru mu, yanlış mı? Gerekçenizi yazın.
“Peterson algoritması, modern çok çekirdekli işlemcilerde ek önlem almadan yazıldığı gibi doğru çalışır.”
Cevabı göster
Yanlış. Derleyici ve işlemci, birbirinden bağımsız görünen flag[i] = 1 yazmasıyla flag[j] okumasının sırasını değiştirebilir (yazma tamponu). İki süreç de karşının bayrağını 0 görüp birlikte girebilir. Doğru çalışması için bellek bariyeri ya da atomik (ör. volatile/atomic) değişkenler gerekir.
Soru 13 · Donanım Desteği ve Spinlock
CAS’ın Anlamı
compare_and_swap(&v, beklenen, yeni) komutu için hangisi doğrudur?
- v’yi her zaman yeni yapar ve hiçbir şey döndürmez.
- v == beklenen ise v’ye yeni değeri yazar; her durumda v’nin eski değerini döndürür ve bunu tek atomik adımda yapar.
- v’yi beklenen ile karşılaştırır, eşitse çağıranı uyutur.
- Yalnızca tek çekirdekli işlemcilerde atomiktir.
- Bir sistem çağrısıdır; çekirdek kipine geçmeden kullanılamaz.
Cevabı göster
Doğru cevap: B) v == beklenen ise v’ye yeni değeri yazar; her durumda v’nin eski değerini döndürür ve bunu tek atomik adımda yapar.
CAS, kilitsiz algoritmaların temelidir: do { eski = v; } while (CAS(&v, eski, eski + 1) != eski); döngüsü araya başka yazma girerse yeniden dener. Kullanıcı kipinde çalışan sıradan bir komuttur (x86’da LOCK CMPXCHG).
Soru 14 · Semafor ve Mutex
Mutex ile Semafor
Mutex ile sayan semafor arasındaki fark için en doğru ifade hangisidir?
- Semafor yalnızca 0 ve 1 değerlerini alabilir; mutex ise herhangi bir tamsayıyı.
- Mutex’in sahibi vardır ve yalnızca kilitleyen açar; sayan semaforun sahibi yoktur ve değeri N özdeş kaynağı sayabilir.
- Semafor her zaman meşgul bekleme yapar, mutex hiçbir zaman yapmaz.
- Mutex yalnızca süreçler arasında, semafor yalnızca iş parçacıkları arasında kullanılır.
- İkisi arasında kavramsal hiçbir fark yoktur.
Cevabı göster
Doğru cevap: B) Mutex’in sahibi vardır ve yalnızca kilitleyen açar; sayan semaforun sahibi yoktur ve değeri N özdeş kaynağı sayabilir.
Mutex karşılıklı dışlama için ikili bir kilittir (kilitli/açık) ve sahiplik taşır. Sayan semafor N’e kadar eşzamanlı erişime izin verebilir ve signal’ı başka bir iş parçacığı yapabilir; bu yüzden sıralama/haber verme için de kullanılır.
Soru 15 · Semafor ve Mutex
Bağlantı Havuzu
Bir veritabanına aynı anda en fazla 5 bağlantı açılmasına izin verilecek. Her iş parçacığı bağlanmadan önce wait(S), bağlantıyı kapatınca signal(S) çağırıyor. S’nin başlangıç değeri ne olmalıdır?
- 0
- 1
- 4
- 5
- 6
Cevabı göster
Doğru cevap: D) 5
Sayan semaforun başlangıç değeri, aynı anda kullanılabilecek kaynak sayısıdır. 5 iş parçacığı geçer, altıncı wait değeri negatife düşürür ve bloke olur. Başlangıç 1 karşılıklı dışlama, 0 ise sıralama kalıbı içindir.
Soru 16 · Semafor ve Mutex
Semafor İzleme
Sayan semafor S = 2 ile başlıyor; bekleme kuyruklu gerçekleme kullanılıyor (değer negatife inebilir). Sıra: P1 wait, P2 wait, P3 wait, P4 wait, P1 signal, P5 wait, P2 signal. Sonunda S kaçtır? Kimler kaynağı kullanıyor, kimler bekliyor?
Cevabı göster
Son değer S = −1. Kaynakta P3 ve P4, kuyrukta P5 var. Negatif değerin mutlak değeri bekleyen süreç sayısına eşittir.
Soru 16 · Çözüm
Adım Adım Çözüm
wait: S ← S − 1; S < 0 ise bloke. signal: S ← S + 1; S ≤ 0 ise kuyruktan birini uyandır.
Başlangıç: S = 2, iki kaynak boşta.
P1 wait → 1, P2 wait → 0: ikisi de geçer.
P3 wait → −1, P4 wait → −2: ikisi de bloke olur ve kuyruğa girer.
P1 signal → −1 (≤ 0): kuyruğun başındaki P3 uyandırılır ve kaynağı alır.
P5 wait → −2: P5 de kuyruğa girer.
P2 signal → −1: P4 uyanır. Son durum: S = −1, kaynakta P3 ve P4, kuyrukta P5.
Soru 17 · Semafor ve Mutex
Semaforun Son Değeri
Başlangıç değeri 3 olan bir semaforda toplam 5 wait ve 2 signal işlemi yapılıyor (signal’ları kaynağı kullanmakta olan süreçler yapıyor). İşlemler hangi sırayla gelirse gelsin, sonunda semaforun değeri ve bekleyen süreç sayısı nedir?
- −2; 2 süreç bekler
- 0; kimse beklemez
- 0; 2 süreç bekler
- 1; kimse beklemez
- Sıraya bağlıdır, söylenemez
Cevabı göster
Doğru cevap: B) 0; kimse beklemez
Değer 3 − 5 + 2 = 0; her işlem değeri tam 1 değiştirdiği için sıra sonucu etkilemez. Değer negatif değilse kuyrukta kimse yoktur: bekleyen 0. (Sıra yalnızca ara durumları, örneğin kimin ne kadar beklediğini değiştirir.)
Soru 18 · Semafor ve Mutex
Sırayı Semaforla Kurmak
P1’deki A() çağrısı, P2’deki B() çağrısından önce tamamlanmalı; süreçler herhangi bir sırayla başlayabilir. Tek bir semaforla çözümü yazın ve başlangıç değerini gerekçelendirin.
Cevabı göster
semafor s = 0; /* P1 */ A(); signal(s); /* P2 */ wait(s); B();
Başlangıç 0: P2 önce gelirse wait onu bloke eder; P1 A()’yı bitirip signal yapınca P2 uyanır. P1 önce gelirse değer 1 olur ve P2 beklemeden geçer. Başlangıç 1 olsaydı P2 hiç beklemezdi.
Soru 19 · Semafor ve Mutex
Ters Sıralı down
Sınırlı tamponlu üretici-tüketici çözümünde üretici yanlışlıkla önce down(&mutex), sonra down(&bos) yapıyor (tüketici doğru sırada). Tampon tamamen doluyken üretici çalışırsa ne olur?
- Hiçbir şey olmaz; üretici bekler ve tüketici yer açınca devam eder.
- Kilitlenme olur: üretici mutex’i tutarak bos’ta uyur, tüketici mutex’te bloke olur.
- Tampon taşar ve bir öğe kaybolur.
- Tüketici boş bir tampondan okur.
- Üretici meşgul beklemeye girer ama sonunda devam eder.
Cevabı göster
Doğru cevap: B) Kilitlenme olur: üretici mutex’i tutarak bos’ta uyur, tüketici mutex’te bloke olur.
Kilitlenme. Üretici mutex’i alır, bos = 0 olduğu için down(&bos)’ta mutex’i tutarak uyur. Tüketici down(&dolu)’dan geçer ama down(&mutex)’ta bloke olur. Üretici tüketicinin yer açmasını, tüketici üreticinin mutex’i bırakmasını bekler. Doğrusu önce sayan semafor, sonra mutex’tir.
Soru 19 · Çözüm
Adım Adım Çözüm
N = 2’lik tampon dolu: bos = 0, dolu = 2, mutex = 1. Üreticide iki down yer değiştirmiş.
Tampon dolu: üretici yer, tüketici mutex bekleyecek mi?
Üretici mutex’i alır (1 → 0).
bos 0 → üretici bloke olur, mutex’i bırakmadan uyur.
Tüketici çalışır: dolu 2 → 1, geçer.
mutex 0 → tüketici de bloke olur. İkisi birbirini bekliyor: kilitlenme.
void uretici(void) {
down(&mutex); /* HATA: sıra ters */
down(&bos);
koy(oge);
up(&mutex);
up(&dolu);
}
void tuketici(void) {
down(&dolu);
down(&mutex);
al();
up(&mutex);
up(&bos);
}Soru 20 · Semafor ve Mutex
Koşul Değişkeninde Bekleme
Bir iş parçacığı mutex’i tutarken pthread_cond_wait(&c, &m) çağırıyor. Bu çağrı ne yapar?
- Mutex’i tutmaya devam eder ve koşul doğru olana kadar döner.
- Mutex’i atomik olarak bırakıp uyur; uyandırıldığında dönmeden önce mutex’i yeniden alır.
- Mutex’i bırakır ve uyandığında mutex’siz devam eder.
- Koşulu kendisi sınar; yanlışsa hata döndürür.
- Diğer tüm bekleyenleri uyandırır.
Cevabı göster
Doğru cevap: B) Mutex’i atomik olarak bırakıp uyur; uyandırıldığında dönmeden önce mutex’i yeniden alır.
Bırakma ve uyuma tek atomik adımdır; böylece arada gelen signal kaybolmaz. Dönüşte mutex yeniden tutulduğundan koşul güvenle yeniden sınanabilir.
Soru 21 · Semafor ve Mutex
if Yeterli mi?
Aşağıdaki ifade doğru mu, yanlış mı? Gerekçenizi yazın.
“Mesa anlamlı koşul değişkenlerinde wait’ten dönen iş parçacığı koşulun doğru olduğundan emin olabilir; bu yüzden while yerine if ile sınamak yeterlidir.”
Cevabı göster
Yanlış. Mesa anlamında signal yalnızca bir ipucudur: uyanan iş parçacığı mutex’i yeniden alana kadar başka biri koşulu bozmuş olabilir; ayrıca sahte (spurious) uyanmalar olabilir. Koşul her zaman while döngüsünde yeniden sınanmalıdır.
Soru 22 · Klasik Problemler
Yedi Filozof
Yuvarlak masada 7 filozof ve aralarında 7 çatal var; her filozof yemek için sağındaki ve solundaki iki çatala ihtiyaç duyuyor. Aynı anda en fazla kaç filozof yemek yiyebilir?
- 1
- 2
- 3
- 4
- 7
Cevabı göster
Doğru cevap: C) 3
Her yiyen filozof 2 çatal tutar ve yan yana iki filozof aynı anda yiyemez: ⌊7 / 2⌋ = 3. Çatallar paylaşılan kaynakları, filozoflar bu kaynaklar için yarışan süreçleri temsil eder.
Soru 23 · Klasik Problemler
Filozoflar ve Kilitlenme
Her filozofun önce sol, sonra sağ çatalı aldığı naif çözüm neden kilitlenebilir? Kilitlenmeyi önleyen üç farklı yaklaşım yazın.
Cevabı göster
Herkes aynı anda sol çatalını alırsa her filozof bir çatal tutup komşusunun çatalını bekler: döngüsel bekleme → kilitlenme.
- Sıralama: Çatallar numaralanır, her filozof önce küçük numaralıyı alır (ya da bir filozof ters sırayla alır); döngü kırılır.
- Masaya en çok N − 1 kişi: Başlangıcı N − 1 olan bir semaforla oturanlar sınırlanır; en az biri iki çatalı alabilir.
- İkisini birden al: Filozof iki çatal da boşsa ikisini mutex altında atomik olarak alır; yoksa bekler (durum dizisi + filozof başına semafor).
Soru 24 · Klasik Problemler
Okur Öncelikli Çözüm
Okur öncelikli okur-yazar çözümünde üç okur veriyi okurken bir yazar geliyor; ardından sürekli yeni okurlar gelmeye devam ediyor. Ne olur?
- Yazar hemen girer, okurlar dışarı atılır.
- Yeni okurlar da girebildiği için yazar süresiz bekleyebilir (yazar açlığı).
- Okurlar ve yazar aynı anda çalışır.
- Sistem kilitlenir.
- Yeni gelen okurlar yazarın arkasında bekler.
Cevabı göster
Doğru cevap: B) Yeni okurlar da girebildiği için yazar süresiz bekleyebilir (yazar açlığı).
Okur öncelikli çözümde içeride okur olduğu sürece yeni okurlar beklemeden girer; okur akışı kesilmezse yazar hiç giremez. Yazar öncelikli çözüm bunu tersine çevirir ve okurları aç bırakabilir; adil çözümler geliş sırasını korur.
Soru 25 · Klasik Problemler
Tur Sonu Buluşması
4 iş parçacığı bir matrisin farklı satırlarını işliyor; bir sonraki tura ancak hepsi mevcut turu bitirdiğinde geçilebilir. Bunun için en uygun araç hangisidir?
- Spinlock
- Bariyer (barrier)
- Okur-yazar kilidi
- İkili semafor ile karşılıklı dışlama
- Atomik artırma
Cevabı göster
Doğru cevap: B) Bariyer (barrier)
Bariyer, katılımcıların tümü aynı noktaya gelene kadar her birini bekletir; son gelen hepsini serbest bırakır. Diğer araçlar karşılıklı dışlama ya da sayma sağlar, “herkes gelsin” koşulunu doğrudan kurmaz.
Soru 26 · Öncelik Terslemesi ve Canlılık
Bir Ters Senaryo
Düşük öncelikli L bir kilidi tutuyor. Yüksek öncelikli H aynı kilidi isteyip bloke oluyor. Bu sırada kilitle ilgisi olmayan orta öncelikli M gelip uzun süre CPU’yu kullanıyor; H, M bitene kadar ilerleyemiyor. Bu durumun adı ve tipik çözümü nedir?
- Kilitlenme; süreçlerden biri sonlandırılır.
- Öncelik terslemesi; öncelik kalıtımı (L geçici olarak H’nin önceliğini alır).
- Konvoy etkisi; FCFS’e geçilir.
- Canlı kilit; rastgele geri çekilme uygulanır.
- Yarış durumu; kilit kaldırılır.
Cevabı göster
Doğru cevap: B) Öncelik terslemesi; öncelik kalıtımı (L geçici olarak H’nin önceliğini alır).
Yüksek öncelikli süreç, düşük öncelikli bir sürecin (ve onu kesen orta öncelikli işlerin) arkasında kalır: öncelik terslemesi. Öncelik kalıtımıyla L kilidi tutarken H’nin önceliğiyle çalışır, M onu kesemez.
Soru 27 · Öncelik Terslemesi ve Canlılık
Terslemeyi Hesaplamak
Kesmeli öncelik çizelgelemesi. L (düşük) t = 0’da kilidi alır, kritik bölgesi 3 birim sürer. H (yüksek) t = 1’de gelir, hemen kilidi ister; kilit alındıktan sonra 2 birim çalışır. M (orta) t = 2’de gelir, 6 birim çalışır, kilide ihtiyacı yoktur. Öncelik kalıtımı olmadan ve varken H kilidi kaç birim bekler, H ne zaman biter?
Cevabı göster
- Kalıtım yok: L 0–2, M 2–8 (L’yi keser), L 8–9 kilidi bırakır, H 9–11. H 8 birim bekler, t = 11’de biter.
- Kalıtım var: t = 1’de L, H’nin önceliğini alır; M onu kesemez. L 0–3, H 3–5, M 5–11. H 2 birim bekler, t = 5’te biter.
Soru 27 · Çözüm
Adım Adım Çözüm
KB: L’nin kilitli kritik bölgesi. Kırmızı: H’nin kilit için bloke kaldığı süre.
t = 1: H gelir, kilidi ister ve bloke olur; L kritik bölgesine devam eder. t = 2’de M gelir.
Kalıtım yok: M, L’den yüksek öncelikli olduğu için L’yi keser ve 6 birim çalışır. H, hiç ilgisi olmayan M’yi bekliyor.
L 8–9’da kritik bölgeyi bitirip kilidi bırakır; H 9–11 çalışır. H’nin bekleme süresi 8 birim.
Kalıtım var: L, t = 1’den itibaren H’nin önceliğiyle çalışır, 3’te kilidi bırakır; H 3–5, M 5–11. H yalnızca 2 birim bekler.
Soru 28 · Öncelik Terslemesi ve Canlılık
Tersleme Bir Kilitlenme mi?
Aşağıdaki ifade doğru mu, yanlış mı? Gerekçenizi yazın.
“Öncelik terslemesi bir kilitlenme türüdür; dışarıdan müdahale edilmezse ilgili süreçler sonsuza dek bekler.”
Cevabı göster
Yanlış. Terslemede döngüsel bekleme yoktur: orta öncelikli işler bitince L çalışır, kilidi bırakır ve H ilerler. Sorun, H’nin sınırsız ve öngörülemez gecikmesidir; gerçek zamanlı sistemlerde son teslimlerin kaçmasına yol açar. Çözümler: öncelik kalıtımı, öncelik tavanı protokolü.
Soru 29 · Öncelik Terslemesi ve Canlılık
Kibar İş Parçacıkları
İki iş parçacığı ikişer kilit istiyor. Her biri ikinci kilidi alamayınca elindekini bırakıp hemen yeniden deniyor. İkisi de sürekli çalışıyor ama hiçbiri işini bitiremiyor. Durumun adı ve uygun çözüm nedir?
- Kilitlenme; kaynak sıralaması
- Canlı kilit (livelock); yeniden denemeden önce rastgele süre beklemek (geri çekilme)
- Öncelik terslemesi; öncelik kalıtımı
- Yarış durumu; atomik değişken
- Açlık; yaşlanma
Cevabı göster
Doğru cevap: B) Canlı kilit (livelock); yeniden denemeden önce rastgele süre beklemek (geri çekilme)
Canlı kilitte süreçler bloke değildir, durum değiştirip dururlar ama ilerleme yoktur. Rastgele ya da üstel geri çekilme, iki tarafın aynı anda yeniden denemesini bozarak birinin ilerlemesini sağlar. Öncelik kalıtımı canlı kilidi değil terslemeyi çözer.
Soru 30 · Öncelik Terslemesi ve Canlılık
Kilidin Yan Etkisi Değil
Aşağıdakilerden hangisi kilit kullanımının yol açabileceği sorunlardan biri değildir?
- Kilitlenme
- Öncelik terslemesi
- Spinlock’ta meşgul bekleme ile CPU israfı
- Kilit çekişmesi nedeniyle ölçeklenememe
- Dış parçalanma
Cevabı göster
Doğru cevap: E) Dış parçalanma
Dış parçalanma bellek tahsisinin sorunudur (Bölüm 8). İlk dördü kilitlerin doğrudan sonuçlarıdır; çekişmeyi azaltmak için kritik bölgeler kısa tutulur ve kilitler inceltilir (ör. çekirdek başına sayaç).
Soru 31 · Öncelik Terslemesi ve Canlılık
İki ATM
Bir hesapta 1000 TL var. İki ATM aynı anda bu hesaptan 800’er TL çekmeye çalışıyor; her biri “bakiye ≥ tutar ise bakiye ← bakiye − tutar” yapıyor. Kritik bölgeyi belirleyin, hatalı bir araya girme senaryosu verin ve düzeltin.
Cevabı göster
Kritik bölge: bakiyenin okunmasından, sınanmasından güncellenmesine kadar olan bölüm.
Hata: ATM1 1000’i okuyup koşulu doğru bulur; araya ATM2 girer, o da 1000’i okur. İkisi de 800 öder: hesap −600’e düşer ya da bir güncelleme kaybolup bakiye 200 görünür.
Düzeltme: sınama ve güncellemeyi aynı kilit altında tek bir bütün olarak yapmak (hesap başına mutex ya da veritabanı işlemi). Böylece ikinci ATM güncel 200’ü görür ve reddeder.
Özet
Özet: Sık Yapılan Hatalar
- Mutex ile ikili semaforu tamamen aynı sanmak: mutex’i yalnızca kilitleyen açar; semafora başka bir iş parçacığı
signalverebilir. - Sayan semaforun başlangıç değerini 1 yazmak: değer, aynı anda izin verilen kaynak sayısıdır; sıralama kalıbında 0’dır.
- Sınırlı tamponda
downsırasını değiştirmek: önce sayan semafor, sonra mutex; ters sıra kilitlenme yaratır. - Koşul değişkenini
ifile sınamak: Mesa anlamında daimawhile. - Spinlock’u tek çekirdekte ya da uzun beklemede kullanmak: CPU boşa döner, kilit sahibinin çalışması gecikir.
- Öncelik terslemesini kilitlenme, canlı kilidi açlık sanmak; çözümleri karıştırmak (kalıtım ↔ geri çekilme).