Okuyucu ile Yazar�ın Problemi
Sınırlı sayıdaki kaynaklara ulaşmada ve bunları paylaşmada sadece insanoğlu sıkıntı yaşamaz. Makinelerimize kurduğumuz işletim sistemleri de bu sorunlarla baş başa kalabilirler. Ne de olsa ona da bir insan eli değmiştir�
Bu problemlerin biri de çok ünlü olan �The Readers and Writers Problem� dir. Açıkça ortaya koyarsak bu problem;
Örnek bir veri tabanına erişmede, onu güncellemede, bilgisini alıp getirmede veya eklemelerde karşılaşılan bir problem modelidir.
Farz edelim; yarışan süreçlerden bazılarının yazmak, bazılarının okumak istediği, büyük bir veri tabanı olsun. Örneğin ÖSS tercih formu (Adı hala heyecan verici)
için kurulmuş çok büyük bir veri tabanı olsun. Ve öyle bir durum olsun ki bu veri tabanına erişip aynı anda onu �okumak� isteyenler kabul edilebilirken (birden fazla da olabilirler) sadece bir �yazmak� isteyenin girmesi anında bile tüm diğer her şey bekletilsin ve başka hiçbir süreç bu anda işlemesin.
Bu trajik durum nasıl mı olsun? Bunu işletim sistemlerinin büyük dili C ile anlatalım.
#include �prototypes.h�
typedef int semaphore; /*Dijkstra (1965)*/
semaphore mutex = 1; /* �rc� ye ulaşımı kontrol eder*/
semaphore db = 1; /*Veri tabanına ulaşımı kontrol eder*/
int rc = 0; /*Okuyan veya okumayı isteyenlerin RiCa sayısı*/
void reader(void)
{
while(TRUE) /*Sonsuza dek tekrar et*/
{
down(&mutex); /*� rc � ye özel erişimi sağla*/
rc = rc + 1; /* Bir tane daha okuyucu gelir*/
if(rc ==1) down(&db); /*Eğer gelen ilk process bir okuyucu ise*/
up(&mutex); /*�rc� ye özel erişimi harekete geçir*/
read_data_base(); /*Veriye ulaş*/
down(&mutex); /*�rc�ye özel erişimi sağla*/
rc = rc � 1; /*Bir okuyucu gider*/
if(rc == 0) up(&db); /*Eğer bu son okuyucu ise�*/
up(&mutex); /*�rc� ye özel erişimi harekete geçir*/
use_data_read(); /*Kritik olmayan durum*/
}
}
void writer(void)
{
while(TRUE)
{
think_up_data(); /*Kritik olmayan süreç*/
down(&db); /*Özel erişimi sağla*/
write_data_base(); /*Güncelleme*/
up(&db); /*Özel erişimi harekete geçir*/
}
}
Yukarıdaki kod örneğinde adı geçen semaphore işimize yarayan kullanışlı bir �int� tanımlayıcıdır. E. W. Dijkstra, yeni bir veri tipi olarak ortaya koyamaya çalıştı (1965). Bu tipteki sayılar süreçlerin yarış anından�race conditions� kaçınmak için ortaya konan değerlerdir. DOWN ve UP ile bu sayıların değerleri değiştirilerek süreçlerin uyumlu çalışması sağlanır. Semaphore tipindeki sayı artmış olsun azalmış olsun ama sonuçta �0�ise süreç derhal uyku(sleep) durumuna geçer.
Kodda ise veri tabanına erişmek için gelen 1. okuyucu (ilk gelen) db�ye DOWN işlemi uygular. Sonraki okuyucular ise sadece rc sayısını arttırır. Okuyucular ayrıldıkça da sayacı 1 azaltırlar ve sonuncu ise semaphore�a tek bir UP işlemi uygulayarak sonrasında gelecek olan, bekliyorsa bloke edilmiş, �yazıcı�ya izin belgesi verir.
Velhasıl bu çözümde görüldüğü gibi okuyucuların, yazarlara nisbeten önceliği vardır. Eğer bir yazma işlemi olacaksa �yazan�, okuyucular çekilene kadar azimle bekler. Eğer veri tabanında bir okuma işlemi yapılıyorsa ve kendinden sonra da bir okuma işlemi gelmişse bir centilmen gibi sırayı ona verir. Çünkü hala bir okuma işlemi tabanda oynamaktadır. Courtois et al. (1971) bu durumu farklı bir şekilde çözmeye çalışır. Yazıcılara da biraz öncelik vererek�
Görüldüğü gibi sınırlı bir şey varsa paylaşması da zor olabiliyor. En azında yeni çözümler üretilene dek