You are on page 1of 37

İskenderun

Teknik
Üniversitesi

Fakülte: Mühendislik ve Doğa Bilimleri Fakültesi


Bölüm: Bilgisayar Mühendisliği Bölümü
Ders: İşletim Sistemleri
Dönem: 2019 – 2020 (Bahar)
4.
Öğretim üyesi: Dr. Öğr. Üyesi Mehmet SARIGÜL Hafta
• Proseslerin birçok farklı durumda birbiri ile haberleşmesi
gerekebilir.
• Örnek olarak bir kuyruk içerisinde bir prosesin ürettiği
çıktıyı bekleyen başka bir proses olabilir.
• Prosesler arasında haberleşmeyi sağlayacak kesmeleri
kullanmayan iyi organize edilmiş bir yol gereklidir.

Prosesler Arası Haberleşme


• Buradaki temel sıkıntılar şu şekildedir:
• Bir prosesin diğer ile haberleşmesi nasıl gerçekleşecek,
• İki prosesin birbirini engelleme durumu nasıl önlenecek,
• Prosesler arası senkronizasyon nasıl gerçekleştirilecek.

Prosesler Arası Haberleşme


• Bazı işletim sistemlerinde proseslerin eriştiği ortak
alanlar olabilir. Oluşacak problemleri bir örnek üzerinden
ele alalım.
• Bir proses bir dosya yazmak istediğinde özel bir dizine bu
dosyanın adını girer. Arkaplanda çalışan yazdırmakla
görevli başka bir proses ise bu dizini belirli aralıklarla
kontrol ederek yazdırılması gereken dosyaları yazdırır.

Yarış Durumları
• Bu yazdırma dizininin yapısı şu şekilde olsun. Dizin bir
kuyruk şeklinde ve birden fazla dosya adı alma
kapasitesine sahip olsun.
• Kuyruğun başının ve sonunun indisini tutan “in” ve “out”
adında iki dosya olsun ve bunlar tüm proseslerin
erişimine açık olsun.
• “in” değeri sonraki boş indisi tutarken
• “out” değeri yazdırılacak sonraki dosyanın indisini
tutmaktadır.

Yarış Durumları
Yarış Durumları
• Senaryo şu şekilde gerçekleşir. Proses A çalışır ve sonraki
boş indis değerini alır. Bundan sonra işletim sistemi
Proses A’yı hazır duruma alır ve Proses B yi çalıştırır.
• Proses B de dosya yazmak istemektedir. O da sonraki boş
indisin değerini alır ve o indise dosyanın adını yazar.
• Proses A ya sıra geldiğinde boş olduğunu düşündüğü
indise gidip kendi dosyasının adını yazar.

Yarış Durumları
• Arkaplandaki yazdırma prosesi bir süre sonra gelir ve
Proses A’nın dosyasını yazdırır.
• Proseslerin hiçbiri herhangi bir hata ile karşılaşmaz. Ama
Proses B’nin yazdırması gereken dosya yazılmamıştır.
• Prosesler arasındaki bu tip durumlara “Yarış Durumları”
denir.

Yarış Durumları
• Bir çok proses tarafından ortak olarak kullanılan alanlara
kritik alanlar denir.
• Bu alanlarda birden fazla prosesin aynı anda işlem
yapmasını engellemek için “karşılıklı dışlama” bir
çözümdür.
• Kritik alana işlem yapmak için giren proses işini bitirene
kadar, diğerlerinin dışlanmasına neden olur.

Kritik Bölgeler
• Bazıları donanımsal, bazıları yazılımsal olan bir çok
karşılıklı dışlama yöntemi bulunmaktadır.
• Karşılıklı dışlamanın amacı bir proses kritik bölgede
işlem yürütürken başka bir prosesin kritik alana girişini
engellemektir. Ama tüm prosesler zaman içerisinde kritik
alana girip gereken işlemleri yapabilmelidir.

Karşılıklı Dışlama
• Tek işlemcili bir sistemde, en basit çözüm kritik alana
giren prosesin kesmeleri devre dışı bırakması olabilir.
Kritik alandan ayrılırkense kesmeler geri açılır.
• Kesmeler kapalı iken işlemcinin başka bir prosesi işleme
alması mümkün değildir. Dolayısıysa proses kesilmeden
kritik alanda gereken işlemi gerçekleştirir.

Kesmeleri devre dışı bırakmak


• Bu yöntem çok ideal bir yöntem değildir. Çünkü bir
prosese kesmeleri devre dışı bırakma gibi bir yetki
vermek çok istenmez.
• Prosesin kesmeleri devre dışı bırakıp açmadığını
düşünün. Sistem çalışmaya devam edemeyecektir.
• Ayrıca bu yöntem birden fazla işlemcili sistemler için
uygun değildir.
• Daha etkili bir karşılıklı dışlama yöntemi gerekmektedir.

