Bugün farklı bir kayıt girmek istiyorum. İşletim Sistemlerinden gideceğiz. Konumuz Race Condition'ı Çözmek...
Kısaca Race Condition ne demek onu hatırlayalım:ortak alana hangi process'in önce gireceği, oradaki değeri kimin alacağı ve nasıl değiştireceği gibi sorunlar en temel anlamda race condition'dır. İsminden belli zaten, process'ler birbirleriyle yarış halindedirler, alana girebilmek için. İşte bunun önüne nasıl geçebiliriz? Bugünkü konumuz başlıyor...
İki ana başlık altında inceleyebiliriz:
- Busy Waiting
- Sleep and Wakeup
- Disabling Interrupts
- Lock Variables
- Strict Alternation
- Peterson's Solution
- TSL(Test and Set Lock) Instruction
Lock Variables'a gelelim. Lock adında ortak bir değişken yaratırız. Kritik bölgeye girecek olan process "lock"a bakar. Lock=0(sıfır) ise girer, içerisi boş demektir. Lock=1 ise girmez, içerisi dolu demektir. Lock=0 iken bir process içeri girerse, Lock değeri 1 olur ve diğer "process"ler bu değerin sıfıra dönmesini beklerler. Ancak Lock'ın kendisi "race condition"a sebep olur.
Şöyle bir senaryo üzerinden anlatalım: A process'i lock değerine bakarken sleep moda düşsün. Ardından B process'i de lock'a baksın, boş olduğunu görsün ve o da sleep moda düşsün. Akabinde A process'i uyansın ve haliyle daha önce boş olduğunu gördüğü alana girsin. Ardından da B process'i uyansın ve o da en son kritik bölgenin boş olduğunu gördüğünden, alana girmeye teşebbüs etsin... The End! :)
Strict Alternation ise Lock Variables'ın aşağı yukarı aynısı. Onda da 1 ve 0 kontrolü yaparsınız. Bunda şu var: kritik alanın sıfıra dönmesini bekleyen process yavaş davranırsa, alana girememe ihtimali var. Örneğin büyük çapta I/O yapan bir process ise "rest in peace". :)
Gelelim Peterson's Solution'a. Bu yöntemde de bir dizi oluşturulur ve her process için dizide bir eleman tutulur. Her process dizide kendisi için tutulan variable'ı diğer yöntemlerdeki gibi 1 veya 0 yapar. Örneğin A process'i alana girdiğinde dizideki değişkenini 1 yapar. B process'i de diziye girememiş olur. A process'inin değişkeni sıfır olmadan B kendi değişkenini 1 yapamaz. Ancak aynı sorunlar bu yöntemde de mevcuttur.
TSL Instruction ise son Busy Waiting yöntemimiz. Bunda test ve lock işleri tek bir operasyonda olur. Donanımsal bir destekle yürütülen bu yöntem şöyle işler: A lock'a baktı. Sıfır olduğunu gördü. Önceki yöntemlerde sleep moda düşebiliyordu. Burda o engellenmiş. Yani A process'i için o değer 1'e çekilmeden, A process'ini sleep ettirmiyoruz.
Herşey muhteşem oldu diyorsanız, yanılıyorsunuz. Çünkü biz A process'inin sleep olmadan lock değerini bir yaptırdıktan sonra, lock sıfıra çekilinceye kadarB process'i bekliyor. Yani CPU zamanı boşa gitmiş oluyor. Ki bu tüm Busy Waiting yöntemlerinin ortak sorunu aslında. Peki ne yapabiliriz? İşte ikinci maddemiz... :)
Sleep And Wakeup yöntemi ile, bir process kritik alana girdiyse, ardından başka bir process de alana girmek istiyorsa, o istekli arkadaşı bloke ediyoruz. Yani içerisinin boşa düşmesini beklerken, CPU vakti de boşa harcanmamış oluyor zatı şahaneleri için. İçerisi boşa düştüğünde wakeup mesajı gönderiyoruz ve kendilerini uyandırıyoruz. Yalnız bu yöntemimizin de ufak mı ufak bir kusuru var. Ya "wakeup" mesajı kaybolursa... İşte böyle bir durum olursa, o process bir daha aramıza katılamaz.
Böylelikle Race Condition'a karşı geliştirilen yöntemleri görmüş olduk.
Görüşmek üzere..
3 yorum:
planlama(scheduling) gerçekleştirme race condition için geliştirilen bir çözüm müdür?
teşekkürler sınavım için bayagı iyi oldu
eyvallah hocam eline sağlık
Yorum Gönder