İşletim Sistemleri (Operating Systems)
Process’ler Arası Etkileşim
Birlikte Çalışan Process’ler Birlikte çalışan process’ler zaman içinde paralel işletilen process’lerdir. İki process’in paralel işletimi, bunlardan birinin işletimi tümüyle sonlanmadan diğerinin de işletime alınması durumunda sözkonusu olur. Process işletiminin paralelliği gerçek ya da görüntü paralellik olabilir. Birden çok işlemci içeren sistemlerde, eğer iki process, herbiri bir işlemciye atanmış biçimde işletiliyorsa buradaki paralelliğe gerçek paralellik denir.
Birlikte Çalışan Process’ler Tek işlemci içeren sistemlerde iki process’in paralel işletimi, bu process’lerin, zaman içinde işlemciyi sırayla kullanmaları yoluyla sağlanır. Buradaki paralellik, doğal olarak görüntü paralellikdir. Zira bu durumda, mutlak anlamda, her iki process’in de aynı anda işletiliyor olması sözkonusu değildir.
Birlikte Çalışan Process’ler Bir sistemde birlikte işletime alınan process sayısı genelde, sistemde bulunan işlemci sayısından çok daha büyüktür. Bu nedenle paralel işletim, daha çok görüntü paralellik kapsamında yürütülür. İster gerçek, ister görüntü olsun paralel işletim, çok önemli işletim bütünlüğü sorunlarını beraberinde getirir.
Process’ler arası Etkileşim Çoklu programlama (multiprogramming), bir process bitmeden diğer bir process’in işletilmesine olanak sağlamıştır. Birlikte çalışan yada işletimleri paralel sürdürülen process’ler birbirleriyle etkileşebilirler. Bu etkileşme, process’lerin, işletimleri sırasında bazı kaynakları ortak kullanmalarından kaynaklanır.
Process’ler arası Etkileşim Birlikte çalışan process’lerin aralarındaki etkileşim, çoğu kez kaynak paylaşımından doğar. Birlikte çalışan process’ler için ortak kaynaklar bir değişken, bir bellek alanı, bir disk alanı , tümüyle bir dosya yada bir giriş/çıkış birimi olabilir. Paylaşılan bir kaynak üzerinden veriye erişim üretici-tüketici (producer-consumer) problemi olarak modellenebilir.
Üretici Tüketici Problemi (Producer Consumer Problem) Aynı anda çalışan iki process bulunmaktadır ve bunlardan birisi üretmekte diğeri de bu üretilen ürünü tüketmektedir. Buradaki sorun, üretilen ürün henüz tüketilmeden ikincisinin üretilmemesi veya henüz ürün üretilmeden tüketilmemesidir. Problem tanımı itibariyle, process’ler arası iletişimi gerektirmektedir ve iki process birbiri ile senkronize olmalıdır. Yani tüketici, ne zaman tüketeceğine, üreticinin hareketlerine bakarak karar vermekte, benzer şekilde üretici de ne zaman üreteceğine, tüketicinin hareketlerine bakarak karar vermektedir.
Üretici Tüketici Problemi (Producer Consumer Problem) Veri üreten bir kullanıcı process’i ile bu verileri yazıcıdan döken sistem process’i birlikte çalışan iki process’dir. Kullanıcı process’inin ürettiği verilerin yazıcı sistem process’i tarafından dökülebilmesi, ilgili verilerin bir process’den diğer process’e aktarılmasını gerektirir. Bu aktarım her iki process’in ortak erişebildiği bir tampon bellek (buffer memory) alanı üzerinden gerçekleşebilir. Kullanıcı process’i, dökümü alınacak veriyi, sırayla bu tampon bellek alanına yazar. Yazıcı sistem process’i de, bu alandan okuduğu verilerin yazıcıdan dökülmesini sağlar. Ortak tampon bellek alanına yazma yapan process üretici, Ortak tampon bellek alanından okuma yapan process ise tüketici olarak nitelenir. Bu nedenle, kullanıcı process üretici, yazıcı sistem process’i ise tüketici process konumundadır.
Üretici Tüketici Problemi (Producer Consumer Problem) Ortak bir bellek alanı üzerinden veri alış-verişinde bulunan üretici ve tüketici process’ler birbirlerinin işletimini etkileyen process’lerdir. Bu bağlamda, daha önce verilen örnekte yazıcı sistem process’inin işletilebilmesi, kullanıcı process’inin yazdırılacak bir veriyi ortak tampon bellek alanı üzerinde hazır etmesine bağlıdır. Bunun gibi kullanıcı process’inin, yeni bir veriyi tampon bellek alanına yazabilmesi, bir önce yazılan verinin yazıcı process tarafından okunup dökülmüş olmasını gerektirir.
Üretici Tüketici Problemi (Producer Consumer Problem) Üretici Tüketici Problemi, process’ler arası etkileşimi gerektirmektedir ve iki process birbiri ile senkronize olmalıdır. Yani tüketici, ne zaman tüketeceğine, üreticinin hareketlerine bakarak karar vermekte, benzer şekilde üretici de ne zaman üreteceğine, tüketicinin hareketlerine bakarak karar vermektedir.
Üretici Tüketici Problemi (Producer Consumer Problem) Bounded (sınırlanmış) buffer üretici / tüketici probleminde n adet sabit buffer vardır. Üretici n buffer dolunca bekler , tüketici n adet buffer boşalınca bekler. Üretici üretmiş olduğu veriyi buffer’da boş yer varsa koyabilir. Yer yok ise tüketicinin buffer’dan bir veriyi almasını beklemek durumundadır. Tüketici ise ancak buffer boş değilse veri tüketebilir, aksi taktirde üreticinin buffer’a veri girmesini beklemesi gerekir. Unbounded (sınırlanmamış) buffer üretici / tüketici probleminde bufferların sayısında bir sınır yoktur. Tüketici yeni ürünler bekler , ve gelenleri tüketir , sadece ürün bitince bekler fakat üretici daima yeni ürün üretip koyabilir.
Bounded (sınırlanmış) buffer üretici / tüketici problemi Üretici Proses
Bounded (sınırlanmış) buffer üretici / tüketici problemi Tüketici Process
Bounded (sınırlanmış) buffer üretici / tüketici problemi İki örnek ayrı ayrı doğru olsa da eşzamanlı doğru çalışamayabilirler. counter=5 iken counter++ ve counter-- deyimlerinin aynı anda çalıştığını düşünelim. Ayrı zaman aralıklarında çalışmış olsalardı counter=5olacaktı.
Bounded (sınırlanmış) buffer üretici / tüketici problemi counter++ için makine komutları aşağıdaki gibi olabilir. counter-- için makine komutları aşağıdaki gibi olabilir.
Bounded (sınırlanmış) buffer üretici / tüketici problemi counter++ ve counter-- için sıralı zaman aralıklarında yapılan mikroişlemler aşağıdaki gibi olabilir. Yukarıdaki sırada buffer’daki eleman sayısı 4 olarak görülür, ancak gerçekte buffer’daki eleman 5 tanedir. T4 ile T5 yer değiştirirse buffer’daki eleman sayısı 6 olarak görülecektir. İki process aynı anda counter değişkeni üzerinde işlem yaptığından sonuç yanlış olmaktadır.
Bölüşülür ve Bölüşülemez Sistem Kaynakları Bilgisayar sistem kaynakları; Bölüşülür kaynaklar : Bir process tarafından kullanımı tümüyle tamamlanmadan diğer processler tarafından da kullanılabilen (tüketilebilen) kaynaktır. (İşlemci, ana bellek disk birimi vs.) Bölüşülmez kaynaklar : Process tarafından kullanılmaya başlandığında, bu kullanım tümüyle sonlanana değin diğer process’lerin kullanımına sunulamaz. (Yazıcı, CD, vs.)
Bölüşülür ve Bölüşülemez Sistem Kaynakları Birlikte çalışan process’lerce paylaşılan değişken, bellek, dosya, sürücü gibi kaynakların bölüşülür olup olmama özellikleri bu kaynaklar zerinde yapılan işlemin türüne de bağlıdır. Kaynaklar üzerinde yapılan işlem okuma ve yazma işlemleridir. Birlikte çalışan iki process, ortak kaynağa, tüm olasılıklar gözönüne alındığında: okuma - okuma, okuma - yazma, yazma - okuma, yazma - yazma işlemlerini gerçekleştirmek üzere erişirler. Bu işlemlerden okuma-okuma için kaynak her zaman bölüşülür özellik gösterir. Ancak diğer işlemler için kaynaklar bölüşülür değildir.
Process İşletim Bütünlüğü Bölüşülmez kaynaklar kritik kaynaklar olarak adlandırılır. Kritik kaynakların process’ler tarafından paylaşılması önlem alınmadan yapılamaz. Kaynağa erişmeden önce kaynağın kullanım durumunun sınanması ve diğer process’lerin o anda kaynak üzerinde işlem yapmadıklarından emin olunması gereklidir. Bunun yapılmaması durumunda birlikte çalışan process’lerin işletim bütünlüğü korunamaz.
Process İşletim Bütünlüğü Birlikte çalışan process’lerin kritik kaynaklara erişimi rasgele yapılamaz. Birden çok process kritik kaynağı paylaşmak istediğinde, aralarında yalnız birinin kaynağı sahiplenmesine yol açacak önlemlerin alınması, bu process’lerin işletim bütünlüğünün korunması için gereklidir.
Process İşletim Bütünlüğü Bunun için bir process’in kritik kaynak üzerinde işlem yaptığı bir anda diğer process’lerin de bu tür istemleri sözkonusu olursa, bu istemlerin, kaynak serbest kalana dek ertelenmesi gereklidir. Kritik kaynağa erişmeden önce, kaynağın kullanım durumunun sınanması, kaynak kullanılıyor ise amaçlanan erişimin ertelenmesi process’ler arası zaman uyumlama (senkronizasyon) olarak bilinir.
Kritik bölge (critical section) ve Karşılıklı dışlama (mutual exclusion) Kritik kaynağa erişim yapan program kesimi kritik bölge (critical section) olarak adlandırılır. Kritik kaynağa aynı anda en çok bir process’in erişebilmesi kritik kaynağa erişim yapan process’lerden en çok birinin kritik bölge içinde bulunmasının sağlanmasıyla gerçekleşebilir.
Kritik bölge (critical section) ve Karşılıklı dışlama (mutual exclusion) Kritik bölge içinde işlem yapan bir process’in diğer process’lerin aynı kaynağa erişim yapan kritik bölgelerine girmelerini engellemesi gerekir. Bu engelleme karşılıklı dışlama (mutual exclusion) olarak tanımlanır. Başka bir deyişle process’ler arası zaman uyumlama (senkronizasyon), process’ler arası karşılıklı dışlama yoluyla gerçekleşir. Karşılıklı dışlama process’lerin kritik kesimlerine giriş ve çıkışlarında alınan önlemler yoluyla gerçekleştirilir.
Karşılıklı Tıkanma Birlikte çalışan process’lerin işletim bütünlüğünün korunması için salt karşılıklı dışlamanın gerçekleştirilmesi yeterli olmaz. Karşılıklı dışlamanın sağlanmasının yanı sıra karşılıklı tıkanmanın da engellenmesi gerekir. Karşılıklı tıkanma, process’lerin, birbirlerinin işletimlerini karşılıklı olarak, sürekli engellemelerine verilen addır.
Kritik bölge probleminin çözümü için gereksinimler Mutual exclusion (karşılıklı dışlama):Bir Pi process’i kritik bölümünü çalıştırıyorsa diğer process’lerin hiç birisi kritik bölümlerini çalıştıramazlar. Progress: Hiçbir process kritik bölümünü çalıştırmıyorsa, kritik bölüme girmek isteyenlerden (remainder section çalıştırmayanlar arasından) bir tanesinin kritik bölüme girmesine izin verilir. Bounded waiting (sınırlı bekleme): Bir process kritik bölüme girme izni istedikten sonra ve izin verilmeden önceki aralıkta,kritik bölüme giriş izni verilen process sayısının sınır değeri vardır.
Terimler Yarış durumu (race condition) : iki bağımsız process’in aynı kaynak üzerine aynı zaman diliminde erişmeye çalışması sonucu bir process’in diğerinden önce o kaynağa erişip farklı sonuçlar üretmesine yol açan durum. Kritik bölge (critical section) : Paylaşılan kaynak için erişimi gerektiren bir process içindeki kod bölümüdür. Bir process bu kod bölümünde ise başka process’lerin bu kod bölümünü çalıştırmaması gerekir. Aynı kaynağa ilişkin kritik bölge kod parçasını ancak bir anda tek bir process’in veya thread’in yürütmesi gerekir. Karşılıklı dışlama (mutual exclusion) : Bir process paylaşılan kaynaklara erişen kritik bir bölümde olduğunda başka bir process bu paylaşılan kaynakların kritik bölgesine girmek istediğinde kritik bölgede olan process’in engellemesi durumudur.
Terimler Açlık (starvation) : Aynı kaynakları kullanan prosesler. Bazı proseslerin bekledikleri kaynaklara hiç erişememe durumu. Bekleyen prosesler sonsuz beklemeye girebilir. Senkronizasyon (synchronization) : Process’lerin yürütülme sıraları önceden kestirilmez. Process’lerin üretecekleri sonuçlar çalışma sıralarına bağlı olmamalıdır. ÖRNEK: Bir P1 görevi bir P2 görevinin ürettiği bir sonucu kullanıp işlem yapacaksa, P2’ nin işini bitirip sonucu üretmesini beklemeli. Ölümcül kilitlenme (deadlock) : İki veya daha fazla process’in biri diğerinden bir şeyler beklediğinden dolayı ilerleyemediği durumdur. Aynı kaynakları kullanan process’lerden, birinin istediği kaynağı bir diğeri tutuyor ve bırakmıyor. Process’lerin hiç biri ilerleyemez.
Yarış Durumu (Race Condition) Paylaşılmış kritik kaynaklara eşzamanlı erişim tutarsızlık problemlerine yol açabilir. Paylaşılan ortak alana hangi process'in önce gireceği, oradaki değeri kimin alacağı ve nasıl değiştireceği gibi sorunlar en temel anlamda yarış durumudur (race condition). Process'ler paylaşılan ortak alandaki veriye ulaşabilmek için birbirleriyle yarış halindedirler.
Yarış Durumu (Race Condition) Aynı değişkene çok sayıda process’in erişmesi durumunda sonuç değer erişim sırasına bağlı olarak değişecektir. (race condition) Bir değişkene aynı anda sadece bir process’in erişmesi sağlanmak zorundadır. (process synchronization)
Yarış Durumu (Race Condition) Günümüzde işletim sistemlerinin farklı kısımlarındaki process’lerin aynı veriye erişiminde senkronizasyon yapılmak zorundadır. Multicore işlemcilerde çalışan multithread uygulamalarda da process senkronizasyonu yapılmak zorundadır.
Yarış Durumu (Race Condition) Örnek: a=b korunacak başta a=1, b=1 P1: a=a+1; b=b+1; P2: b=2*b; a=2*a; a=a+1; b=2*b; Sıralı çalışırsa sonuçta a=4 ve b=4 Bu sırayla çalışırsa sonuçta a=4 ve b=3 X
Yarış Durumu (Race Condition) - Örnek Örneğin A ve B isimli iki işlemin “Hesap” isimli orak veri alanı üzerinde işlem yaptığını varsayalım. Başlangıçta Hesap değişkeninde 1000$ olduğunu varsayalım. A işlemi, banka hesabına 100$ para yatırılması, B işlemi ise aynı hesaptan 200$ çekilmesini gerçekleştirmektedir ve iki işlem de hemen hemen aynı zamanda başlatılmıştır.
Yarış Durumu (Race Condition) - Örnek İşlem A A1. Hesap değerini oku ve yerel YerelHesapA değişkenine ata. A2. YerelHesapA ← YerelHesapA +100 A3. YerelHesapA değişkeni içindeki değeri Hesap değeri olarak yaz. İşlem B B1. Hesap değerini oku ve yerel YerelHesapB değişkenine ata. B2. YerelHesapB ← YerelHesapB - 200 B3. YerelHesapB değişkeni içindeki değeri Hesap değeri olarak yaz.
Yarış Durumu (Race Condition) – Örnek Çözüm Bu durumda Hesap değişkeni üç farklı son değere sahip olabilir. I.Durum CPU önce İşlem A’yı ardından İşlem B’yi veya önce İşlem B’yi ardından İşlem A’yı çalıştırırsa Hesap değişkeninde 900$ bulunmaktadır. Bu strateji işlemi bütün olarak çalıştırmaktadır. II.Durum Bu çalışma sırasında A ve B aynı değerleri okuyup yerel kopyalarında değişiklik yapıyorlar ve yerel kopyasını son yazan (ki bu durumda A ) Hesap değişkeninin aldığı son değeri belirliyor (1100). III.Durum Son yazanın Hesap değişkenini belirlemesi burada da İşlem B tarafından gerçekleştiriliyor (800).
Kritik Bölge (Critical Section) Bir sistem, {P0, P1, ..., Pn-1} şeklinde n tane process’e sahip olsun. Her process, ortak değişkenler, tablolar veya dosyalar üzerinde işlem yapan kritik bölgeye sahip olabilir. Bir process kendi kritik bölümünü çalıştırırken diğer process’lerin kendi kritik bölümlerini çalıştırmamaları zorunludur. Aynı anda iki process kritik bölümünü çalıştırmamalıdır. Belirli bir anda sadece tek bir process kritik bölgesindeki kodu yürütebilir.
Kritik Bölge (Critical Section) KritikBölgeY Process 1, 2 ve 3 ’ün ortak kullandıkları Y değişkenine erişip değişiklikler yaptıkları program parçalarını simgelemektedir. KritikBölgeX ise İşlem 1 ve 3 ’ün ortak kullandıkları X değişkenine erişip değişiklikler yaptıkları program parçalarını simgelemektedir. Process 1, 2 veya 3 ’ten bir tanesi aynı anda KritikBölgeY’de bulunabilirler. Aynı şekilde ancak Process 1 veya 3 ’ten bir tanesi aynı anda KritikBölgeX’de bulunabilirler. Process 1 Process 2 Process 3 -- -- -- -- KritikBölgeY -- KritikBölgeX -- KritikBölgeX -- -- KritikBölgeY KritikBölgeY -- --
Kritik Bölge (Critical Section) T1 anında A process’i kritik bölgesine girer. T2 anında B process’i kritik bölgesine girmeye çalışır fakat başarısız olur ve T3 anına kadar bloklanır. T3 anında, B kritik bölgesine girer. T4 anında, B kritik bölgeyi terk eder. Kritik Bölgeye Erişim
Karşılıklı Dışlama (mutual exclusion- mutex) Kritik bölge probleminden sakınmak için karşılıklı dışlama (mutual exclusion) yöntemi bir çözüm olarak kullanılır. Bir process ortak değişken üzerinde işlem yapıyorsa başka bir process bu değişken üzerinde işlem yapamaz ve dışlanır. Karşılıklı dışlama process’lerin kritik kesimlerine giriş ve çıkışlarında alınan önlemler yoluyla gerçekleştirilir.
Karşılıklı Dışlama (mutual exclusion- mutex) Karşılıklı Dışlamada Dikkat Edilmesi Gerekenler : İki process aynı anda kritik bölge içerisine girmemelidir. Kritik bölgeye girmek isteyen process’ler eğer başka bir process kritik bölgede değilse engellenmemelidir. Bir process kritik bölge içinde sonsuza kadar beklememelidir. Kritik bölge dışında çalışan bir process, başka process’leri bloklayamaz. Sistemdeki işlemci sayısı ve hızı ile ilgili kabuller yapılmamalıdır, bu değerlerden bağımsız olmalıdır.
Karşılıklı Dışlama Örneği Process 1: while (TRUE){ //kritik bölge dışındaki kodlar karsilikli_disla_basla //kritik bölge kodları karsilikli_disla_bitir } Process 2: while (TRUE){ //kritik bölge dışındaki kodlar karsilikli_disla_basla //kritik bölge kodları karsilikli_disla_bitir }