Kesmeleri devre dışı bırakmak


• Donanımsal çözümler bir çok sorunu beraberinde
getirecektir bu nedenle yazılımsal bir çözüm daha
uygundur.
• Bir tane ortak değişken tutulduğunu varsayalım. Bir
proses kritik bir alana gireceği zaman bu değişkenin 0
olan değerini 1 yapar ve kritik alana girer. Başka proses
kritik alana girmek isterse bu değişkeni kontrol eder
değişken 1 ise 0 olana kadar bekler. İlk proses işini
bitirince değişkeni sıfırlar ve çıkar.
• Çözüm geçerli mi?

Kilit Değişkenleri
• Bu çözümde daha önceki okuyucu problemi gibi geçerli
bir çözüm değildir. İlk proses kilit değişkenini kontrol
edip girdikten sonra değişkenin değerini değiştiremeden
başka bir proseste aynı şekilde kritik alana girebilir!

Kilit Değişkenleri
• Aşağıdaki çözümde kilit değişken kullanılarak iki
prosesin kritik alanı kullanımı sağlanmaktadır.
• Ne gibi problemler olabilir?

Katı Düzenleme

Katı Düzenleme
• Çalışma şu şekildedir. İlk proses kilit değişkenin 0
olduğunu görür ve kritik alana girer.
• Kritik alanda çalışırken diğer proses kilit değişken 1
olmadığı için onu bekler. İlk proses işini bitirip
değişkenin değerini 1 yapar.
• Bundan sonra ikinci proses de kritik alana girerek işlem
yapar.
• Bu şekilde iki proses sıralı bir biçimde kritik alanı
kullanır.

Katı Düzenleme
• Burada karşılaşılacak ilk problem “Meşgul bekleme”
problemidir. Diğerini bekleyen proses sonsuz döngüde
olduğu için işlemci zamanı tüketmeye devam eder.
• İki proseste kritik alandaki işlerini bitirdikten sonra kilit
değişkenin değeri tekrar 0 olur. İlk prosesin kod
parçasının daha hızlı çalıştığını varsayalım. İlk proses
ikinci defa kritik olmayan kodunu çalıştırıp başa dönsün.
2. proses henüz başa dönmediği için kilit değeri 1
olacaktır. İlk proses ikinci proses kritik olmayan alanda
olmasına rağmen kritik alana giremeyecektir.

Katı Düzenleme
• Peterson 1981’de çok daha etkili bir yazılımsal çözüm
bulmuştur.
• Kritik alana girmek isteyen proses “enter_region()”
fonksiyonunu kritik alandan ayrılacak proses ise
“exit_region()” fonksiyonunu çağıracaktır.
• Proseslerin numaraları 0 ve 1’dir.

Peterson’un Çözümü
Peterson’un Çözümü
• Başlangıçta iki proseste kritik alanda değildir. 0 numaralı
proses kritik alana girmek için “enter_region()”
fonksiyonunu çağırdı ve kritik alana girdi.
• 1 numaralı proses bundan sonra kritik alana girmek istese
bile interested[0] değeri “true” olduğu sürece bu alana
giriş yapamayacaktır.
• 0 numaralı proses kritik alanı terkederken ilgili değeri
“false” yaparak diğer prosese izin verir.

Peterson’un Çözümü
• Peki iki prosesinde aynı anda “enter_region()”
fonksiyonunu çağırdığını varsayalım.
• Bu sefer while döngüsüne gelmeden önce paylaşılan
“turn” değişkenine numarasını en son yazdıran kritik
alana girmeye hak kazanacaktır. Diğer proses ise
beklemek zorunda kalacaktır.

Peterson’un Çözümü
• Bazı donanımlar üzerinde TSL(Test and Set Lock)(Test et
ve kilitle) komutu bulunmaktadır.
• Bu komut ilgili yazmaç’ın değerini önce okur sonrada
kilitler. Bu iki işlemin bölünemez olması donanımsal
olarak garanti altına alınmıştır.
• Bu işlemi yapan işlemci(çok işlemcili sistemlerde) diğer
işlemcilerin ilgili alana erişimini engeller.

TSL komutu
TSL Komutu
• Kritik alana girmek isteyen proses “LOCK” paylaşılan
değişkeninin değerini alıp kitler.
• Daha sonra ilk değerini kontrol eder. Eğer bu işlem
öncesinde değişken zaten kilitli ise başka bir proses kritik
alanda olduğu için bu işlem diğer proses çıkana kadar
tekrarlanır.
• Eğer “LOCK” değişkeninin ilk değeri 0 ise bu sefer kritik
alana girilmesi uygundur.

