Elektronik

Proses Yönetimi

İŞLETİM SİSTEMLERİ2. Proses Yönetimi

2. Proses Yönetimi

Özlü Söz

 

“Fizik, evrenin işletim sistemidir.”(Steven R. Garman)

Kazanımlar

∙ Proses ve program parçası arasındaki farkı öğrenebilir.

∙ CPU planlama algoritmalarını tanıyabilir ve parametrelerini hesaplayabilir.

∙ Prosesler arasındaki iletişimin neden olabileceği problemleri öğrenebilir ve çözüm üretebilir.

∙ Prosesler arasındaki iletişimi sağlayan mekanizmaları öğrenebilir ve çözüm üretebilir.

∙ Kilitlenme problemlerine çözüm üretebilir.

Birlikte Düşünelim

 

1. Prosesler arasındaki iletişim için hangi mekanizmalar kullanılmaktadır?2. Kilitlenme durumundan kurtulmanın yolları neler olabilir?3. Çok çekirdekli sistemlerde gerçek anlamda paralellik sağlanmakta mıdır?

Başlamadan Önce

 

Bir önceki bölümde, işletim sisteminin bilgisayar sistemindeki yeri ve önemi anlatılmış; işletim sistemi yazılımlarının üstlendiği görevler incelenerek, yaygın olarak kullanılan işletim sistemleri türlerine yer verilmişti. Bu bölümde prosesler, işletim sisteminin proses yönetimi için gerçekleştirdiği aktiviteler daha ayrıntılı bir şekilde anlatılacaktır. Proseslerin birbirleriyle uyumlu bir şekilde çalışabilmesi için gerekli olan koşullar, proseslerin birbirleriyle iletişim kurmasını sağlayan mekanizmalar, proseslerin oluşturabileceği sorunlar ve bu sorunları önlemek için kullanılan yaklaşımlar ele alınacaktır.

2.1. Prosesler

Proses, daha sonra tüm hesaplamaların temelini oluşturan yürütülmekte olan program parçasıdır. Program çalıştırılmadığı sürece pasif bir varlıktır, proses ise programın aksine aktif bir varlıktır. Toplu (Batch) sistemlerde proses yerine iş (job) terimi kullanılmaktadır (Silberschatz, Gagne, & Galvin). Birçok işletim sisteminde proses terimi yerine job terimi kullanılmaktadır. Bu iki terim birbirlerinin yerine kullanılmaktadır.

 

Şekil 3. Proses Özellikleri (javaTpoint, 2021)

Prosesin özellikleri proses kontrol bloğunda tutulur. Proses kontrol bloğu, her proses için işletim sistemi tarafından tutulan bir veri yapısıdır. Proses kontrol bloğu, proses ID (PID) numarası ile tanımlanırlar. Bu numara sayesinde hangi prosesin bilgilerini tuttuğu anlaşılır. Her proses, proses kontrol bloğu tarafından işletim sisteminde temsil edilir. Proses kontrol bloğu prosesin ihtiyaç duyabileceği tüm bilgileri saklamamızı sağlar. Kaydedicilerin içeriğini depolamaktan sorumludur. Bir prosesin durum bilgisi değiştiğinde işletim sistemi tarafından proses kontrol bloğundaki proses durumu alanına ait bilgi güncellenir.

Bir proses ana belleğe “Çizim 9”da gösterilen bir düzen içerisinde yerleştirilir. Stack ve Heap kavramlarının dilimizdeki karşılığı “yığın” dır. Aynı anlama gelirler fakat prosesin farklı bölümlerini saklarlar. Bir program tarafından çağrılan bir fonksiyonun ihtiyaç duyabileceği bütün veriler (yerel değişkenleri, yerel fonksiyonları ve dönüş adresleri) bu alanda saklanır.

 

Çizim 9. Prosesin Ana Bellek İçerisindeki Düzeni

 

Kod 1. Stack bölümü örnek kod parçası.

Kod 1’de tanımlanan kod parçası yerel fonksiyon olması, yerel değişkenler içermesi ve dönüş adresiyle beraber ana belleğin stack bölümünde saklanır. Stack bölümü “en son giren en önce çıkar” (last input first output-LIFO) mantığı ile çalışır. Bu bölüm genellikle işletim sistemi çekirdek alanının hemen altındaki daha yüksek bellek adreslerinde yer alır. Standart X86 mimari yapılarında 9’da görüldüğü gibi stack alanı aşağıya doğru büyür. Bazı mimari yapılarında ise zıt yönlü bir büyüme olur. Stack işaretçisi (stack pointer) yığının en üst noktasını gösterir. Stack pointer ile heap pointer karşılaşırsa veya stack alanının sınırına ulaşılırsa kullanılabilir boş belleğin tükendiği anlamına gelir.

Bir program çalışma zamanı sırasında belleğe ihtiyaç duyduğu zaman dinamik bellek sağlamak için heap bölümünü kullanılır. Örneğin; boyutu yalnızca çalışma zamanında bilinebilen ve program yürütülmeden önce derleyici tarafından statik olarak belirlenemeyen değişkenler için programcı tarafından talep edilen miktarda heap bölümünde yer ayrılır. Heap bölümü C dilinde “malloc/free” C++ dilinde ise free/delete” komutları ile yönetilebilir.

BSS segmentinin açılımı “Block Started by Symbol”’dür. Başlatılmamış veri segmenti anlamına gelir. BSS segmenti 0 aritmetik değer ile başlatılmış veya kaynak kodun içerisinde açık bir şekilde herhangi bir değer ataması olmamış tüm genel ve statik değişkenleri içerir. Örneğin static int a; olarak tanımlanmış bir değişken BSS segmentine tahsis edilir.

Data segmenti, BSS segmentinin aksine başlangıç değeri atanan global ve statik veri değişkenlerini içerir. (Bk. Kod 2)

 

Kod 2. Data Alanı Örnek Kod Parçası

Text bölümü, code bölümü olarak da bilinir. Programın çalıştırılabilir komutlarının bulunduğu bölümdür. Bu bölümde yer alan komutların sadece okunabilmesine ve çalıştırılmasına izin verilir.

CPU planlama algoritmalarına göre ana bellekten kod parçaları seçilir. Her proses belirli bir süre işlemci tarafından yürütülür. Prosesler, kendilerine ayrılan sürenin dolması ile CPU’dan ayrılırlar. Bu süre zarfında prosesler tamamlanamadıysa bekleme kuyruğuna alınırlar. Bazı prosesler giriş-çıkış işlemleri gereksiniminden veya öncelikli prosesin gelmesi durumları gibi sebeplerden dolayı zamanı dolmadan işlemciyi terk edebilir ve bekleme kuyruğuna gelebilir. İş planlayıcısı tarafından bekleme kuyruklarından ilgili proses seçilerek CPU’ya gönderilir. Tüm bu süreçlerde proses farklı durumlara geçer. Prosesin durumları ve bu durumlara geçiş akışı Çizim 10’da verilmektedir.

