Latch-Lock Bölüm I

Eşzamanlılık söz konusu olunca, kaynaklara erişim yöntemleri bazı kısıtlar ile denetlenmelidir. Neden denetlenmelidir? Şöyle izâh edelim: Varsayalım ki elimizde bir simgesel mikroişlemci dili var. Komutları:

YÜK : bir bellek adresinden mikroişlemcinin bir saklayıcısına (register) değer atar.
YAZ : mikroişlemcinin bir saklayıcısından bir bellek adresine değer atar.
ART : Saklayıcının değerini 1 arttırır.

Elimizdeki yazılım şu şekilde:

kod1:
YÜK $4000, A
ART A
YAZ A, $4000

Görüldüğü gibi 4000 bellek bölgesinde değer önce A saklayıcısına cekiliyor, ardından 1 arttırma ve değeri bellek bölgesine geri yazma işlemleri geliyor. Düşünülmesi gereken ise modern işletim sistemlerinin eş zamanlı bir çok prosesi beraber yürütebilmesidir. Hatta sunucularda 4 CPU standart bir sayı olduğuda düşünülünce bu yazılımın 2 farklı proses tarafından yürütülmesi durumunda $4000 bellek bölgesinde arttırma işlevi yanlış sonuçlanması işten bile değildir. Senaryomuz şu şekildedir:

$4000′de 20 değeri var

zaman proses-1 proses-2
Z1 YÜK $4000, A - // 20 değeri mikroişlemcide
Z2 - YÜK $4000, A // 20 değeri mikroişlemcide
Z3 ART A - // pros1 20++ işlemi yapar
Z4 - ART A // pros2 20++ işlemi yapar
Z5 YAZ A, $4000 - // pros1 21 yazar
Z6 - YAZ A, $4000 // pros2 21 yazar


İki farklı proses birbirlerinden bihaber aynı bellek bölgesindeki değeri alıp, arttırıp geri yazmaktadır. Sonuç olarak 22 olmasını istediğimiz değer 21 olarak hesaplanmıştır. Burada paylaşılan kaynağa erişim denetlenmeden yapıldığı için eş zamanlılık sorun oluşturmaktadır. Oracle’ın paylaşılan kaynaklara çözümü LATCH’lerdir. LATCH bellekteki bir veri yapısını bir prosesin kullanımı altında diğer proseslere kilitlemesini sağlayan bir yapıdır. kod1 örneğindeki bütün satırlar KRİTİK BÖLGEdir. Kritik bölge başlangıçında latch alınması ve bitişinde latch’in bırakılması gereken bloktur.

Peki latch yapısını gerçeklemek için Oracle hangi yöntemi kullanmıştır? TAS gibi mikroişlemci komutları ile. TAS komutu kendi çevrim süresi boyunca bellek üzerindeki bir bayrak değişkenini kontrol edip bu değişkenin değerine göre kodun akışını yönlendirebilir. Bölünmezlik ilkesi olduğu için başka bir proses ile paylaşılan bayrak değişkeni hakkında bir sorun yaşamaz.

Bir proses kritik bölgede işlem yürütürken, diğer prosesler latch (TAS) üzerinde dönmektedirler. Bu dönme sürecinde proses SPIN konumunda kabul edilir. Pratikte proses hiç bir iş yapmamasına karşın, teorikte proses işlemci zamanı harcamakta ve işletim sistemi tarafından CANLI olarak görülmektedir. Soru: Neden proses TAS üzerinde döngüye sokuluyor? Basitçe yerini iş yapması gereken bir prosese devretmesi daha mantıklı olmaz mı? Cevap: TAS komutu ucuzdur, zira mikroişlemci seviyesindedir. Bağlam değişimi (concept switch) ise daha pahalıdır, çünkü kernel seviyesindedir, ek işlemleri vardır (ayrıca geri bağlam değişimi de gerektiği için bu maliyeti 2 ile çarpın). Oracle SPIN sayısını belirli bir sınırda kabul etmiştir. Bu sayı kadar TAS yürütüldükten sonra bağlam değişimi olup, mikroişlemci iş yapacak başka bir prosese devredilir. Sonuç olarak Oracle tarafından belirlenmiş SPIN sayısı bağlam değişiminden daha ucuz olduğu için mantıklı bir çözümdür.

One Comment

  1. Posted May 9, 2008 at 11:27 am | Permalink

    Güzel.. :-)


Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*