TSL komutu
• Peterson’un çözümü’de TSL çözümüde meşgul bekleme
problemini çözememektedir.
• Bu iki çözümde de kritik alana giremeyen proses sonsuz bir
döngü içerisine girerek işlemci zamanı tüketmeye devam
etmektedir.
• Öncelik tabanlı bir işletim sistemi üzerinde düşük öncelikli bir
prosesin kritik alana girdiğini varsayalım. Yüksek öncelikli bir
proses geldiğinde işlemci tüm zamanını yüksek öncelikli
prosese verecektir. Yüksek öncelikli bir proses sonsuz bir
döngü içinde dönerken, düşün öncelikli proses kritik alandan
çıkmak için işlemci zamanı alamayacaktır. (Ters öncelik
problemi)

Uyuma ve Uyanma
• İşlemci zamanını bu şekilde verimsiz kullanmak yerine
“sleep()” ve “wakeup()” sistem çağrıları kullanılabilir.
• Sleep çağrısı çağıranı uyku moduna alırken, wakeup
çağrısı ise bir prosesi uyandırmak için kullanılır.
• Üretici, tüketici örneği bu çağrılara örnek olarak
verilmiştir.

Uyuma ve Uyanma
Uyuma ve Uyanma
• Burada görüldüğü üzere iki proses ortak bir yığın
üzerinde çalışmaktadır.
• Üretici ürettiği değişkeni yığına yazarken tüketici bu
değişkeni alıp kullanmaktadır.
• Eğer yığın dolarsa üretici uyku durumuna geçer. Yığında
boş yer olduğunda ise tüketici, üreticiyi uyandıracaktır.
• Burada ne gibi bir problem olabilir???

Uyuma ve Uyanma
• Burada görüldüğü üzere iki proses ortak bir yığın
üzerinde çalışmaktadır.
• Üretici ürettiği değişkeni yığına yazarken tüketici bu
değişkeni alıp kullanmaktadır.
• Eğer yığın dolarsa üretici uyku durumuna geçer. Yığında
boş yer olduğunda ise tüketici, üreticiyi uyandıracaktır.
• Burada ne gibi bir problem olabilir???

Uyuma ve Uyanma
• Tüketici dizini kontrol eder. Dizinde eleman olmadığı için
uyku durumuna geçecektir.
• Tam o anda işletim sistemi üretici prosesi çalıştırır.
Üretici yeni bir değişken üretir ve yığına koyar. Diğer
prosese de “wakeup()” sinyalini yollar. Ama aslında
tüketici proses henüz uykuda değildir. Sinyal kaybolur.
• Sonrasında tüketici uykuya geçer. Yığın dolunca üretici
de uyku durumuna geçer!

Uyuma ve Uyanma
• Dijkstra bu durumu çözmek için “wakeup” sinyallerini sayan
yeni tip bir değişken tutmayı önerir. Bu tipe semafor adı
verilir.
• Semaforun değeri 0 ise hiçbir uyandırma çağrısı yapılmamıştır.
Pozitif bir değerde ise bir o kadar uyandırma çağrısı
yapılmıştır.
• Semaforlar “up()” ve “down()” çağrıları ile yönetilir. Bunlar
atomic aksiyonlardır ve bölünemezler.
• “down()” çağrısı eğer semaforun değeri pozitif ise bir eksiltir
ve kod akmaya devam eder. Eğer değer 0 ise uyku moduna
geçilir.

Semaforlar
• “down()” çağrısı eğer semaforun değeri pozitif ise bir
eksiltir ve kod akmaya devam eder. Eğer değer 0 ise uyku
moduna geçilir.
• “up()” çağrısı ise semaforun değerini arttıracaktır. Eğer
semaforun değeri 0 ise uykuda olan proseslerden biri
uyandırılır. Bu durumda semaforun değeri halen 0’dır.
Ama bekleyen proseslerden biri uyandırılmıştır.
• Üretici tüketici problemi kaç semafor ile çözülebilir???

Semaforlar
Semaforlar
• Burada 3 semafor bulunmaktadır. “full” adlı semafor
yığındaki dolu alanların sayısını tutarken “empty” adlı
semafor boş alanların sayısını tutacaktır.
• “mutex” adlı semafor ise yığın üzerinde bir anda tek bir
prosesin işlem yapmasına olanak sağlayacaktır.

Semaforlar
• Semaforun sayı sayma yeteneğinin gerekli olmadığı
durumlarda daha basit bir yapı olan Mutex kullanılır.
• Mutex kritik bölgeye tek bir prosesin girmesine olanak
salar. Buna “karşılıklı dışlama” denir.
• Mutex’in iki durumu vardır. “locked(kilitli)” ya da
“unlocked(açık)”. Mutex’in durumu mutex_lock() ya da
mutex_unlock() ile değiştirilebilir.

Mutex
Mutex
Ders Sonu

You might also like