Çizim 10’da görüldüğü gibi ana bellekten planlayıcı tarafından seçilip getirilen program prosesin “yeni” durumunu temsil eder. Proses oluşturulduktan sonra “hazır” durumuna geçer. Proses çalıştırılmak için hazırdır. İşletim sistemi çalıştırılacak diğer işlemleri diskten alır ve ana belleğe getirir. CPU’ya atanan ve çalıştırılan proses “çalışıyor” durumuna geçer. Eğer bir proses giriş-çıkış işlemlerine ihtiyaç duyarsa “Bekleme/Bloklama” durumuna geçer. Prosesin giriş-çıkış işlemleri bittiğinde çalıştırılmak üzere “hazır” durumuna geçer. Bekleme kuyruğu tamamen dolu olduğunda “Askıya al-bekle” durumuna geçiş yapar. Hazır kuyruğu tamamen dolu olduğunda “Askıya al-hazır” durumuna geçer. Kuyruklar boşaldığında ilgili proses hazır durumuna geçer. Prosesin tüm işlemleri tamamlandığında “son” durumuna sahip olur.

İşletim sistemi proses oluşturabilir, planlama işlemi gerçekleştirir, çalıştırır, silebilir veya öldürebilir. Proseslerin planlanması çeşitli planlayıcılar tarafından yapılır. Uzun dönemli planlayıcılar iş planlayıcı olarak da bilinirler. Diskten prosesleri seçerler ve ana bellekte yer alan hazır kuyruğunda prosesleri tutarlar. Temel amacı giriş/çıkış işlemlerine bağlı veya CPU’ya bağlı prosesler arasından en iyi seçimleri yapmaktır. Bu görev oldukça önem arz eder. İş planlayıcısı görevini en uygun şekilde gerçekleştirmezse eğer giriş-çıkış işlemleri uzun süren prosesler, diğer proseslerin çok daha fazla beklemesine, CPU’nun çok daha fazla atıl durumda kalmasına neden olabilir. Bir diğer planlama işlemi CPU tarafında gerçekleştirilir. CPU planlayıcı olarak da anılırlar. CPU planlayıcısı, hazır kuyruğunda yer alan proseslerin seçimini ve planlamasını gerçekleştirir. Hazır kuyruğunda bekleyen CPU planlayıcı tarafından seçilen prosesler, CPU’ya çalıştırılmak üzere gönderilir. Hazır kuyruğundan hangi prosesin seçileceğini belirlemek algoritmalar ile yapılır. CPU planlayıcısı görevi en uygun şekilde yapmazsa hazır kuyruğunda bekleme süresi artabilir. Bu durum istenmeyen bir durumdur. Prosesler farklı durumlara geçiş yaparlar (yukarıda bu durumdan bahsedilmiştir). Çalışan bir proses, bazı zamanlarda giriş/çıkış işlemlerine ihtiyaç duyabilir ve o zaman bu prosesin durum bilgisi “bekleme/bloklama” olur. Orta vadeli planlayıcı işte tam bu durumlarda devreye girer ve giriş/çıkış işlemlerine ihtiyaç duyan prosesi alır ve diğer proseslerin CPU tarafından işletilmesine imkân sağlar. Bu takas durumudur. Orta vadeli planlayıcı, en uygun şekilde prosesleri askıya almak ve gerektiği vakitte prosesleri tekrar sürdürmekten sorumludur.

 

Çizim 10. Proses Durum Diyagramı.

Program parçaları çalıştırılmadan önce diskte saklanırlar. Diskten iş planlayıcı tarafından ana belleğe getirildiği zaman prosesin varış zamanını belirtir. Proses ana belleğe getirildikten sonra CPU’ya çalıştırılmak üzere anahtarlanır. Prosesin CPU’da kaldığı toplam süre patlama süresi (burst time) olarak bilinir. Patlama süresi prosesin sadece CPU’da kaldığı süreyi temsil ettiği için prosesin bekleme süresi bu süreye dahil değildir. Bir prosesin çalışma süresini proses çalıştırılmadan tam anlamıyla tahmin etmek oldukça zordur. Prosesin tamamlanması için gerekli olan zaman tamamlanma süresi “completion time” denir. Prosesin ana belleğe gelmesinden tamamlanmasına kadar geçen süre dönüş süresi “turnaround time” denir. Bekleme süreleri dönüş süresine dahildir. Prosesin CPU’ya atanmak için beklediği toplam süre bekleme süresi “waiting time” denir. Prosesin ana belleğe geldikten sonra CPU’ya ilk anahtarlanmasına kadar geçen süre ise tepki süresi (response time)’dir.

2.2. Cpu Planlama

Tek programlamada CPU tek bir prosese anahtarlanır ve o proses tamamlanana kadar sadece ona hizmet ederdi. Prosesin bekleme durumlarında CPU atıl durumda kalır ve verimsizlik meydana gelirdi. Daha çok zamanda daha az görev tamamlanırdı.

Çoklu programlamada CPU tek bir prosese atanmaz. Bekleme sürecinde CPU’ya başka prosesler de atanır ve bekleme süresi başka bir prosesin icra edilmesi şeklinde değerlendirilir. Böylece CPU atıl durumda kalmaz ve daha az zamanda daha fazla görev yerine getirilebilir.

CPU planlayıcısı, çoklu programlamada CPU’dan maksimum derecede yararlanabileceği şekilde proses seçimi gerçekleştirir ve planlamasını yapar. CPU planlayıcısı işletim sisteminin bir parçasıdır. İşletim sistemi bu görevi yerine getirirken çeşitli algoritmalar kullanır.

Bir planlama algoritmasının temel amaçları aşağıda özetlenmektedir (javaTpoint, 2021);

∙ Maksimum seviyede CPU’dan faydalanmak.

∙ Bekleme, tepki ve dönüş sürelerini en aza indirmek.

∙ Maksimum verimlilik elde etmek.

CPU planlayıcısı bu amaçları yerine getirmek için çeşitli algoritmaları kullanır. Yaygın olarak kullanılan algoritmalardan bazıları;

∙ İlk gelen ilk hizmeti alır. (FCFS)

∙ Round Robin

∙ Önce en kısa iş (Shortest Job First- SJF)

∙ Öncelik temelli planlama (Priority based scheduling-PbS)

Algoritmaların ayrıntılarını sırasıyla inceleyelim:

2.2.1. Fcfs Planlama Algoritması

FCFS algoritmasının temel mantığı oldukça basittir. İsminden de kolayca anlaşılacağı gibi bu algoritmayı kullanan CPU planlayıcısı, proseslerin varış sürelerini dikkate alarak prosesleri CPU’ya anahtarlar. İlk gelen proses önceliğe sahiptir. İlk gelen proses, uzun bir CPU işlemine (burst time) ihtiyaç duyuyorsa, diğer prosesler uzun bir süre bu prosesin tamamlanmasını bekleyeceklerdir. Bazı prosesler ise CPU’ya hiç anahtarlanamayacaktır. Bu durum starvation dilimizdeki karşılığı açlık durumunun oluşması demektir.

