ALT İŞLEMLİ ÇALIŞMA (THREAD MECHANISMS)
işletim |
Bir
proses en azından bir alt işlem (thread) içerir. Bu alt işleme ana alt işlem
(main thread) denir. Her alt işlem, sanki ayrı bir program gibi işletim sistemi
tarafından çizelgeleme işlemine sokulur. (süresi 20 milisaniyedir.). Program WinMain
fonksiyonunun bulunduğu ana alt işlemden çalışmaya başlar. CreateThread API
fonksiyonuyla program içerisindeki bir fonksiyon, bir alt işlem olarak
belirlenebilir. Yani artık, bu prosesin iki alt işlemi vardır. Her iki alt
işlemde birbirinden bağımsız olarak, sanki farklı programlarmış gibi
çalışabilirler. Alt işlemler arasındaki geçiş, ya aynı prosesin iki alt işlemi
arasında ya da farklı proseslerin alt işlemleri arasında olabilir. Aynı
prosesin alt işlemleri arasında yapılan geçişin performans maliyeti fazla
deeğildir.
Alt İşlemler ve Prosesler Arsında
Haberleşme
Bir prosesin iki alt işlemi asenkron
çalışan iki ayrı fonksiyondur. Bunlar aynı prosese ilişkin oldukları için aynı
global değişkenleri kullanabilirler. Ancak farklı proseslere ilişkin alt
işlemler arasındaki haberleşmeye kısaca proseslwer arasındaki haberleşme
(interproses com)denir.prosesler arsındaki heberleşme aynı makinadaki iki
programın ya da Network içindeki herhangi iki makine arasındaki proseslerin
haberleşmesi biçiminde iki bölümde incelenmektedir. Her iki yöntem için de
farklı yöntemler kullanılmaktadır.
Bir Alt İşlemin Yaratılması
CreateThread
API fonksiyonuyla yapılmaktadır.
Fonksiyonun 1. Parametresi; alt işlemin güvenlik
parametrelerine ilişkin bir yapının adresidir. NULL geçilebilir.
2. Parametre; bir alt işlemin kullanılacağı stack
uzunluğudur. 0 girilirse, default bir uzunluğu alır.
3. Parametre; geri dönüş değeri void, parametresi LPVOID
türünden bir fonksiyon göstericisidir. Yani bu parametreye alt işlem olarak
tanımlanacak fonksiyonun adresi geçirilecektir.
4. Parametre; alt işlem olarak tanımlanan fonksiyona
geçirilecek parametredir.
5. Parametre; yaratılan alt işlemin davranışını belirtir.
Bu parametreye 0 girilirse, alt işlem yaratılır yaratılmaz çalıştırılır.
6. Parametre; DWORC türünden bir değişkenin adresini alır.
Fonksiyon bu değişkene alt işlemin ID değerini yerleştirir.
Fonksiyonun geri dönüş değeri, yaratılan alt işleme
ilişkin çeşitli bilgilerin saklandığı bir bölgenin adresi olan handle değerid
Bir thread CreateThread
API fonksiyonuyla yaratıldığında alt işlemin yönetilebilmesi için bir handle
alınır. Bu alan CloseHandle API fonksiyonula silinebilir.Prototipi:
void WINAPI MyThread(..... stdcall) biçiminde çağırılmalıdır.
Bir alt işlemin çalışması ExitThread fonksiyonuyla sonlandırılabilir. Eğer
bu fonksiyon çağırılmamışsa alt işlem fonksiyonunun sonunda derleyici
tarafından otomatik olarak sonlandırılır. Prototipi:
Alt İşlemlerin Bekletilmesi
Bir alt işlem Sleep
fonksiyonuyla istenilen kadar milisaniye çizelge dışı bırakılabilir. Tabii bu
bekleme işlemi çizelge dışına atılarak gerçekleştirilir. Meşgul bir döngü(busy
loop) kullanılmaz. Prototipi:
Bu fonksiyona 0
parametresi geçildiğinde kalan quanta süresi kadar bir bekleme oluşabilir(Yani
sanki o quanta süresi bitmiş gibi işlem yapılır). Ancak Sleep fonksiyonu kodun
içinde bulunan thread'i bekletebilir(Yani başka bir alt işlem bekletilemez).
Başka bir alt işlemin bekletilmesi SuspendThread API fonksiyonuyla
yapılmaktadır. Prototipi:
Bu fonksiyon bir alt
işlemin çalışmasını ResumeThread API fonksiyonu çağırılana kadar durdurur.
Prototipi:
Alt işlem kullanımına
ilişkin örnek programın açıklanması:
Program kodu UNICODE uyumlu yazılmıştır. Ancak Windows 95 ve 98
sistemlerinde RegisterClass API fonksiyonu UNICODE sisteminde çalışmaz, sıfırla
geri döner. Tabii Windows NT sistemlerinde böyle bir problem yoktur.
Alt İşlemler ve Mesaj Kuyruğu
Bir alt işlem içerisinde
CreateWindow ile pencere yaratıldığında o alt işleme ilişkim bir mesaj kuyruğu
da yaratılır. Yani her alt işlemin farklı bir mesaj kuyruğu vardır.
Alt İşlemlerin Seri Hale Getirilmesi
İki alt işlem asenkron bir
biçimde çalışır. Ancak pek çok uygulamada belli bir eş zamanlılığın sağlanması
gerekebilir. Örneğin paralel porta takılan bir aygıt beş satırlık bir kod ile
iki alt işlem tarafından programlanıyor olabilir. Bir alt işlemde programlama
işlemi başladığında alt işlemler arasında geçiş olur, akış diğer alt işleme
gelirse o alt işlem de aynı programlayan kodu çalıştırırsa problemli bir durum
ortaya çıkar. Çünkü tekrar bir alt işlemler arası geçiş ile program diğer alt
işlemden devam ettiğinde alt işlem programlama adımlarının bazılarının
yapıldığını sanarak kaldığı yerden devam eder. Oysa bu işlemler diğer alt
işlemler tarafından bozulmuştur. Eğer bir kod bir bölgedeyse o kod o bölgeden
çıkana kadar başka bir kodun o işlemleri yapan bölgeye girmesi istenmiyorsa o bölgeye
kritik bölge denir(critical section). Kritik kod(bölge) işletim sistemlerinin
sağladığı özel fonksiyonlarla ele alınmalıdır. Kritik kodların global
değişkenlerle yaratılması mümkün değildir.
Bu işlem gerçekleştirilemez.
Kritik kodların üstesinden
gelebilmek için Windows işletim sisteminde çeşitli API fonksiyonları vardır.
Örneğin:
CreateSemaphore
CreateEvent
CreateMutex
Bu API fonksiyonlarıyla bir handle alınır. Bu handle
ReleaseSemaphore
ReleaseEvent
ReleaseMutex
gibi API fonksiyonlarıyla bırakılır. WaitForSingleObject API fonksiyonuyla
bekleme alt işlem çizelge dışı
bırakılarak yapılır.
Örneğin Semaphore nesnesi
şöyle kullanılır. CreateSemaphore fonksiyonu ile semaphore yaratılır ve bişr
handle elde edilir. Handle içerisinde bir sayaç vardır. Bu sayacın ilk durumu
CreateSemaphore fonksiyonuyla belirlenir. WaitForSingleObject semaphore nesnesinin
sayaç değeri 0 ise bekler, 0 dışı ise beklemez ama 1 düşürür. ReleaseSemaphore
ise sayacı bir arttırır. Yani kritik kod WaitForSingleObject ile
ReleaseSemaphore arasındaki koddur. Semaphore nesnesi prosesler arasında bir
isim verilerek de kullanılabilir.
Grafik İşlemlerinde Görüntü Modu ve Koordinat
Sistemleri
Windows'da kullanılan
orijin noktası 3 biçimde olabilir:
1. Ekranın sol üst köşesi orijin olabilir(Popup menu çıkartırken
kullandığımız fonksiyonlar bu orijine ilişkindir).
2. Orijin pencere başlığının sol üst köşesi olabilir(GetWindowDC ile alınan
handle orijin noktasının böyle olduğunu varsayarak çizim yapar).
3. Pencerenin çalışma alanının sol üst köşesi orijin noktası olabilir(Bütün
GDI fonksiyonları bu noktayı orijin kabul eder).
Windows'da GDI
fonksiyonları için orijin nokası çalışma alanının istenilen bir noktasına
çekilebilir. Çalışma alanının orijin belirten noktasına "View port
origin" denilmektedir. View port origin noktası her zaman pixel cinsinden
belirlenir. Orijin noktası SetViewportOrgEx fonksiyonuyla değiştirilebilir.
Prototipi:
);
View port orijini dışında
yine pencere görüntüsünü kaydırmak amacıyla pencere orijin noktası
değiştirilebilir. Yani pencere içerisindeki görüntü kaydırılarak istenilen bir
DC bölgesinin pencere sınırları içerisinde kalması sağlanabilir.
SetViewportOrgEx yalnızca çizim fonksiyonları için orijin noktasını değiştirir.
Halbuki pencere orijininin değiştirilmesi yalnızca görüntünün kaydırlması
anlamına gelir. Pencere orijinini değiştiren SetWindowOrgEx fonksiyonu vardır.
Prototipi:
0 yorum: