Kritik Bölümler (Critical Sections)

tarafından
145
Kritik Bölümler (Critical Sections)

Kritik Bölümler (Critical Sections)Bir program içerisinde ortak olarak paylaşılan alanlara erişim yapılan kod bölümlerine kritik bölge(critical section) denilir.Yarış durumlarından sakınmak için karşılıklı dışlama (mutual exclusion) yöntemi kullanılır. Bir süreç ortak değişken üzerinde işlem yapıyorsa başka bir süreç bu değişken üzerinde işlem yapamaz ve dışlanır.Örnekteki problem, A sürecinin girdi değişkeni ile işi bitmeden B sürecinin bu değişkeni kullanmasından kaynaklanmaktadır.Karşılıklı Dışlamada Dikkat Edilmesi Gerekenler

  1. İki süreç aynı anda kritik bölge içerisine
  2. Kritik bölüme girmek isteyen süreçler eğer başka bir süreç kritik bölgede değilse
  3. Bir süreç kritik bölge içinde sonsuza kadar beklememelidir.
  4. Kritik bölge dışında çalışan bir süreç, başka süreçleri bloklayamaz.
  5. Sistemdeki işlemci sayısı ve hızı ile ilgili kabuller yapılmamalıdır, bu değerlerden bağımsız olmalıdır.Süreç 1:while (TRUE){//kritik  bölge dışındaki kodlar karsilikli_disla_basla//kritik bölge kodları karsilikli_disla_bitir//kritik bölge dışındaki kodlar }Süreç 2: while (TRUE){//kritik  bölge dışındaki kodlar karsilikli_disla_basla//kritik bölge kodları karsilikli_disla_bitir//kritik bölge dışındaki kodlar }image003Yoğun Beklemeli Karşılıklı Dışlama (mutual exclusion with busy waiting)
    • Kesmeleri Devre Dışı Yapmak (Disable Interrupts)

     Süreçler kritik bölgeye girdiklerinde tüm kesmeleri devre dışı bırakabilirler. Kritik bölge dışına çıktıklarında eski durumuna getirebilirler.Bu durumda eğer bir süreç bu işlemi uygulasa ve çıktığında eski durumuna getirmez ise sistem çalışmaz duruma gelir.Sistemde birden fazla işlemci varsa bu işlem sadece tek bir işlemciyi etkiler. Kullanıcı süreçlerine bu hakkı vermek oldukça tehlikelidir. Çekirdek bazen bu yöntemi kullanır. 

    • 2.Değişkenleri Kilitleme (Locking Variables)

    Süreçler arasında paylaşılan bir değişkeniniz olsun. Bu değişkenin ilk değeri 0 olsun. Bir süreç kritik bölgeye girdiğinde ilk önce bu değişkeni kontrol etsin. Eğer kilit değişkenimizin değeri 0 ise süreç bunu 1 yapsın ve kritik bölgede yapmak istediklerini yapsın. Eğer 1 ise, 0 oluncaya kadar beklesin.Bu yöntemde de bahsedilen problem vardır.Bir süreç kilit değerini 0 olarak okusun, 1 yapamadan işlemci başka bir sürece geçerse, her iki süreçte kritik bölgeye girmiş olur.

    • 3.Dikkatli Değiştirme (Strict Alternation)

    Bu yöntem aşağıdaki kodda gösterilen maktık temelinde çalışmaktadır. Bu tip beklemeye yoğun bekleme denilir. Yoğun bekleme kullanan kilitlere döngü kilit(spin lock) denilir.Süreç 1:while (TRUE){while (kilit!=0); //bekle kritik_bolum(); kilit=1;kritik_olmayan_bolum();} Süreç 2: while (TRUE){while (kilit!=1); //bekle kritik_bolum(); kilit=0;kritik_olmayan_bolum();}Problemler:

    • İşlemci zamanı boşuna harcanır.(Bir sürecin işlemci zamanı while döngüsünde geçer.)
    • İkiden fazla süreç için geçerli değildir.
    • Bir sürecin kritik olmayan bölgesi diğer sürecin kritik bölgeye girmesine engel

    Örneğin, 1. süreç kritik bölgeden çıksın ve kiliti=1 yapsın. 2. süreç de kritik bölgedeki işini çok hızlı bitirsin ve kiliti=0 yapsın. Şu anda iki süreçde kritik olmayan bölümde olsunlar. 1. süreç kritik bölgeye girsin ve hemen çıkarak kilit=1 yapsın. 1. süreç, 2. sürecin kritik olmayan bölgesi bitmeden tekrar kritik bölgeye girmeye çalışırsa giremez.

    • Peterson’ın Çözümü (Peterson’s Solution)

    image007Her süreç kritik bölgeye girmedenönce kritik_bolgeye_gir() metodunu,çıktıktan sonra da kritik_bolgeden_cik() metodunu kendi süreç numarası ile çalıştırır.

    1. ve 1. süreç aynı anda kritik_bolgeye_gir() metodunu çalıştırsınlar. 0. süreç kaynak ile ilgili olduğunu belirtsin ve sira=0 yapsın.
    2. süreçte ilgili olduğunu belirtsin ve sira=1
    3. süreç while döngüsüne girdiğinde hemen çıkar ve bu şekilde kritik bölge kodunu yapmaya başlar.
    4. süreç ise while döngüsünde bekler. 0. süreç çalışmasını bitirdiğinde ve ilgisini FALSE yaptığında, 1. süreçde kritik bölgeye girer ve yapması gerekli olan işleri yapar.4.TSL Komutu (TSL instruction-Test and Set)Bir çok bilgisayar; özellikle birden fazla işlemcili olanlar, TSL (Test and Set Lock) komutuna sahiptir. Bu komut kesilemez ve tek bir komut çevriminde(instruction cycle) gerçekleşir. Bu komut bir bellek gözünün değerini yazmaça okur ve belleğe sıfır olmayan bir değer yazar. Bu komut bitmeden başka CPU bu belleğe erişemez.kritik_bolgeye_gir:tsl yazmac,bayrak cmp yazmac,#0jnz kritik_bolgeye_gir retkritik_bolgeden_cik:mov bayrak,#0 ret