FCFS algoritmasının uygulanmasının ve anlaşılmasının kolay olması FCFS algoritmasının kullanılma nedenleridir. Fakat FCFS algoritmasının performansı zayıftır. FCFS algoritmasında, proses sonsuz döngüye girerse veya başka herhangi bir sıkıntı meydana geldiğinde kilitlenme durumu yaşanabilir ve açlık probleminin yaşanma ihtimali doğası gereği yüksektir.

FCFS algoritmasının bekleme süresi hesabını örnek senaryo üzerinden gerçekleştirelim:

Örnek: P0, P1, P2, P3 isminde 4 farklı prosesin bekleme kuyruğunda olduğunu düşünelim (Bk. Tablo 2).

Tablo 2. FCFS Proses Bilgileri

 

Bu bilgiler ışığında proseslerin dönüş süresi (turnaround) (TA) ve bekleme sürelerini (WT) hesaplayalım. Prosesleri GANTT çizelgesi üzerinde yerleştirelim.

Çözüm:

Dönüş süresi (TA): Prosesin ana belleğe gelmesinden tamamlanmasına kadar geçen süreyi temsil eder.

 

Yukarıda verilen GANTT şemasında görüldüğü gibi 0. zaman noktasında P0 prosesi gelir ve CPU’da işlenme süresi 3 birimdir. Herhangi bir bekleme gerçekleşmediği için tamamlanma süresi de 3 birimdir. TA= 3-0=3 birimdir. P0, CPU’ya anahtarlandıktan 3 birim sonra tamamlanır. WT=0’dır.

P1 prosesi 1. Zaman noktasında gelir. Fakat P0 o sırada işlem görmektedir. Bu nedenle 2 birimlik bir bekleme süresi geçirir. (WT=2). Ancak 3. zaman noktasında CPU’ya anahtarlanabilir ve CPU’da geçireceği zaman birimi 6’dır. P1 prosesinin tamamlanma süresi bu durumda 9 olur. TA=9-1=8 birimdir. P2 prosesi 10. zaman noktasında gelir. O zaman noktasında CPU boştadır ve hemen işleme alınır. WT=0’dır. TA=14-10=4 birimdir. P3 prosesi 12. zaman noktasında ana belleğe gelir. O sırada CPU, P2’yi çalıştırmaktadır. P2, 2 birimlik bir bekleme süresi geçirir. WT=2 birim TA= 15-12=3 birimdir.

2.2.2. Round Robin (Rr) Planlama Algoritması

Round robin planlama algoritması işletim sisteminde en çok kullanılan planlama algoritmalarından biridir. Round robin planlama algoritması FCFS algoritmasının yetersiz kaldığı noktayı zaman paylaşımı ile aşar. RR algoritmasında her prosese kuantum adı verilen belirli bir zaman dilimi verilir. Hazır kuyruğunda bulunan her proses kendisine ait olan kuantum süresi kadar CPU’da kalır. Bu zaman dilimi içerisinde proses işlemini tamamlayabilir veya tamamlanamadan tekrar hazır kuyruğuna gönderilir. Tekrar sırasının gelmesini bekler. Bu şekilde sonsuz döngülerin sebep olduğu kilitlenmelerin önüne geçilmiş olur ve açlık problemi oluşmaz.

Örnek: P0, P1, P2 isminde 3 farklı prosesin bekleme kuyruğunda olduğunu düşünelim (Bk. Tablo 3). Sistemin kuantum süresinin 3 olduğu varsayalım. RR algoritması kullanılarak GANTT şemasını çizelim.

Tablo 3. RR Örnek Proses Bilgileri.

ProsesP0P1P2
Varış zamanı (AT)0110
Burst time (BT)364

Bu bilgiler kullanılarak GANTT şemasını çizelim.

Çözüm:

 

P1 prosesi tamamlanmadan CPU’dan ayrılmıştır. P1 prosesinin 3 birimlik daha görevi vardır. P2, 10. Zaman noktasında gelecektir. İşlem sırası P0’dadır. P0, 3 birimlik kuantum süresi boyunca tamamlanmıştır. Bu nedenle işlem sırası tekrar P1’dedir. P1, 3 birim daha CPU’da işlenir ve tamamlanır.

 

10. zaman noktasında P2, CPU’da işleme alınır ve başka bir proses bekleme kuyruğunda olmadığı için P2 tamamlanır.

 

2.2.3. Sjf Planlama Algoritması

SJF algoritması, patlama süresini (burst time-BT) dikkate alarak planlama işlemini gerçekleştirir. En az iş yüküne sahip olan proses en önce işleme alınır. Böylece ortalama bekleme süresi minimize edilmeye çalışılır. SJF algoritmasında uzun bir BT süresine sahip bir proses çok beklemek zorunda kalabilir.

Örnek: P0, P1, P2 isminde 3 farklı prosesin bekleme kuyruğunda olduğunu düşünelim (Bk. Tablo 4). SJF algoritması kullanılarak GANTT şemasını çizelim.

Tablo 4. SJF Örnek Proses Bilgileri

ProsesP0P1P2
Varış zamanı (AT)012
Burst time (BT)364

Çözüm:

 

2.2.4. Öncelik Temelli Planlama Algoritması

Öncelik temelli planlama algoritmasında her prosese bir öncelik değeri atanır. Bu değer bir sayısal ifadedir. Bazı sistemlerde bu sayı değerinin yüksek olması prosesin daha öncelikli olduğunu gösterirken bazı sistemlerde de prosesin öncelikli olabilmesi için prosesin öncelik değerinin düşük olması gerekir. Önceliği yüksek olan proses ilk önce CPU’ya atanır.

Öncelik değeri, proseslerde değişken gösterebilir veya sabit kalabilir. Proses süreci boyunca öncelik değeri değişmezse sabit öncelik, kendini değiştirmeye belirli aralıklarla değiştirmeye devam ederse dinamik öncelik olarak adlandırılır (javaTpoint, 2021).

Öncelik temelli planlama algoritmalarında 2 farklı yaklaşım kullanılmaktadır. İlk yaklaşımda başkasına engel olmayan bir öncelikli planlamadır. Bu planlama türünde önceliği yüksek olan bir proses çalışır durumdayken kendisinden daha öncelikli bir prosesin o süre içerisinde gelmesi, prosesi etkilemez çalışması tamamlanana kadar CPU tarafından çalıştırılmaya devam edilir. Bu şekilde olan öncelikli planlama algoritmasında kesintisiz (non-preemptive priority) planlama denir. Eğer ki önceliği yüksek olan bir proses çalışır durumdayken kendisinden daha öncelikli bir prosesin gelmesi, prosesi etkilerse ve CPU yeni gelen önceliği daha yüksek olan prosese anahtarlanırsa öncelikli planlama algoritması kesintili (preemptive priority) olarak anılır.

Kesintisiz ve kesintili algoritmaları arasındaki farkı daha iyi anlayabilmek için birer örnek çözelim.

1. Kesintisiz öncelikli planlama algoritması:

Örnek: P0, P1, P2 isminde 3 farklı prosesin bekleme kuyruğunda olduğunu düşünelim (Bk. Tablo 5). Kesintisiz (Non-preemptive) öncelikli planlama algoritması kullanılarak GANTT şemasını çizelim.

Tablo 5. Non-Preemptive Öncelikli Planlama Algoritması Örnek Proses Bilgileri

ProsesP0P1P2
Varış zamanı (AT)012
Burst time (BT)364
Öncelik değeri2 (Düşük)34

Çözüm

 

2. Preemptive öncelikli planlama algoritması:

Örnek: P0, P1, P2 isminde 3 farklı prosesin bekleme kuyruğunda olduğunu düşünelim (Bk. Tablo 6). Kesintili (Preemptive) öncelikli planlama algoritması kullanılarak GANTT şemasını çizelim.

Tablo 6. Preemptive Öncelikli Planlama Algoritması Örnek Proses Bilgileri

ProsesP0P1P2
Varış zamanı (AT)012
Burst time (BT)364
Öncelik değeri2 (Düşük)34

Çözüm:

 

2.3. Proses Senkronizasyonu

Bazı prosesler birbirleriyle ilişkilidir. Bir proses; ebeveyn(parent) proses veya çocuk (child) proses olabilir. Çocuk proses, ebeveyn prosesinden doğar. Ebeveyn prosesler, çocuk prosesi ile eş zamanlı çalışabilir. Çocuk proseslerin kendi aralarında ortak kullandıkları bir kaynak olabilir. Çocuk prosesler ebeveyn prosesi ile ortak bir kaynak paylaşabilir. Ebeveyn prosesler başka ebeveyn proseslerle iş birliği yapabilir. Bu şekilde birden fazla proses birbirleriyle iş birliği yaptığında birbirlerinin çalışmasını engellemeyecek şekilde proses seçimlerinin yapılması gerekir. Aksi takdirde çıktılarda hata meydana gelebilir. Prosesler arasındaki bu dengenin korunması ve prosesler arasındaki iletişimin sağlıklı bir şekilde devam edebilmesi için proseslerin senkronize edilmesi gerekir. Çeşitli senkronizasyon mekanizmaları vardır.

Prosesler arasında meydana gelen 2 temel olay vardır:

1. Yarış durumu: Birden fazla proses aynı anda belleğin aynı alanını okumaya, yazmaya veya aynı alana erişmeye çalıştıklarında oluşur. Bir proses paylaşılan bir kaynağa erişmek istediğinde bu kaynağı kullanan diğer proseslerin bu kaynak üzerindeki çalışmasının bitmiş olması gerekir.

2. Kritik bölge: Aynı kaynağa erişmek isteyen birden fazla proses yarış durumuna geçer. Bir prosesin paylaşılan kaynaklar üzerinde işlem yaptığı kod parçası kritik bölge olarak isimlendirilir. Bir proses kritik bölgedeyse başka bir proses kritik bölgede olmamalıdır.

Kritik bölge yönetimi işletim sistemi tarafından yapılmaktadır. İşletim sistemi proseslerin yarış durumunun ortaya çıkmaması ve kritik bölge problemini çözmek için senkronizasyon mekanizmalarına başvurur. Mekanizmalar aşağıda belirtilen koşulları sağlamalıdır:

1. Karşılıklı dışlama: Bir proses kritik bölgedeyse başka bir proses kritik bölgeye giremez. Karşılıklı dışlama prosesler arasındaki yarış durumunu engeller.

2. İlerleme (Progress): Kritik bölgede herhangi bir proses bulunmuyorsa kritik bölgeye girmek isteyen başka proseslerden birine izin verilmelidir.

3. Sınırlı bekleme (Bounded Waiting): Proses kritik bölgeye girmek için sonsuz bir bekleme yapmamalıdır.

Kritik bölge problemine yazılımsal, donanıma dayalı ve hem yazılıma hem de donanıma dayalı çözümler geliştirilmiştir.

2.3.1. Yazılıma Dayalı Çözümler

1. Ortak Değişken Kullanımı: Bu mekanizmada global bir kilit değişkeni (“lock” isminde) kullanılır. “Lock” ismindeki değişken 1/0 değerlerini alır. Değerin 0 olması kritik bölgede herhangi bir prosesin bulunmadığını 1 değerinin olması kritik bölgede bir prosesin çalışır durumda olduğunu gösterir. Diğer proseslerin bu değişkenin değerine bakılarak kritik bölgeye girmesi engellenir.

 

Kod 3. Lock Değişkeni Kullanımı

“lock” değişkeninin değeri 1 olduğunda kritik bölgede bir prosesin bulunduğu anlamına geldiğinden while döngüsü içerisinde bu prosesin kritik bölgeden çıkması beklenir. “lock” değişkeninin değerinin 0 olması ile artık kritik bölge serbesttir ve diğer kuyrukta bekleyen proseslerden biri kritik bölgeye girebilirler.

Bu çözüm başlangıçta kritik bölge problemini çözdüğü düşünülebilir. Fakat bazı durumlarda kritik bölge probleminin çözümü için gerekli olan karşılıklı dışlama özelliğini sağlayamamaktadır. Senaryoyu inceleyelim ve 2 farklı prosesin aynı anda kritik bölgeye nasıl girdiğini görelim.

P1 ve P2 isminde 2 prosesimiz mevcut olsun. P1 prosesi kritik bölgeye girmek istiyor ve “lock” değişkeninin değeri 0. P1 prosesi Kod 3’ de bulunan kod parçasının 1. Satırı CPU tarafından işlenir. CPU tam bu esnada P2 prosesine anahtarlanabilir. (P1’e ayrılan zaman diliminin süresinin dolması veya öncelik değerinin daha yüksek olması gibi sebeplerden) P1 prosesi, “lock” değişkeninin değerini daha değiştiremeden P2 prosesi Kod 3’te bulunan kod parçasının 1. Satırına gelir ve “lock” değişkeninin değerinin 0 olduğunu görür ve kritik bölgeye girer. Bu durumda hem P1 hem de P2 prosesi kritik bölgededir. Bu çözüm yeterli değildir.

2. Global Paylaşılan “turn” Değişkeni:

Bu yaklaşım yalnızca 2 proses arasındaki senkronizasyonu sağlamak için kullanılabilir. “turn” isminde bir kilitleme değişkeni vardır. Bu değişken 2 proses arasında paylaştırılır. Yaklaşımın sözde kodu Kod 4 ve Kod 5 verilmektedir.

 

Kod 4. Proses_i İçin Kritik Bölgenin Sözde Kodu

 

Kod 5. Proses_j İçin Kritik Bölgenin Sözde Kodu

Bu yaklaşımda, “lock” değişkeni yaklaşımında karşılıklı dışlamanın garanti edilememesi problemi çözümlenmiştir. “lock” değişkeni yaklaşımı 2’den fazla proses için uygulanabiliyordu. “turn” değişkeninde ise sadece 2 proses kullanılır. “turn” değişkeni i veya j değerlerinden birine sahip olabilir. Sözde kodları inceleyecek olursak eğer, “turn” değişkeninin değeri i olduğunda kritik bölgeye girme hakkının proses_i’ye aittir. “turn” değişkeninin değeri j olduğunda kritik bölgeye girme hakkı proses_j’ye aittir. Kod 5’te proses_i, “turn” değişkeni j değerine sahip olduğu sürece proses_j’yi bekler. Proses_j’nin kritik bölgede olduğunu anlar. Ne zaman ki proses_j kritik bölgede çalışmasını tamamlar ve “turn” değişkenini i değeri yapar; o zaman proses_i, while döngüsünden çıkar ve kritik bölgeye girer. Aynı durum proses_j için de geçerlidir. Böylece 2 proses arasındaki karşılıklı dışlama sağlanmış olur.

Bu yaklaşımda, ilerleme (progress) koşulu garanti edilemez. Kritik bölgeye girmeye hak kazanan prosesin (örneğin proses_1) kritik bölgede sonsuz döngüye girmesi sonsuz süre için kilitlenmeye neden olacaktır. Bu durumlarla karşılaşılması diğer prosesin (örneğin proses_2) çok uzun süre beklemesine hatta hiç sıra gelmemesine neden olur. Aynı zamanda bu yaklaşımda proseslerin sıra ile çalışma zorunluluğu vardır.

3. İlgili Değişken Mekanizması (Interested Variable Mechanism):

Senkronizasyon mekanizmasında ilerleme koşulunun sağlandığından emin olunmalıdır. “turn” değişkeni yaklaşımında bu koşul garanti edilmemektedir. Aynı zamanda sıra ile çalışma zorunluluğu ortadan kaldırılmalıdır. Ekstra değişken tanımlamasıyla bu durumlar aşılabilir. Yaklaşımın sözde kodu Kod 6 ve Kod 7’de verilmiştir.

 

Kod 7. Proses_i için kritik bölgenin sözde kodu.

Bu yaklaşımda ilgilenilen ekstra değişken mantıksal bir değer “true, false” alır. Kod 6 ve Kod 7 verilen sözde kod parçasının 1 ve 5 numaralı satırlar proseslerin kritik bölgeye girmek isteyip istemedikleri belirtir. Proses_j kritik bölgeye girmek isterse eğer flag değişkeninin i. indisinin değerini true yapar. Prosesler kritik bölgeye girmeden önce diğer prosesin kritik bölgeye girmek isteyip istemediğini 2 ve 6. satırlarda kontrol eder ve diğer prosesin kritik bölgeye girme isteği varsa proses onu bekler. Kritik bölgede çalışmasını tamamlayan proses flag değişkeninin değerini false yaparak diğer prosese kritik bölgeye girmek istemediğini beyan eder.

 

Kod 6. Proses_j için kritik bölgenin sözde kodu.

Sözde kodu daha derinden inceleyelim. CPU, proses_i’nin 1. satırı işlendikten sonra proses_j’ye anahtarlandığını düşünelim. Proses_j’nin de 1. satırı çalıştırılır. Bu durumda her iki prosesin flag[i] ve flag[j] değerleri “true” değerine sahip olur. Bu durumda kilitlenme meydana gelir. Her iki proseste birbirlerinin “flag” değişkenlerinin değerini “false” yapmasını bekler.

 

Kod 8. Proses_i için kritik bölgenin sözde kodu.

 

Kod 9. Proses_j için kritik bölgenin sözde kodu.

Kod 8 ve Kod 9’da verilen sözde kodlar incelendiğinde bir proses while döngüsü içerisindeyken diğer prosesin kritik kesime girmesine izin verilmektedir. Karşılıklı dışlama koşulu sağlanmaktadır. Bu sözde kod parçası livelock durumuna neden olabilir.

Livelock (Canlı kilitlenme): İki veya daha fazla proses yararlı bir iş yapmadan diğer proseslerin değişikliklerine karşılık durumlarını sürekli olarak değiştirdikleri bir durumdur. Bu durumu Kod 8 ve Kod 9 ‘da verilen sözde kod üzerinde inceleyelim.

∙ Pi, [i] işaretini true olarak ayarlar.

∙ Pj, [j] işaretini true olarak ayarlar.

∙ Pi bayrağı [j] kontrol eder.

∙ Pj [i] bayrağını kontrol eder.

∙ Pi, [i] işaretini false olarak ayarlar.

∙ Pj, [j] işaretini false olarak ayarlar.

∙ Pi, [i] işaretini true olarak ayarlar.

∙ Pj [j] işaretini true olarak ayarlar.

Bu akış süresiz bir şekilde uzatılabilir.

4. Dekker Algoritması Çözümü

Dekker algoritması senkronizasyon için gerekli olan tüm koşulları sağlar. Dekker algoritması Kod 10 ve Kod 11’de verilmektedir.

 

Kod 10. Proses_i için dekker algoritması.

 

Kod 11. Proses_j için dekker algoritması.

5. Peterson Algoritması Çözümü

Peterson çözümü senkronizasyon için gerekli olan tüm koşulları sağlamaktadır. Peterson algoritması ikiden fazla proses için genelleştirilebilir (Gülbağ, 2017).

 

Kod 12. Proses_i İçin Peterson Algoritması

 

Kod 13. Proses_j İçin Peterson Algoritması

2.3.2. Donanıma Dayalı Çözümler

Yazılıma dayalı çözümlerde proseslerin sürekli kaynağın serbest olup olmadığını kontrol etmesi CPU’yu gereksiz yere yorar. Dekker ve Peterson algoritmaları karmaşıktır ve karşılıklı dışlama mekanizmalarında kullanımı donanıma dayalı çözümlere göre daha zordur.

1. Kesmeleri aktif / pasif yapmak: Proses kritik bölgeye girmeden önce kesmeler pasif yapılarak başka bir prosesin CPU’ya anahtarlanması engellenir. Bu çözüm yolu çok işlemcili sistemlerde zaman paylaşımlı olarak CPU’dan yararlanma yaklaşımına aykırıdır.

2. Özel ayrıcalıklı makine komutlarını kullanmak: Proses kritik bölgeye girmeden önce özel atomik donanım komutları ile başka bir prosesin kritik bölgeye girmesi engellenir. Bu komutlar tek bir komut çevriminde gerçekleşen ve kesintiye uğramayan komutlardır. Bu komutlara örnek olarak testandset komutları, compare, swap, sleep-wake komutları verilebilir.

Donanıma dayalı çözümler karşılıklı dışlama ve ilerleme koşullarını sağlamaktadırlar fakat sınırlı bekleme koşulunu sağlayabilmesi için ek mekanizmalarla birlikte kullanılmaları gerekir.

2.3.3. Donanım Ve Yazılıma Dayalı Çözümler

1. Semaforlar:

1965 yılında Edsger Dijkstra’nın prosesler arasındaki senkronizasyonu sağlamak için semafor yapısını geliştirmiştir. Semafor yapısında P() ve V() işlemleri tanımlanır. V() işleminde s değişkeni arttırılır ve P() işleminde ise test edilir ve s değişkeni azaltılır. Proses senkronizasyonuda P() ve V() işlemleri kullanılır (Gülbağ, 2017).

 

 

Kod 14 ve Kod 15’te verilen kodlarda ikili semaphore yapısından faydalanılmıştır. Semaphore yapısı kullanılarak üretici-tüketici problemi gibi problemlerin çözümünde sayan semaforlardan faydalanılır.

2. Monitörler:

Prosesler arasındaki senkronizasyonu sağlamak için geliştirilen programlama dili desteği gerektiren üst seviyeli bir yapıdır. Monitörler içerisinde proseslerin kritik bölgeleri tutulur. Senkronizasyonu sağlamak adına monitörlerin sunduğu en önemli özellik, bir anda sadece bir işlemin monitörlerde aktif olmasıdır (Gülbağ, 2017).

2.4. Prosesler Arası İletişim

Prosesler arasındaki senkronizasyonu sağlamak için prosesler arasında bilgi akışının sağlanması gerekir. Aynı adres uzayında paylaşım yapan prosesler arasındaki iletişim için paylaşılabilen bellek veya paylaşılan adres yöntemleri kullanılmaktadır. Farklı adres uzaylarında paylaşım yapan prosesler arasındaki iletişim için özel çekirdek seviyesinde veri yapıları, mesaj geçişleri gibi yöntemler kullanılmaktadır. Prosesler arasındaki iletişim için kullanılan mekanizmalardan bazıları;

 

Şekil 4. İletişim İçin Kullanılan Mekanizmalar

Prosesler arasındaki iletişimin neden olabileceği bazı problemler vardır:

 

Şekil 5. İletişimin Neden Olabileceği Bazı Problemler

2.4.1. Boru Hattı (Pipe) Modeli

Boru hattı modeli ilk gelen ilk çıkar çalışma mantığını temel alan bir veri yapısıdır. Pipe yapısı farklı adres uzayına sahip iki prosesin birbirleriyle iletişim kurmasını sağlar. Prosesler “write” ve “read” komutlarını kullanarak aralarında bulunan boru hattı veri yapısına bilgiyi yazar ve boru hattı veri yapısından bilgiyi okur. Boru hattı veri yapısının kapasitesi sınırlıdır. Bir proses boş bir boru hattından veri okumaya çalışırsa proses bloke olur. Eğer kapasitesi tamamen dolmuş olan boru hattına bir proses veri yazmaya çalışırsa proses bloke olur.

Boru hattı modeli 2 farklı yapıya sahiptir: Sıradan boru hatları ve isimlendirilmiş boru hatları.

1. Sıradan boru hatları (Ordinary pipe model): Bu veri modelinde üretici-tüketici tipi bir veri iletişimi mevcuttur. Veri iletişimi tek yönlüdür ve üretici borunun yazma ucundan bilgiyi yazar. Tüketici, borunun okuma ucundan yazılan bilgiyi ilk gelen ilk çıkar çalışma mantığını temel alarak okur (Çizim 11). Sıradan boru hatları ile iletişim kuran prosesler ebeveyn-çocuk ilişkisi içerisindedir. Windows işletim sistemlerinde sıradan boru hatları anonymous pipe olarak anılır.

 

Çizim 11. Sıradan Boru Hattı

2. İsimlendirilmiş boru hatları (Named pipes): İsimlendirilmiş boru hatları, çift yönlü ve yarı çift yönlü olarak kullanılabilmektedir. İsimlendirilmiş boru hatlarında, sıradan boru hatlarında olduğu gibi “ilk giren ilk çıkar” çalışma prensibi temel alınır. Bu boru hattı veri yapısını kullanan proseslerin ebeveyn-çocuk ilişkisi içerisinde olmasına ihtiyaç yoktur. Birden fazla proses boru hattına bilgi yazabilir, tek bir proses bu bilgileri okur. Okuma ve yazma işlemleri mesaj geçiş yoluyla gerçekleştirilir. Unix, Windows işletim sistemlerinde kullanılır.

2.4.2. Mesaj Geçişi Yöntemi

Mesaj geçişi yöntemi, farklı adres uzayına sahip proseslerin haberleşmelerini ve bilgi paylaşmalarını sağlar. Dağıtık bir mimariye sahip bilgisayar sistemlerinde farklı bilgisayarlardaki proseslerin birbirleriyle haberleşmesini sağlar. Mesaj geçişi yönteminde mesajın gönderimi ve alımı için atomik yapıda komutlar kullanılır. Bilgi alışverişi, bilginin doğrudan bilgisayara gönderilerek yapılabileceği gibi port veya posta kutularına gönderilerek de yapılabilir. Komutlarla bilgisayarlar arasında bilginin doğrudan alışverişinin yapılmasına doğrudan haberleşme denir. Port veya posta kutuları kullanılarak bilgi alışverişinin yapılmasına dolaylı haberleşme denir. Doğrudan ve dolaylı haberleşmenin her ikisinde de komutlar kullanılır.

Doğrudan haberleşmede mesajlar göndericinin ve alıcının adresini içermek zorundadır. Send (A, mesaj) fonksiyonuyla A prosesinin adres uzayına mesaj gönderilir. Receive (B, mesaj) fonksiyonu ise B prosesinin adres uzayından mesajı alır. Bu haberleşme türünde 2 proses arasında doğrudan bir bağlantı kurulur.

 

Çizim 12. Prosesler Arasındaki Doğrudan İletişim

Dolaylı haberleşmede mesajlar port veya posta kutularına bırakılır ve tekrar port veya posta kutularından okunur. Posta kutusu paylaşılabilirdir. Posta kutusu proseslerin adres uzayında oluşturulabilir veya kullanıcı adres uzayında oluşturulabilir. Haberleşme için yeni bir posta kutusu oluşturulur ve prosesler posta kutusu aracılığı ile haberleşir. Haberleşme işlemi bittikten sonra posta kutusu kaldırılır. Haberleşme send() ve receive() komutları ile gerçekleştirilir.

Gönderici göndereceği bilgiye karar verir ve özel bir hedef belirler. Hedef proses bilgiyi almaya karar verdiğinde prosesler arasındaki iletişim ağı kurulur. İletişim ağı, ikiden fazla proses arasında oluşturulabilir. Birbirlerine bağlı birden fazla proses tarafından mesaj gönderim işlemi gerçekleştirilebilir fakat mesaj alma işlemi için tek bir prosese izin verilir.

Send() komutu asenkron ve senkron yapıda olabilirler. Asenkron send() komutu bilgiyi alıcının posta kutusuna gönderir ve alıcının bilgiyi almasını beklemez. Senkron send() komutu ise alıcı ile göndericinin uyum içerisinde bilgi alışverişini gerçekleştirmesini sağlar. Gönderici bilgiyi alıcının posta kutusuna gönderir ve alıcının bu bilgiyi posta kutusundan alıncaya kadar alıcıyı bekler.

Receive() komutu bloklanan ve bloklanmayan yapıda olabilirler. Bloklanan receive() komutunda alıcı mesajı alana kadar bekler. Bloklanmayan receive() komutunda alıcı posta kutusunda mesaj bulamasa da, mesajı alamasa da işlemine devam eder.

Farklı yapılara sahip Send() ve receive() komutları bir arada kullanıldığında yapılarına özgü davranışlar da bir araya gelir ve yapıların birlikteliklerinden doğan davranışı sergilerler. Örneğin; Asenkron send()-bloklanmayan receive() bir arada kullanıldığında gönderici mesajı alıcıya gönderir ve alıcının mesajı alıp almadığıyla ilgilenmez ve işine devam eder. Bloklanan receive() ise posta kutusundan mesajı alana kadar bloklanır.

