Isbaran Akcayir
Canakkale 18 Mart Univ. Bilgisayar Muh.
http://ish.kodzilla.org

TSL INSTRUCTION ( Test and Set Lock ) 

Intel x86 islemcilerde 'Bit test and Set' (BTS) versiyonu bulunan "TSL instruction", 'race conditions' (yaris durumu) icin donanimdan 
yardim alarak cozum uretir. Cogu bilgisayar - ozellikle de cift islemcili olanlar - TSL denen talimatlara (instruction) sahiptirler. 
Oncelikle bellekten okudugunu islemci ustundeki bir register'a kaydeder ve ardindan bellekteki bu goze sifirdan farkli bir deger aktarir. 
RX bir register, flag ise bellekteki bir degisken olsun. 

RX = flag
flag = 1

Bellek gozunun okunmasi ve deger aktariminin araliksiz yapilacagi garantidir, baska bir islemci instruction bitene kadar bellek gozune 
erisemez. TSL instruction'u calistiran islemci, veri yolunu (memory bus) diger islemci (CPU) 'lerin is bitmeden bellege erismelerini 
engellemek icin kitler.

TSL Instruction kullanabilmek icin paylasimli bellek bolgesine erisimi denetleyecek ortak kullanimli bir degisken'e - flag - ihtiyacimiz var. 
Degisken(Flag, Bayrak) '0' iken isteyen process bayragin degerini 1 yaparak bellek bolgesini kullanmaya baslayabilir. Isi bittiginde 
process bayragin degerini 0 yaparak bellegi kullanima acar.

Asagidaki assembly kodunda TSL'nin bu isi nasil gerceklestirdigini gorebilirsiniz.

bolgeye_gir:
	tsl register, flag
	cmp register, #0
	jnz kritik_bolge
	ret

bolgeden_cik:
	mov flag, #0
	ret

Ilk komut bayragin (flag) eski degerini bir register'a kopyaliyor ve sonra bayragin degerini '1' yapiyor. Sonra bayragin eski degeri 
0 ile karsilastiriliyor ve 0 dan farkli bir degerse ( zaten kilitli ) deger 0 olana kadar ( kritik bolgede olan surec isini bitirene 
kadar ) dongude kaliyor. Deger 0 oldugunda da kendisi kritik bolgeye giriyor.

Kilidin acilmasi ikinci kisimda oldukca basit gosterilmis. Program sadece bayraga 0 degeri atiyor. Ozel talimatlara gerek duyulmuyor.

Kritik bolge problemleri icin gelistirilmis bu yontem ile kritik bolgesine girmeden once process 'bolgeye gir''i cagirarak uzunca sure 
kilidin acilmasini bekliyor ve acik gordugunde kritik bolgeye giriyor. Process isi bittiginde 'bolgeden_cik' 
calistirarak bayragi 0 yapiyor. Boylece kilit acilmis oluyor.

Kritik bolge problemlerinin cogunda oldugu gibi bu yontemde de surec 'bolgeye_gir' ve 'bolgeden_cik' i dogru zamanda cagirmalidir. 
Bir process hile yaparsa 'mutual exclusion' (karsilikli dislama) durumu bozulur.

'Peterson's Solution' gibi TSL Instruction metodu da dogrudur. Ama yeterince etkin degildir. Oyleki
- Sira icin uzunca sure beklemeleri gerekir
- Bos yere islemci devri (CPU cycle) harcanir
- Oncelik degistirme problemine neden olur:
	Bir yuksek oncelikli (H) bir de az oncelikli (L) iki surec oldugunu varsayalim, ve L'nin kritik bolgede oldugunu, H'nin de kritik 
	bolgeye girmek icin L'nin cikmasini bekledigini dusunelim. Boyle bir durumda H Yuksek oncelikli olmasina ragmen L yuzunden sonsuza
	kadar bekleyebilir, cunku zamanlayici L'ye etki etmeyecektir.

Boyle bir durumda diger sureclerin calisabilmesi ve islemci devirlerinin bosa harcanmamasi icin isletim sisteminden yardim alinir ve 
'bolgeye_gir' icerisinde bir sistem cagirisina yer verilir. Bu sistem cagrisi diger surecin uzunca beklememesi icin sureci 'BLOKE' durumuna 
alir ve diger sureclerin islemesi devam eder. Boylelikle yukarida bahsedilen dezavantajlar engellenmis olur.


Kaynaklar: Modern Operating Systems -> Andrew S. Tanenbaum Interprocess Communication DN -> Ibrahim Korpeoglu Interprocess Communication DN -> Mark Handley Introduction to System Programming DN -> Avishai Wool DN = 'Ders Notlari'
Hata Bildir :)