1. İşlem Yönetimi (İşlem, Semafor ve Kilitlenme)<br />İşlem (process) belli bir komut dizisini yerine getiren program parçasıdır. Ancak bir<br />program parçasında sadece kodlar vardır oysa bir işlem çalışma sırasında gerekli olan<br />tüm bilgileri bünyesinde barındırmaktadır. Bir işlemin yapısında; işlemin yazılı olduğu<br />metin bölümü, bir sonraki işletilecek olan komutu gösteren sayaç ve işlemci<br />kaydedicilerinin içeriği olan program sayacı (program counter) bölümü, yerel<br />değişkenler, dönüş adresleri gibi geçici bilgileri tutan yığın (stack) bölümü, genel<br />değişken vb. bilgileri tutan veri bölümü bulunmaktadır. Bazı işlemlerde işlemin çalıştığı<br />sürece kullandığı bir alan (heap) de bulunmaktadır.<br />İşlem Kontrol Bloğu (Process Control Block): <br />Her işlem işletim sistemi tarafından işlem kontrol bloğu tarafından gösterilir, yer alan öğeler ise şunlardır;<br />İşlem durumu<br />İşlem numarası<br />Program sayacı<br />Kaydediciler<br />Bellek sınırları<br />Açılan dosyaların sayısı<br />• İşlem durumu: İşlem yeni, çalışıyor, bekliyor, hazır veya bitti şeklinde<br />olabilir.<br />• Program sayacı: İşlemde çalıştırılacak bir sonraki komutu gösterir.<br />• MİB kaydedicileri: İşlemci mimarisini göre kaydedicilerin sayısı ve türü<br />değişmektedir. İşlemde kullanılan kaydediciler (AX, BX vb.) içerisindeki<br />bilgiler bir kesme geldiğinde mutlaka saklanmalıdır.<br />• MİB zamanlanma bilgisi: Burada işlemin önceliğini, zamanlama kuyruğundaki<br />işaretçisi ve diğer zamanlama parametreleri ile ilgili bilgiler bulunmaktadır.<br />• Bellek yönetimi bilgisi: İşletim sistemi tarafından kullanılan bellek<br />sistemleri; taban ve limit (tavan) kaydedicileri, sayfa tablosu veya bölüm<br />tablosu gibi bilgileri içermektedir.<br />• Hesap bilgileri: İşlem tarafından kullanılan MİB ve diğer parametrelerin<br />kulanım zamanlarını içermektedir.<br />• G/Ç durum bilgisi: İşlem tarafından kullanılan G/Ç aygıtlarının listesi, açılan<br />dosyaların listesi vb. bilgileri içermektedir.<br />İşlem durumu (Process state):<br />Bir işlemin hangi durumda olduğunu gösteren ve işlemin ömrü boyunca değişken<br />bir durumu bulunmaktadır. Bunlar;<br />• Yeni: İşlemin oluşturulduğunu gösterir.<br />• Çalışıyor: İşlemin komutları yürütülmektedir.<br />• Bekliyor: İşlem bir olayın gerçekleşmesini beklemektedir. Örneğin bir<br />G/Ç işlemi.<br />• Hazır: İşlem bir işlemciye atanmak için beklemektedir.<br />• Bitti: İşlem çalışmasını bitirdi.<br />İş Parçacıkları (Threads)<br />İş parçacığı, işlemin bir parçasıdır. Örneğin bir işlemin bir kelime işlemci<br />programının çalışmasını yürüttüğünü düşünelim. Burada kullanıcı örneğin bir satırdaki<br />yazıları seçerek kalın yapmak istediğinde bu faaliyete iş parçacığı denilmektedir.<br />Modern işletim sistemleri aynı işlem içerisinde birden fazla iş parçacığının<br />yürütülmesine izin vermektedir.<br />İşlemlerin Zamanlanması (Process Schedulers)<br />Tüm işlemler iş kuyruğuna (Job queue) alınmaktadır. Çalıştırılmaya hazır olan<br />veya bekleyen işlemler hazır kuyruğana (ready queue) alınarak MİB’ne gönderilir.<br />‘Dağıtıcı (Dispatcher)’ çalıştırılacak olan bir işlemi seçerek MİB’ne gönderdikten sonra<br />aşağıdaki olaylar meydana gelebilir;<br />• İşlem bir G/Ç isteğinde bulunabilir ve böylece G/Ç kuyruğuna<br />yerleştirilir.<br />• İşlem alt işlemler oluşturabilir ve bunların bitmesini bekleyebilir.<br />• İşlem bir kesme oluştuğu için MİB’de çalışması durdurularak kesmenin<br />bitiminin ardından kuyruğa alınarak MİB’ne gönderilebilir.<br />İlk iki durumda işlem hazır durumdan bekliyor durumuna getirilir ardından<br />işlemler gerçekleştikten sonra hazır durumuna getirilerek kuyruğa tekrar girer. Bu<br />döngüde bir işlem bitirilinceye, tüm kuyruklardan çıkıncaya ve kullandığı kaynakları<br />bırakıncaya kadar kalır.<br />Kilitlenme (Deadlock)<br />Sonsuz döngü anlamına da gelmektedir. Değişik işlemlerin/iş parçacıklarının<br />birbirlerinin alanlarını kullanmalarından ortaya çıkar. Windows’da sıklıkla karşınıza<br />çıkan mavi ekranın sebebi! Örneğin bir işlem bir kaynağı (örneğin A dosyasını)<br />kullanırken diğer bir kaynağı (örneğin B dosyasını) kullanmak istemektedir. Ancak aynı<br />zamanda başka bir işlem B dosyasını kullanırken A dosyasını kullanmak istemektedir.<br />Bu durumda her iki işlem de istedikleri dosyaları alamayacakları için bu işlemler<br />bloklanacaklardır.<br />Semafor (Semaphore):<br />Latincede ‘deniz feneri’ anlamına gelen Semafor, negatif olmayan bir tamsayı<br />olup işlemin başlangıç deyiminden itibaren wait ve signal işlemleri ile değeri<br />değiştirilebilen bir değişkendir.<br />Signal (S) : S = S + 1 (1 arttırma)<br />Wait (W) : W = W – 1 (1 azaltma)<br />Vol (sem) = C(sem) + ns(sem) - nw(sem)<br />Vol (sem): Semafor’un değeri. Bu değer 0’a eşit veya büyük olmalıdır.<br />C(sem) : Semafor’un başlangıç değeri<br />ns(sem): Semafor üzerindeki signal operasyon sayısı<br />nw(sem): Semafor üzerindeki wait operasyon sayısı<br />Vol(sem) ≤ 0<br />Nw(sem) ≤ ns(sem) + C(sem)<br />İki ayrı işlem aynı anda bellekte yürütülürken kaynaklara aynı anda erişmeye<br />çalışabilirler. Bu durumda kullanılan semafor, sistem kilitlenmelerine engel olur. Bir<br />semafor’un paylaşılabilmesi onun başlangıç değerine bağlıdır. Başlangıç değeri ‘n’ olan<br />bir semafor ‘n’ işlem tarafından kullanılır.<br />Wait ve signal işlemleri yanlış yerleştirilirse sistem hemen kilitlenir. Semaforlar<br />işlemler arası iletişimi sağlayarak sonsuz döngülere ve sistem kilitlenmelerine engel<br />olurlar. Örneğin; X ve Y başlangıç değerleri 1 olan iki semafor olsun. P0 ve P1 ise bu iki<br />semaforu kullanan işlemler olsun.<br />P0 P1<br />. .<br />wait (S) wait (Q)<br />wait (Q) wait (S)<br />. . Deadlock<br />. . (işlemler bloklanır)<br />. .<br />signal (S) signal (Q)<br />signal (Q) signal (S)<br />Bloklama ve bloğu açma (Blocking and Unblocking): Bir wait işlemi eğer ilgili<br />semaphore değeri 0 ise o işlemin bloke edilmesine neden olur. Semaphore’un değeri<br />signal ile 1 olunca bloke kaldırılarak işlem çalışabilir hale getirilir.<br />Örnek: İki işlemden bir tanesinin bir buffer’a çeşitli değerler aktardığını, diğerinin ise<br />buradan bu bilgileri aldığını farz edelim. Buna verilecek bir örnek bir satır<br />uzunluğundaki bir karakter dizisini her seferinde buffer’a atan bir işlem (process) ile<br />her seferinde buffer’dan bir satır alıp bunu ekrana yazan bir işlem olabilir. Burada bir<br />başka farz ediş ise tampon (buffer) büyüklüğünün kısıtlı olmasıdır (n satır<br />tutulabildiği). Bu durumda bu iki işlem arasında senkronizasyon gereklidir:<br />1. Eğer buffer dolu ise buraya bilgi aktarılmayacaktır.<br />2. Eğer buffer boş ise buradan bilgi alınmayacaktır.<br />0 ≤ d – e ≤ N<br />d: Buffer’a atılan satır sayısı<br />e: Buffer’dan alınan satır sayısı<br />N: Space avaible (Boş alan sayısı)<br />Q: Item avaible (dolu alan sayısı yani eleman sayısı)<br />Program for Producers<br />Repeat indefinitely<br />Begin<br />Produce item;<br />Wait (space avaible);<br />Wait (buffer maniplation);<br />Deposit item in buffer ;<br />Signal (buffer maniplation);<br />Signal (item avaible);<br />End.<br />Yukarıdaki program bir üretici programdır. Buffer’a eleman ekler. Elemanı<br />üretir, boş alan oluncaya kadar bekler, bufferı kullanıp kullanamayacağını sorgular<br /> (Buffer = 0), üretilen satırı buffer’a yerleştirir, buffer’ı serbest bırakır ve eleman<br />sayısını 1 arttır.<br />Program for consumers;<br />Repeat indefinitely<br />Begin<br />Wait (item avaible);<br />Wait (buffer maniplation);<br />Extract item in buffer ;<br />Signal (buffer maniplation);<br />Signal (space avaible);<br />End.<br />Yukarıdaki program bir tüketici programdır. Eleman sayısı 0’dan büyük olana<br />kadar- bufferda eleman oluncaya kadar bekler, bufferı kullanıp kullanamayacağını<br />sorgular (Buffer = 0), elemanı alır, buffera ulaşımı sağlar (Buffer maniplation’ı bir<br />arttırır), boş yer sayısını bir artırır.<br />Bu iki işlem bellekte aynı anda çalışmalarına rağmen buffer maniplation ile<br />aralarındaki iletişim sağlanmış ve kilitlenmeler önlenmiştir. Bir anda ancak bir işlem<br />buffera erişmektedir.<br />Monitör Programları<br />Monitör programları paylaşılan nesneye ulaşmada meydana gelebilecek problemleri<br />ortadan kaldırmaya yönelik olarak geliştirilmiştir. Yani izleyici programlardır.<br />1. Paylaşılan nesneyi oluşturan veri<br />2. Bu nesneye ulaşmak için kullanılan bir grup procedure<br />3. Nesneyi başlangıç durumuna getiren bir program parçasından oluşmaktadır.<br />Daha önceki buffer örneği için;<br />1. Buffer alanı ve buraya işaret eden pointerler<br />2. Depolama ve çıkarma işlemleri için kullanılan iki procedure<br />3. Buffer işaretçilerini eski haline getiren bir program parçası<br />Monitör programları, wait ve signal işlemleri yanlış gerçekleştirildiğinde oluşan<br />sistem kilitlenmeleri engeller. Semaforlarla işlemler arası kombinasyonu sağlarlar ve<br />wait ve signal işlemleri arasındaki senkronizasyonu sağlarlar.<br />