2.5. Kilitlenme (Deadlock)

Prosesler, çalışabilmeleri için kaynaklara ihtiyaç duyarlar. Prosesler kaynakları sıra ile alırlar. İşletim sistemi prosesin istediği kaynak boşta ise kaynağı prosese verir. Başka bir proses tarafından kullanımda ise proses, kaynak alımı için bekletilir. Proses ihtiyaç duyduğu kaynağı kullandıktan sonra kaynağı serbest bırakır.

Birbirleriyle kaynak paylaşımı olan proseslerin her biri bazı durumlarda döngüsel olarak bir başka prosesin elinde olan bir kaynağı talep edebilir. Bu durumda, proseslerin hiçbiri çalışamayacaktır. Prosesin ihtiyaç duyduğu kaynak ne zaman ki serbest bırakılır o zaman proses çalışmasına devam eder.

Çizim 13’te Proses_1, Kaynak_1’i elinde tutmaktadır ve Proses_2’nin elinde tuttuğu Kaynak_2’yi talep etmektedir. Proses_2, Kaynak_2’yi elinde tutmaktadır ve Proses_3’ün kullandığı Kaynak_3’ü talep etmektedir. Proses_3, Kaynak_3’ü tutmakta ve Proses_1’de bulunan Kaynak_1’i talep etmektedir. Proses_1, Proses_2, Proses_3 çalışamaz durumdadır. Çalışabilmeleri için gerekli olan kaynaklar bir başka prosesler tarafından tutulmaktadır. Proseslerin hiçbirinin çalışamaz olduğu bu duruma kilitlenme denir.

 

Çizim 13. Kilitlenme

Kilitlenme durumunda prosesler ihtiyaç duydukları kaynakları bir türlü alamazlar. Proseslerin kaynakları uzun bir süre alamaması açlık durumunun oluşmasına sebep olur. Her açlık durumu kilitlenme oluşumunun sebebi değildir fakat her kilitlenme olayında açlık durumu oluşur. Kilitlenme durumunda prosesler kaynakları sonsuza kadar beklerler. Açlık durumunda kaynaklar sonsuza kadar beklenmez, uzun süre beklenir. Açlık durumunun oluşması yüksek önceliğe sahip proseslerin düşük öncelikli prosesler üzerindeki etkilerinden biridir.

Kilitlenmenin oluşabilmesi için 4 adet gerekli koşul bulunmaktadır:

1. Karşılıklı dışlama (Mutual exclusion): Bir kaynak aynı anda birden fazla proses tarafından kullanılamaz. Bir kaynak bir proses tarafından kullanılıyorsa bu kaynağın diğer prosesler tarafından aynı anda kullanımı engellenir.

2. Tut ve bekle (Hold and wait): Bir proses bazı kaynakları tutuyorken aynı zamanda bazı kaynakları beklemesi durumudur.

3. Kesme durumu yok (No preemption): Bir proses tamamlanıncaya kadar yürütülmeye devam ettirilir. Kesme yoktur. Zamanlayıcı tarafından başka bir proses planlanamaz.

4. Döngüsel bekleme: Bütün prosesler döngüsel bir şekilde bir başka prosesin elinde tuttuğu kaynağı talep eder ve bekler.

Kilitlenmenin oluşabilmesi için 4 koşulun aynı anda gerçekleşmesi gerekir.

Kilitlenme durumunun engellenmesi ve kilitlenme durumunda kullanılan yaklaşımlar;

1. Kilitlenmeyi önlemek:

Kilitlenmeyi önlemek için 4 koşuldan biri kaldırılır veya döngüsel bekleme koşulu engellenir. Kilitlenmeyi önlemek için uygulanan örnek uygulamalar;

∙ Bir proses bir kaynak talep ediyorsa bu prosese bu kaynağı tahsis etmeden önce prosesin elinde tuttuğu tüm kaynakları bırakması istenir.

∙ Bir prosesin ihtiyaç duyduğu tüm kaynaklar proses çalıştırılmadan önce tahsis edilir (Pratikte uygulaması oldukça zordur. Çünkü bir prosesin başlangıçta ihtiyaç duyduğu tüm kaynakları tespit edemez).

∙ Kesme işlemi aktif edilir.

∙ Kilitlenmeye neden olan prosesin tuttuğu kaynağın elinden alınması (İyi bir yaklaşım değildir. Çünkü prosesin yaptığı tüm işler çöpe gider. Tutarsızlık meydana gelebilir).

∙ Kaynağı bırakma ve tahsis etme işlemleri uyumlu bir şekilde gerçekleştirilerek döngüsel beklemenin önlenmesi

2. Kilitlenmeden kaçınmak:

Kilitlenmeden kaçınmada her adımda sistemin güvenli durumda olup olmadığı kontrol edilir. İşletim sistemi kaynak atamalarının her birini gözden geçirir, güvensiz bir durumun oluşması engellenir. Güvensiz bir durum oluşturan prosesin çalışması durdurulur, kaynak ataması engellenir.

Banker algoritması Dijistra tarafından geliştirilmiştir. Kilitlenmeden kaçınmak için kullanılan bir algoritmadır. Her proses ne kadar kaynağa ihtiyaç duymaktadır? Proses şu anda ne kadar kaynağı elinde tutmaktadır? Ne kadar kaynak ulaşılabilir durumdadır? Bilgileri ile kaynak atama planlamasının gelecekte kilitlenmeye neden olup olmayacağı belirlenir. Kilitlenmeye neden olmayacak bir proses çalışma sırası keşfedilirse güvenli olarak kabul edilir ve proseslerin çalışmasına izin verilir. Eğer ki planlama bir kilitlenmeye neden olacaksa;

∙ Kilitlenmeye neden olacak proses başlatılmaz.

∙ Kaynak talebi kilitlenmeye neden olacaksa kaynak tahsisi yapılmaz.

3. Kilitlenme durumunu tespit etmek ve bu durumdan kurtulmak:

Kilitlenme durumu oluştuğunda kilitlenmenin meydana geldiğini bilmek ve bu durumdan kurtulmak için yapılan eylemlerdir. Kilitlenme durumunu tespit edebilmek için kaynak atama grafiğinden faydalanılır. Kaynak tahsis grafiğinde sistemin durumu görülür. Bu grafik kaynakları tutan ve kaynak talebinde bulunan tüm prosesler hakkındaki bilgileri barındırır. Kaynak tutma matrisi ve kaynak talep etme matrisleri de kilitlenme durumunun tespitinde yardımcıdır.

Kilitlenme meydana geldiğinde bu durumdan kurtulabilmek için;

∙ Kilitlenmeye neden olan prosesin çalışması yarıda kesilebilir. Bu prosese tahsis edilen kaynaklar elinden alınabilir.

∙ Kilitlenmenin yaşandığı tüm proseslerin çalışması durdurulabilir.

∙ Kilitlenmenin yaşandığı proseslerin çalışması birer birer durdurulabilir.

∙ Kilitlenmenin yaşandığı prosesler belirli bir noktaya kadar geri çekilip tekrardan proseslerin çalışması başlatılabilir (Doğu Akdeniz Üniversitesi B. V., 2021).

Bölüm Özeti

∙ Tüm hesaplamaların temelini oluşturan yürütülmekte olan program parçasına proses denmektedir. Program, çalıştırılmadığı sürece pasif bir varlık iken; proses programın tersine aktif bir varlıktır.

∙ İhtiyaç duyduğumuz tüm programlar, ana belleğin kısıtlı bir kapasiteye sahip olması nedeniyle diskten ana belleğe getirilememektedir. CPU’da çalıştırılacak olan program parçaları ana belleğe getirilmektedir. Ana bellekte yer alan farklı uygulamalara ait prosesler CPU planlama algoritmasına göre seçilmekte ve CPU tarafından işletilmektedir.

∙ CPU planlayıcısının amaçlarını yerine getirmek için yaygın olarak kullandığı algoritmalar; “ilk gelen ilk hizmeti alır (FCFS)”, “Round Robin”, “önce en kısa iş (Shortest Job First- SJF)” ve “öncelik temelli planlama (Priority based scheduling-PbS)” şeklinde sıralanabilir.

∙ Bazı prosesler birbirleriyle ilişki içerisindedir. Prosesler birbirlerinin çalışmasını engellemeyecek şekilde uygun bir sırada seçilmeli ve çalıştırılmalıdır. Prosesler arasındaki bu dengenin korunması ve prosesler arasındaki iletişimin sağlıklı bir şekilde devam edebilmesi için proses senkronizasyonunun sağlanması gerekmektedir. Tüm bu ihtiyaçlar için yazılımsal, donanımsal çözümler geliştirilmiştir. Geliştirilen çözümler; hatalı sonuçların oluşmamasını, kilitlenmeyi önlemeyi, proseslerin kilitlenmeden kaçınabilmesini, kilitlenme meydana geldiğinde kilitlenmeyi tespit edip kilitlenmeden kurtulabilmeyi, prosesler arasındaki iletişimin hatasız ve kesintisiz olabilmesini hedeflemektedir.

∙ Prosesler arasındaki iletişim için kullanılan mekanizmalardan bazıları; sinyaller, soketler, boru hatları (pipe yapısı), paylaşımlı bellek, paylaşımlı dosyalar, mesaj geçişleri, uzaktan yöntem çağırma (RPC) olarak sıralanabilir.

∙ Prosesler arasındaki iletişimin neden olabileceği bazı problemler vardır. Bu problemler; karmaşıklık, kilitlenme problemleri, veride meydana gelen uyuşmazlıklar, senkronizasyon problemlerinden oluşmaktadır.

∙ Prosesler, çalışabilmek için kaynaklara gereksinim duymaktadırlar. Proseslerin hiçbirinin çalışamaz duruma geldiğinde kilitlenme meydana gelmiş demektir. Kilitlenmenin oluşabilmesi için dört adet gerekli koşul bulunmakta ve bu koşulların aynı anda gerçekleşmesi gerekmektedir. Bu koşullar; “karşılıklı dışlama”, “tut ve bekle”, “kesme durumu yok” ve “döngüsel bekleme” şeklindedir.

∙ Kilitlenme durumunun engellenmesi ve kilitlenme durumunda kullanılan bazı yaklaşımlar mevcuttur. Kilitlenmeyi önlemek, kilitlenmeden kaçınmak, kilitlenme durumunu tespit etmek ve bu durumdan kurtulmak bu yaklaşımlardandır.

∙ Kilitlenme meydana geldiğinde bu durumdan kurtulabilmek için; kilitlenmeye neden olan prosesin çalışması yarıda kesilebilir ve bu prosese tahsis edilen kaynaklar elinden alınabilir; kilitlenmenin yaşandığı tüm proseslerin çalışması durdurulabilir, kilitlenmenin yaşandığı proseslerin çalışması teker teker durdurulabilir veya kilitlenmenin yaşandığı prosesler belirli bir noktaya kadar geri çekilip tekrardan proseslerin çalışması başlatılabilir.

Kaynakça

 (n.d.).

(2021). Retrieved from Debian Manpages: https://manpages.debian.org/

Aksan, C. (2021). Paket Yöneticisi Nedir? Neden İhtiyaç Duyulur? Retrieved from ceaksan.com: https://ceaksan.com/tr/paket-yoneticisi

Aladağ, M. (2015). Windows 10 Yenilikleri – PowerShell 5 ile Paket Yönetimi OneGet. Retrieved from cozumpark.com: https://www.cozumpark.com/windows-10-yenilikleri-powershell-5-ile-paket-yonetimi-oneget/

Alkar, A. (2015). Embedded system basics and application. Ankara.

Çobanoğlu, B. (2018). Herkes için Python. Pusula.

Doğu Akdeniz Üniversitesi, B. B. (2021). İşletim Sistemleri-Bellek Yönetimi.

Doğu Akdeniz Üniversitesi, B. V. (2021). İşletim sistemleri-Kilitlenmeler. Siirt.

Gülbağ, A. (2017). İşletim Sistemlerine Giriş.

javaTpoint. (2021). OS. Retrieved from javaTpoint: https://www.javatpoint.com/os-attributes-of-a-process

Kaya, A. (2009). Symbian İşletim Sistemi. Akademik Bilişim’09 – XI. Akademik Bilişim Konferansı Bildirileri. Şanlıurfa.

Özdemir, H. (2018). Linux Paket Yöneticileri. Retrieved from pythontr.com: https://www.pythontr.com/makale/linux-paket-yoneticileri-632

Saatçi, A. (2002). Bilgisayar işletim sistemleri. Ankara: Hacettepe Üniversitesi. Retrieved from http://hilmi.trakya.edu.tr/ders_notlari/os/isleti_sistemleri.pdf

Samet, R. (2018). Bilgisayar Sistemleri. (A. Ü. Enstitüsü, Ed.)

Shotts, W. (2013). The Linux Command Line- Second Internet Edition. No Starch Press.

Silberschatz, A., Gagne, G., & Galvin, P. (n.d.). In Operating System Concepts. John Wiley & Sons, Inc. Retrieved 2021

Taşcı, T. (2017). İşletim Sistemleri-Temel Bilgi Teknolojileri Kullanımı.

Taşçı, T. (2017). İşletim Sistemleri-Temel Bilgi Teknolojileri Kullanımı.

Türkoğlu, İ. (n.d.). İşletim Sistemleri (Ders Notları). Fırat Üniversitesi, Teknik Eğitim Fakültesi, Elektronik ve Bilgisayar Bölümü. Türkiye. Retrieved 2021

Wikipedia. (2021). Paket yönetim sistemi. Retrieved from Wikipedia.org: https://tr.wikipedia.org/wiki/Paket_y%C3%B6netim_sistemi

Yıldırım, S. (n.d.). Bilgi Teknolojilerine Giriş3. Atatürk Üniversitesi. Retrieved 2021

Comments