GÖREV YÖNETİMİ (PROCESS – TASK) (SERVER İŞLETİM SİSTEMİ TARAFLI) Öğr. Gör. Mevlüt ERSOY
Konular Görev kavramı Görevler ve görev kontrol blokları arasındaki ilişkiler Görev zamanlama Görevler arası iletişim Veri yapılarının amacı ve işletim sistemini yönetmek için kullanılan veri yapıları Threads (iş parçacıkları) Ölümcül Kilitlenme
Görevlerde Üç Temel Konu İşletim sisteminin karşılaması gereken gereksinimler; Çoklu işlemleri çalıştırmalı (senkronizasyon) Görevler için kaynak ataması yapmalı (kilitlenme) Görevler arası iletişim
Görev Nedir? Sıralı bir işlemci üzerindeki veri ile bir programın çalıştırılmasından sonuçlanan aktivitelerdir. Bir programın çalıştırılması sonucu oluşan şeye görev denir. Görev bir programın özet formudur. Diskte yerleşmiş programı, işletim sisteminin ilgili datalarını ekleyerek ve kaynakları belirleyerek programı belleğe yerleştirip koşabilir hale getirilmesine görev denir. Program pasif sabit diskte (çalıştırılabilir dosya), görev aktiftir.
Yürütülebilir Bir Program Kaynak Kod Nesne Dosyası .bin, … Çalıştırılabilir Programlar Kütüphane Dosyaları Ve diğer dosyalar Derleme Bağlantı Ve değişkenler
Görevi Oluşturan Bileşenler (Görev İskeleti)(PCB)(Basitleştirilmiş)
struct task_struct { volatile long state; struct thread_info struct task_struct { volatile long state; struct thread_info *thread_info; atomic_t usage; unsigned long flags; unsigned long ptrace; int lock_depth; int prio, static_prio; struct list_head run_list; prio_array_t *array; /* ... ... */ }; “include/linux/sched.h”
UNIX Türevi Sistemde Görevin Yapısı Görevin gerçek kullanıcı id'si ve etkin kullanıcı id'si. Görevin gerçek grup id'si ve etkin grup id'si. Görevin çalışma dizini. Görevin kullanmakta olduğu dosyalara ilişkin bilgiler. Görevin bellek alanına ilişkin bilgiler. Görevin thread’lerine ilişkin bilgiler. Görevlerarası geçiş için gereken bilgiler.
GÖREV YÖNETİMİNİN AMAÇLARI Makul cevaplama süresi içerisinde, birkaç görevi aynı anda yürüterek işlemciden maksimum faydalanmayı sağlamak. Görevleri kaynaklara dağıtmak. Görevler arası haberleşmeyi sağlamak. Kullanıcıların görev oluşturabilmesine ortam oluşturmak.
Sıralı Çalıştırılan Görevler Program 2 Program 1 Program 3 Start Terminate
Eşzamanlı Çalışan Görevler Program 2 Program 1 Program 3 Start Terminate
Eş Zamanlı Çalıştırma Nasıl Yapılır? Start Terminate Code 1 Data 1 PCB 1 Code 2 Data 2 PCB 2 Code 3 Data 3 PCB 3 Birden fazla işlemci ve her işlemcide birden fazla görev çalıştırılıyor.
Görevlerin Anahtarlaması Görev Anahtarlama Bağlam Anahtarlama
Görevlerin Durumları
Bellekteki Görevler
Bellekteki Görev
Görevin bellekteki hali
Görevlerin Bulunduğu Durumlar
Görevlerin Bulunduğu Durumlar Sunuş (New) Hazır Çalışıyor Void main(){ I/O bekliyor printf(‘Merhaba Dünya’); } Terminate(bitiş)
GÖREV KUYRUKLARI
Görevlerle İlgili Sistem Çağrıları Create Delete Suspend Resume Delay Change – priority Change - attributes
Görev Ne zaman Oluşur? Yeni Toplu İş Etkileşimli Oturum Açma(Kullanıcı Sisteme girmiş) İşletim Sistemi tarafından oluşturulan bir hizmet sunmak için Yazıcıdan çıktı almak için Varolan görev başka görevi oluşturduğunda (Process Spawning)
Görev Ne zaman Sonlanır? Normal Tamamlanma Geçersiz komut Zaman Sınırını Aşılması Ayrıcalıklı komut Hafıza uygun olmadığında Veri yanlışları İşletim Sistemine müdahale Sınır İhlali Hata koruması Ana programın sonlandırılması Aritmetik hatalar Ana görevin istekleri Zaman aşımları Giriş Çıkış hataları
Görevin Askıya Alınma Sebepleri Swap işlemi Hatalı durum oluşması Etkileşimli kullanıcı isteği Debug (hata ayıklama) Ayrılan sürenin dolması (quantum) Parent görev tarafından
İşletim Sistemi Kontrol Yapıları Kaynakları yönetmek ve görevleri kontrol etmek için neye ihtiyaç var?
Memory Tables Bellek Tablolarının içermesi gerekenler; Görevler için ana bellek tahsisi Görevler için ikincil bellek tahsisi Ana ve sanal bellek bloklarının koruma özellikleri (paylaşımlı bellek bölgesine hangi görev erişebilir.) Sanal Bellek yönetimi için gereken bilgiler
I/O Tables Sistemin kanallarını ve I/O aygıtlarını yönetmek için
File Tables Dosyalar hakkında bilgi sağlar. İkincil bellek alanında yer bilgilerini tutar. Anlık durumlarını tutar vb.
Process Tables (Görev Tabloları)
Görev Kontrol Yapıları Yönetilmesi için gerekli özellikleri – Kimlik numarası – Bellekteki yeri (Daha önemli olan nedir?) - Kullanıcı Verisi - Kullanıcı programı - Yığın - Görev Kontrol Bloğu – Durumu (Görev Kontrol Bloğu) bilinmesi gerekir.
Görev Kontrol Yapıları
Görev Kimliği Sayısal bir bilgidir Görev id Görevden oluşan görevlerin kimliği (parent process) Kullanıcı kimliği
İşlemci Durum Bilgisi Kullanıcı kayıtlıkları (User Mod) Kontrol ve durum kayıtlıkları Program Counter Bayraklar Durum Bilgisi Stack Pointer
Görev Kontrol Bilgisi Zamanlama ve Durum Bilgisi Veri yapısı Görev durumu Öncelik Zamanlamaya bağlı bilgiler (Algoritma bilgisi) Olay Veri yapısı Görevler arası iletişim Görev ayrıcalıkları Bellek Yönetimi Kaynak sahipliği ve kullanımı
Çalışma Modları Kullanıcı modu Sistem modu/Çekirdek Modu/Kontrol Modu Düşük haklar ve ayrıcalıklar Kullanıcı programları genel olarak bu modda çalışır Sistem modu/Çekirdek Modu/Kontrol Modu Yüksek haklar ve ayrıcalıklar İşletim Sistemi çekirdeği görevleri bu modda çalışır. Kernel Fonksiyonları Görev Yönetimi,Bellek Yönetimi, Giriş Çıkış yönetimi, Destek fonksiyonları (Kesmeler, Hesaplar ve Görüntüleme)
Bir Görevin oluşturulması Bir görev çalışmakta olan diğer görevlerden oluşturulubilir. Oluşturan göreve parent, yeni göreve child görev denir. Parent, child görevin kaynaklarını veya yetkilerini tanımlar (veya bağışlar) Bir parent görev çhild tamamlanana kadar bekler veya paralel olarak çalışabilir.
UNIX Görev Oluşturulması UNIX de child görev fork sistem çağrısı kullanılarak oluşturulur. Fork, child görev için parent görevden kayıtlık ve değişkenleri kopyalar Fork tarafından geri döndürülen değerlerde tek fark Parent görevde, fork child görevin görev id sini döndürür. Child görevde, 0 değerini döndürür. Child, yeni ve farklı bir programı exec sistem çağrısı ile kendi içinde başlatabilir.
UNIX Görev Oluşturulması POSIX sistemlerinde yeni bir görev fork fonksiyonu ile oluşturulur. Fonksiyonun prototipi şöyledir: #include <unistd.h> pid_t fork(void); Fonksiyon başarı durumunda yeni oluşturulan görevin id değerine, başarısızlık durumunda -1 değerine geri döner.
Örnek Unix Program: Fork #include <unistd.h> #include <sys/wait.h> #include <stdio.h> main() { int parentID = getpid(); /* Görevin id*/ char prgname[1024]; gets(prgname); /* istediğimiz bir programın adını okur*/ int cid = fork(); if(cid == 0) { /* child görev*/ execlp( prgname, prgname, 0); /* Programı yükle*/ printf("I didn't find program %s\n", prgname); } else { /* Parent görev*/ sleep (1); /* Başlamak için childa zaman ver. */ waitpid(cid, 0, 0); /* child görevin bitmesini bekle. */ printf("Program %s sonlandı\n", prgname); }
Görev oluşturma
UNIX’ de görevlerin durumları
UNIX’ de görevlerin durumları Kullanıcı modunda koşuyor Çekirdek modunda koşuyor Bellekte ve koşmaya hazır Bellekte uyuyor İkincil bellekte ve koşmaya hazır İkincil bellekte uyuyor
UNIX’ de görevlerin durumları Pre-empt olmuş (çekirdek modundan kullanıcı moduna dönerken iş sıralayıcı görevi kesip yerine bir başka görevi çalışcak şekilde belirlemiş) Oluşturulmuş ama koşmaya hazır değil Zombie (görev sonlanmış ancak parent görevin kullanılabilmesi için bazı kayıtları hala tutmakta, ilgili kaynakları henüz geri verilmemiş)
Görev Sonlandırma Görevin sonlanması, görevin sahip olduğu tüm kaynakları bırakmasıdır. UNIX de Bir görev exit sistem çağrısı kullanarak kendini sonlandırabilir. Bir görev kill sistem çağrısı kullanarak bir child görevi sonlandırabilir.
Örnek: Görev Sonlandırma #include <signal.h> #include <unistd.h> #include <stdio.h> main() { int parentID = getpid(); /* Görev id*/ int cid = fork(); if(cid == 0) { /* child görev*/ sleep (5); /* 5 saniye sonra kendini sonlandır. */ printf ( «child görevden çıkılıyor\n" ); exit (0); printf ( «Hata!exit çağrısı atlandı!"); /* çalışmaz */ } else { /* Parent görev*/ printf ( "Çocuğu öldürmek için bir karakteri yazınız.\n" ); char answer[10]; gets (answer); if ( !kill(cid, SIGKILL) ) { printf(«Çocuk öldü.\n"); }
Parent Child İlişkisi root p5 p3 p4 p2 p1
Linux Görev Ağacı
Windows Api
GÖREV ZAMANLAMA
Konular Tek işlemcili yapıları kapsıyor. Zamanlamanın Amaçları Algoritmalar FCFS & Round Rubin SJF Multilevel Feedback Queues Lottery Zamanlama
Zamanlama iki türlü yapılabilir; Programın bulunduğu duruma göre Görev; İşlemcide çalışabilir durumda olabilir. Parçaları veya tümü bellekte olabilir. Henüz başlatılmamış olabilir. Zamanlama dönemine göre Uzun vadeli zamanlama Orta Vadeli Zamanlama (Bellek Yönetimi ile ilgili konu) Kısa Vadeli Zamanlama Giriş Çıkış Zamanlama (ileri konularda anlatılacak.)
Zamanlama Dönemine Göre; Uzun Vadeli Zamanlama Görevlerin çalıştırılabilecek durumda olup olmamasına göre hazır görevler kuyruğuna atılıp atılmamasına karar verilir. Orta Vadeli Zamanlama Görevlerin ana belleğe alınıp alınmamasına göre karar verilir. Kısa Vadeli Zamanlama (Dispatcher – Seçici) Hangi görevin çalıştırılacağına karar verilir. (İşlemci zamanlama) Giriş Çıkış Zamanlama Birden fazla görev aynı I/O cihazına erişmek isteyebilir. Burada hangi görevin I/O cihazına erişilebilineceğine karar verilir.
Orta Vadeli Zamanlama
Kısa Vadeli Zamanlama (Dispatcher – Seçici) Kısa Vadeli Zamanlamayı etkileyen durumlar Saat Kesmeleri Giriş/Çıkış Kesmesi İşletim sistem çağrıları Sinyaller (Semafor vb.)
Zamanlama Kriterleri Tarafsızlık Etkinlik Tepki Süresi Geriye Döndürme Her göreve eşit davranma Etkinlik Görevlerin çalışmasını aksatmayacak Tepki Süresi Etkileşimli görevler için istek zamanı ile cevaplama zamanı düşük olacak Geriye Döndürme Görev bekleme konumunda kalmayacak. Çıktı Birim zamanda çalıştırılan görev sayısı maksimum olmalıdır. İşlemci Kullanımı (gerçek zamanlı sistemlerde çok önemli değildir.) Zaman Sınırı
Zamanlama(Scheduling) Ne Zaman Yapılmalıdır ? Zamanlamanın yapılmasına ihtiyaç duyulan zamanlar: 1. Yeni bir görev oluşturulduğunda, ana görevin ya da çocuk görevin çalıştırılmasının kararı verilmelidir. Bu iki görevde hazır durumuna gelir. 2.Bir görevin çalışması bittiğinde ve işlemciyi kullanmayı bıraktığında karar verilmelidir. 3.Bir görev I/O işlemi için bloklandığında başka bir görev seçilmelidir. 4.Bir I/O kesmesi geldiğinde bir zamanlama kararı yapılmalıdır. Eğer kesme bir I/O cihazından geliyorsa, bu I/O cihazından gelecek olan veriyi bekleyen görev çalıştırılmalıdır.
Bilgisayarlarda genelde bir donanım saati(clock) bulunur Bilgisayarlarda genelde bir donanım saati(clock) bulunur. Bu saat periyodik olarak işlemciye kesmeler gönderir. Bu kesmeler ile işlemci zamanlama işlemlerini gerçekleştirir. Zamanlama işlemi her saat kesmesinde ya da belirli sayıda olduğunda gerçekleştirilmelidir. Zamanlama algoritmaları, saat kesmelerini nasıl kullandıklarına göre ikiye ayrılır; a)Kesintisiz (non-preemptive) b)Kesintili (preemptive)
Zamanlama Algoritması Seçme Politikaları Neye göredir? Ortalama yanıt süresi en aza indirmek - kullanıcıya mümkün olduğunca çabuk çıkış sağlamak ve en kısa sürede alındığında olarak giriş işlemek. Tepki süresi değişikliğini en aza indirmek- Etkileşimli sistemlerde düşük ortalama tahmin edilebilir. Maksimum çıktı – Yükü en aza indirmek, sistem kaynaklarını en verimli kullanım için, Minimum bekleme süresi – Her bir işlem için işlemci üzerinde aynı miktarda süre vermek. Ortalama yanıt süresi hesaplanır.
Zamanlama Algoritmalarının Amaçları Tüm sistemlerde; Adil olma: Her süreç işlemciyi adil kullanmalıdır. Politika Zorlama: Belirtilen politika kullanılmalıdır. Denge: Sistemin tüm parçaları meşgul olmalıdır. Toplu İş Sistemlerinde; Üretilen İş: Saat başına üretilen iş maksimum olmalıdır. Dönüş Süresi: Sürecin sunumu ve sonlanması arasındaki sürenin minimum olmasıdır. İşlemci Kullanımı: İşlemci her zaman meşgul olmalıdır.
Zamanlama Algoritmalarının Amaçları Etkileşimli Sistemlerde; Cevap Süresi: İsteklere hızlı şekilde cevap verilmelidir. Orantılı Olma: Kullanıcının beklentilerini karşılamalıdır. Gerçek Zaman Sistemleri; Son teslim süresine riayet etme: Veri kaybından sakınmalıdır. Tahmin Edilebilirlik: Çoklu ortam sistemlerinde nitelik bozulmasından sakınmalıdır.
Zamanlama Algoritmaları FCFS : İlk gelen ilk çalışır Round Robin : Alternatif işler için zaman dilimi kullanılır. Priority : Öncelik Shortest Job First: En Kısa İş önce Shortest Remaining Time: En kısa kalan Önce Multilevel Queues: Her öncelik sırasında round rubin
FCFS : Avantaj ve Dezavantajlar Avantajlar: basittir Dezavantajlar Uzun işlerin arkasından gelen kısa işlerin ortalama bekleme süresi yüksektir.
Round Rubin Algoritması Çeşitleri genellikle zaman paylaşımlı sistemlerde kullanılır. Avantaj: Her iş CPU eşit sürlerde çalışır. Bu durum adil değildir, Dezavantaj: Ortalama bekleme süresi kötü olabilir.
SJF/SRTF Avantaj Dezavantaj Ortalama bekleme süresini en aza indirme olasılığı vardır. Dezavantaj Bir işin CPU’ yu bırakma zamanın tahmini imkansızdır. CPU bağımlı görevler uzun süre çalıştırıldığında açlık durumu artabilir.
Multilevel Feedback Queuens
Mobil Sistemlerde Çokgörevlilik Bazı mobil sistemlerde (örneğin, iOS erken versiyonu), sadece bir işlem çalışmasına izin verilirken diğerleri askıdadır Taşınmaz ekrandan dolayı, iOS kullanıcılara sınırlılıklar sağlamak için Kullanıcı sadece ön plandaki görevi kontrol edebilir. Çoklu Arka plan görevleri, bellekte çalışıyor fakat ekranda görüntülenmiyor ve sınırlı çalışıyor Sınırlılık, tek, kısa görev ve olayların bildirimlerini alan görevleri kapsar, ses çalma gibi uzun süreli çalışan görevleri özeldir. Android ön ve arka planda çalışan görevleri daha az sınırlandırır. Arka planda görevler, işlemleri yerine getirmek için servisleri kullanırlar. Servis arka plan işlemini askıya alsa bile çalışmaya devam edebilir. Servisin kullanıcı arayüzü yoktur ve çok küçük bir bellek kullanır.
ThREADS (İŞ PARÇACIKLARI)
Görevler & Threads Görevler ve threadler birbirleriyle ilgili kavramlardır. Bir görev; Adres alanı, kaynakları vb. tanımlar. çekirdek düzeyli bir varlıktır. (Kernel Level) Bir görevin yapısına sistem çağrıları ile erişilir. Bir thread; Bir görev içinde tek sıralı yürütme akışı tanımlar. Threadler, görevlerden kontrol bilgileri sayesinde ayrılır. Her görev kendi içinde çoklu threade ayrılabilir. Genellikle kullanıcı düzeyli bir varlıktır (User Level)(Çekirdek düzeylide olabilir, ancak sistemi yavaşlatır) Kullanıcı seviyesindeki kütüphanelerle ulaşılır. Threadler arasında işbirliğinde sistem çağrılarını kullanmazlar. Mesaj yollama ve paylaşılan bellek alanı kullanımı daha basittir.
Bir görev iki farklı bölümden oluşmaktadır. Kaynakları(açık dosyalar, çocuk görevler, program texti, program verileri, göreve özel olan diğer veriler...) Çalışan kod kısmı, yani şu anda çalışan kod ve bir sonraki çalışacak kod bölümü.(program sayacı, yazmaçlar, yığın(stack), çağrılmış fakat geri dönülmemiş prosedürler).
İş Parçacığı(thread) kavramının bize getirdiği, aynı görev ortamında çoklu çalıştırma (execution-yürütme) işleminin yerine getirilmesidir. Tek bir görev içerisinde çoklu iş parçacıklarının(multithread) çalışması, çoklu programlamada birden fazla görevin aynı anda (işlemcide sırayla) çalışmasına eşdeğerdir.
Threadlerin Kullanıcı Uzayında Gerçekleştirilmesi
Thread Karakteristiği Bir Thread Control Block içinde; Program Counter Register Set Yığın bulunur. Bu yüzden Görev Kontrol Bloğu Thread Kontrol Bloğuna indirgenmiştir. Geleneksel olarak bir görevi bir işi icra eden tek bir thread olarak görebiliriz. Görev içindeki threadler aynı bellek uzayında otururlar. Bu uzay kullanıcı düzeyli uzaydır.
Tek ve Çoklu Threadler
Threadin paylaştıkları Her threade özel Adres Uzayı Global değişkenler Açık dosyalar Çocuk görevler Bekleyen sinyaller Sinyal işleyiciler Kullanıcı bilgileri Program sayacı Saklayıcılar Yığın durum
her threadin kendi yığını var yığında çağrılmış ama dönülmemiş yordamlarla ilgili kayıtlar ve yerel değişkenler her thread farklı yordam çağrıları yapabilir geri dönecekleri yerler farklı ⇒ ayrı yığın gerekli
Performans açısından Threadler UNIX sistemlerde thread oluşturmak görev oluşturmaktan 10 kat daha hızlıdır.(Mac geliştiricileri) Bir threadin terminete olması görevden daha az zaman gerektirir. Görevler arasındaki anahtarlama için geçen süreden aynı göreve ait threadlerin anahtarlanması için geçen süre daha fazladır. Threadler arası iletişim daha etkindir.
Threadlerin Kullanımına Örnek 3 thread ile bir kelime işlemci programının kontrolü
Thread kullanımına örnek- Web Sitesi Sunucusu Web sunucusunda threadler kullanılmasaydı?
Thread Karakteristiği Eğer bir thread görev değişkenlerinden birini değiştirirse bütün threadler bu değişikliği görür. Eğer bir thread bir dosya açıp okursa diğer threadlerde bu dosyayı okuyabilir. Threadler görevlere göre daha hızlıdır. Neden?
Thread Karakteristiği Sisteme daha az yük getirir. Threadlerin oluşturulmasıyla çekirdeğin yapısı etkilenmez. Dolayısıyla çekirdek seviyeli kaynaklar tüketilmediği için thread oluşturmak daha ucuzdur.
Neden threadler? Bir proses içinde birden fazla işlem olabilir Bazı işlemler bazen bloke olabilir; threadlere bölmek performansı arttırır threadlerin kendi kaynakları yok Oluşturulmaları / yok edilmeleri proseslere göre kolay Threadlerin bazıları işlemciye yönelik bazıları giriş-çıkış işlemleri yapıyorsa performans artar çok işlemcili sistemlerde faydalı
Örnek Thread Programı
Threadlerin Türleri İki türlü – kullanıcı uzayında (User Level) – çekirdek uzayında (Kernel Level) (lightweight process) hibrid bir gerçekleme de olabilir
Threadlerin Kullanıcı uzayında gerçeklenmesi Çekirdeğin threadlerden haberi yoktur Çoklu thread yapısını desteklemeyen işletim sistemlerinde de gerçeklenebilir Threadlerin üzerinde çalıştığı sistem Thread yönetim fonksiyonları Örn: thread_create, thread_exit, thread_yield, thread_wait Thread tablosu Program sayacı, saklayıcılar, yığın işaretçisi, durumu…
Threadlerin Kullanıcı uzayında gerçeklenmesi Thread bloke olacak bir işlem yürüttüyse Örneğin bir başka threadin bir işi bitirmesini beklemek Bir rutin çağırır Rutin threadi bloke duruma sokar Threadin progream sayacı ve saklayıcı içeriklerini thread tablosunda saklar Sıradaki threadin bilgilerini tablodan alıp saklayıcılara yükler Sıradaki threadi çalıştırır. Hepsi yerel yordamlarSistem çağrısını yapmaktan daha hızlı
Threadlerin Avantajları Threadlerin ayrı bir zamanlama algoritmaları olabilir Thread yönetim veri yapısı kullanıcı adres uzayı içinde olduğu için Thread anahtarlamada kernel mod ayrıcalıkları verilmesine gerek yoktur. Tüm çağrılar yerel rutinler Çekirdeğe çağrı yapmaktan daha hızlı
Threadlerin Kullanıcı uzayında gerçeklenmesi Threadlerin Dezavantajları OS kullanıcı düzeyinde thread varlığını bilmediği için, gereksiz zamanlama kararları verilebilir.
Threadlerin Kullanıcı uzayında gerçeklenmesi Threadlerin Problemleri sistem çağrılarının gerçekleşmesi Kullanıcı taraflı thread bir sistem çağrısı çalıştırdığında görev bloke olur tüm threadler bloke olur Bazı sistemlerde yapılan çağrının bloke olup olmayacağını döndüren sistem çağrıları da var. Sistem çağrılarına arabirim yazılır. Önce kontrol edilir, bloke olunacaksa sistem çağrısı yapılmaz, thread bekletilir.
Threadlerin Kullanıcı uzayında gerçeklenmesi Threadlerin Problemleri Sayfa hataları Programın çalışması gereken kod parçasına ilişkin kısım ana bellekte değilse Sayfa hatası olur Görev bloke olur Gereken sayfa ana belleğe alınınr. Görev çalışabilir Sayfa hatasına thread sebep olduysa Çekirdek threadlerden habersiz Tüm görev bloke edilir.
Threadlerin Kullanıcı uzayında gerçeklenmesi Threadlerin Problemleri Zamanlama Thread kendisi çalışmayı bırakmazsa diğer threadler çalışamaz Altta çalışan sistem belirli sıklıkta saat kesmesi isteyebilir Threadlerin de saat kesmesi ile işi varsa karışır Çok threadli çalışma istendiği durumlarda sıkça bloke olan ve sistem çağrısı yapan threadler olur Çekirdek düzeyinde işlemek çekirdeğe çok yük getirmez.
Bir süreçte üç adet thread bulunsun Bir süreçte üç adet thread bulunsun. Eğer bilgisayarda tek işlemci var ise, bu threadlerin her biri CPU nun1/3 hızda çalışabilir. Eğer sistemde birden fazla işlemci var ise, her thread farklı işlemcide çalıştırılır, bu şekilde uygulama işlemci ve thread sayısına bağlı olarak hızlanır.
Thread kullanımının kötü yanları ise; threadleri kullanan uygulamanın yazımının özenli yapılması gereklidir. Her thread ortak veri kullandığı için birinin bir veri üzerindeki etkisi diğer threadleri etkiler. Örneğin, bir thread bir dosya ile işlemini bitirdiğinde dosyayı kapatsın. Eğer süreçteki başka thread bu dosyayı kullanıyorsa, uygulama çalışmaz ya da sonuçlar yanlış olabilir.
Thread Modelleri Many-to-one, one-to-one, many-to-many and two-level
Many-to-one Threading Bu multithread mekanizmasında işletim sisteminin çekirdeği(kernel) multithread mekanizmasından habersizdir. İşletim sistemi basit olarak bir process veya thread çalıştırdığını düşünmektedir. Ancak user alanında thread kütüphanesi sayesinde birden fazla thread oluşturulup kullanılabilmekte ve threadler arası geçiş yapılabilmektedir. Solaris Green Threadleri, GNU Portable Threadleri ve Linux üzerindeki Pthread kütüphanesi de bu mekanizmadadır. Bu mekanizmanın önemli bir dezavantajı vardır, eğer threadlerden biri bloke olur ise, kernel işlemin sadece bir thread taarafından yapıldığını düşündüğünden threadler arası geçiş yapamaz, böylece görev içerisindeki tüm threadler bloke olur.
One – To – One Threading Her bir user threadi için kernel tarafında bir threadin oluşturulduğu mekanizmadır. Bu mekanizmanın kullanılabilmesi için, işletim sisteminin kernel tarafında thread mekanizmasını desteklemesi gerekmektedir. Windows NT/XP/2000 threadleri, Linux threadleri ve Solaris 9 threadleri bu gruba girmektedir. Avantajları : Bir thread tarafından yapılan bir sistem çağrısı aynı görev içerisindeki diğer threadleri bloke etmez. Bir görev birden fazla işlemci kullanabilir. Threadlerin oluşturulması, yok edilişi ve birbirleri arasındaki geçişi görevlere göre daha ekonomiktir. Dezavantajları : Kernel threadlerinin oluşturulması, yok edilişi ve birbirleri arasındaki geçişi user threadlerine gore daha maliyetlidir. CPU zamanlama algoritmaları adil değildir : Her threade aynı zaman dilimi verilir. Bu sebeple çok sayıda threadi olan işlemler daha az sayıda threadleri olan işlemlere göre daha çok CPU zamanı kazanmış olurlar.
Many – To – Many Threading Bu mekanizmanın kullanılabilmesi için kernel multithreadingi desteklemek zorundadır. Fakat one-to-one model de olduğu gibi her bir user threadine karşılık bir tane kernel threadi olmak zorunda değildir. N tane user threadine karşılık M tane kernel threadi oluşturulmakta (M<=N) ve user threadi önce n. thread ile daha sonra n+1. thread ile ilgilenebilmektedir, user threadleri değiştirilebilir. İşletim sistemi gerekli sayıda kernel threadinin oluşmasına ve birçok kernel threadinin user threadine eşleşmesine izin verir. IRIX, HP-UX ve Tru64 UNIX threadleri bu gruba girmektedir.
Thread Programları Tasarımı (Paralel Programlama) Çok çekirdekli bilgisayarlarda, pthreadler paralel programlama yapıları için uygundur. Paralel Programlama unsurları, problem bölümleme yük dengeleme (Load Balancing) İletişim veri bağımlılıkları Senkronizasyon ve yarış koşulları bellek sorunları I / O sorunları Program karmaşıklığı Programcı çaba / maliyet / zaman
Bir iş parçacığı oluşturulduktan sonra, nasıl bilirsin a) işletim sistemi tarafından ne zaman çalıştırmak için planlanmış olabilir b) hangi işlemci / çekirdek üzerinde çalışacak?
Creating and Terminating Threads pthread_create (thread,attr,start_routine,arg) pthread_exit (status) pthread_cancel (thread) pthread_attr_init (attr) pthread_attr_destroy (attr)
Creating and Terminating Threads pthread_create arguments: thread: yeni iş parçacığı için benzersiz bir tanımlayıcı attr: Konu özelliklerini ayarlamak için kullanılabilir özellik nesnesi. Varsayılan değerler için bir thread özelliklerini nesne veya NULL belirtebilirsiniz. start_routine: C rutini oluşturulduktan sonra yürütülecek iş parçacığı. arg: start rutin için üretilen bir argüman. Void tipindeki bir işaretçi olarak referanstan geçmiş olması gerekir. Herhangi bir argüman geçirilecekse NULL kullanılabilir.
prosesin başta bir threadi var Thread kütüphane yordamları ile yeni thread yaratır – örn: thread_create parametresi: koşturacağı yordamın adı yaratılan thread aynı adres uzayında koşar bazı sistemlerde threadler arası anne – çocuk hiyerarşik yapısı var – çoğu sistemde tüm threadler eşit
işi biten thread kütüphane yordamı çağrısı ile sonlanır – örn: thread_exit zaman paylaşımı için zamanlayıcı yok – threadler işlemciyi kendileri bırakır örn: thread_exit Threadler arası senkronizasyon ve haberleşme olabilir
Görevler Arası İletişim(Eş Zamanlılık) IPC
Konular Eşzamanlılık Prensipler Karşılıklı Dışlama Semaforlar Monitörler Mesaj geçişi Üretici Tüketici Problemi
OS Tasarımları İşletim Sistemi tasarımının ana konusu threadler ve görevlerin yönetimi ile ilgilidir. Multiprogramming: Multiprocessing: Distributed Processing: Tasarımlarda eş zamanlılık esastır.
Eş zamanlı Görevler Eş zamanlı Görevler olması durumunda bazı tasarım konuları önem kazanır: Görevler arası haberleşme Kaynak paylaşımı Birden fazla Görevin senkronizasyonu İşlemci zamanı ataması
Eş zamanlılık 3 farklı konuda ortaya çıkar Çoklu uygulamalar Aktif uygulamalar arasında paylaşılacak işlem süresi için kullanılır Yapısal Uygulamalar Modüler tasarımı ve yapısal programlama uzantısı İşletim Sistemi yapıları İşletim Sisteminin kendisi görevleri ve threadin bir kümesi olarak uygular
Konu ile ilgili bazı terimler Atomik işlemler Bölünmez bir veya daha fazla komutlar dizisi olarak uygulanan bir işlev veya eylem Atomsallık eşzamanlı süreçler arasındaki izolasyonu garanti eder. Kritik bölge Paylaşılan kaynak için erişimi gerektiren bir görev içindeki kod bölümüdür. Bir görev bu kod bölümünde ise başka görevler bu kod bölümünü çalıştırmaması gerekir. Ölümcül kilitlenme İki veya daha fazla görevin biri diğerinden bir şeyler beklediğinden dolayı ilerleyemediği durumdur. Karşılıklı dışlama Bir görev paylaşılan kaynaklara erişen kritik bir bölümde olduğunda başka bir görev bu paylaşılan kaynakların kritik bölgesine girmek istediğinde kritik bölgede olan görevin engellemesi durumudur. Yarış durumları Çoklu görev veya thread bir paylaşılan veri alanına okuma yazma yaptığı ve sonuçta çalışan görevlerin çalışmasının bağıl zamanlamasına bağlı olmasıdır. Açlık Zamanlayıcının süresiz olarak çalışabilir bir görevi gözden kaçırmasıdır ve hiç seçmemesidir.
Görevler Arası İletişim Bir görev diğerine nasıl veri gönderir? Bir ya da daha fazla görevin birbirlerinin yollarını kullanırken dikkatli olmaları ve birbirlerinin iletişim yollarına girmemeleri. İletişimdeki uygun sıra nasıl olmalıdır? Bir görev veri gönderiyor diğeri bu veriyi yazdırıyorsa, ilk görev veri göndermediğinde ikincinin beklemesi ya da ikinci yazdırırken birincinin beklemesi gereklidir. İletişimde kullanılacak sıra önemlidir.
İletişim Ne için Yapılır? Kaynak paylaşımı (dosya, I/O aygıtı,...) Karşılıklı haberleşme (iki görev birbirine haber gönderir) Senkronizayon (Bir görevin çalışması başka bir görevin belirli işlemleri tamamlamış olmasına bağlı olabilir)
Görevlerin Etkileşimi Görevler birbirinden habersizdir. Rekabet Görevlerin dolaylı olarak birbirlerinden haberleri vardır. Paylaşma yoluyla işbirliği Görevlerin doğrudan birbirlerinden haberi vardır. Haberleşme yoluyla işbirliği
Görevler Arası Rekabet (Yarış Durumları) Birbirinden habersiz Görevlerin aynı kaynağı (örneğin bellek, işlemci zamanı) kullanma istekleri işletim sistemi kullanımı düzenlemeli Bir Görevin sonuçları diğerlerinden bağımsız olmalı Görevin çalışma süresi etkilenebilir.
Görevler Arasında Paylaşma Yoluyla İşbirliği Paylaşılan değişken /dosya/veritabanı Görevler birbirlerinin ürettiği verileri kullanabilir. Karşılıklı dışlama gerekir (mutual exclution) Senkronizasyon gerekebilir. Sorunlar Ölümcül kilitlenme Yarış açlık
Senkronizasyon Görevlerin yürütülme sıraları önceden kestirilmez Görevlerin ü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
Görevler Arasında Paylaşma Yoluyla İşbirliği Ö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=3X
Görevler Arasında Haberleşme Yoluyla İşbirliği Mesaj aktarımı yoluyla haberleşme – Karşılıklı dışlama gerekli değil Ölümcül kilitlenme olabilir – Birbirinden mesaj bekleyen Görevler Açlık olabilir – İki Görev arasında mesajlaşır, üçüncü bir Görev bu iki Görevden birinden mesaj bekler
Karşılıklı dışlama(Mutual Execution) Kritik bölge Program kodunun, paylaşılan kaynaklar üzerinde işlem yapılan kısmı. Bir program içerisinde ortak olarak paylaşılan alanlara erişim yapılan kod bölümlerine verilen isim. Belirli bir anda sadece tek bir Görev kritik bölgesindeki kodu yürütebilir.
Karşılıklı Dışlamada Dikkat Edilmesi Gerekenler İki görev aynı anda kritik bölge içerisine girmemelidir. Kritik bölüme girmek isteyen görevler eğer başka bir görev kritik bölgede değilse engellenmemelidir. Bir görev kritik bölge içinde sonsuza kadar beklememelidir. Kritik bölge dışında çalışan bir görev, başka görevleri 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 P1() begin <KB olmayan kod> gir_KB; <KB işlemleri> cik_KB; end P2() • KB: Kritik Bölge • İkiden fazla Görev de aynı kaynaklar üzerinde çalışıyor olabilir.
Senkronizasyon Yöntemleri Özel Donanım Desteği Gerektirmeyen Yöntemler Kesme Yapısının Kullanımı Değişkenleri Kilitleme(Lock Variables) Dikkatli Değiştirme(Strict Alternation) Dekker Algoritması Donanım Desteği Gerektiren Yöntemler Üst Düzey Zaman Uyumlama Araçları Semafor Monitör Mesaj Geçirme (Message Passing)
Özel Donanım Desteği Gerektirmeyen Karşılıklı Dışlama Kesmeleri Devre Dışı Bırakma (Dezavantajları) görevler kritik bölgeye girdiklerinde tüm kesmeleri devre dışı bırakabilirler. Kritik bölge dışına çıktıklarında eski durumuna getirebilirler. Bu durumda eğer bir görev bu işlemi uygulasa ve çıktığında eski durumuna getirmez ise sistem çalışmaz duruma gelir. Sistemde birden fazla işlemci varsa bu işlem sadece tek bir işlemciyi etkiler. Kullanıcı görevlerine bu hakkı vermek oldukça tehlikelidir. Çekirdek bazen bu yöntemi kullanır.
Kesmenin Kontrolü
Değişkenleri Kilitleme (Locking Variables) Süreçler arasında paylaşılan bir değişkeniniz olsun. Bu değişkenin ilk değeri 0 olsun. Bir süreç kritik bölgeye girdiğinde ilk önce bu değişkeni kontrol etsin. Eğer kilit değişkenimizin değeri 0 ise süreç bunu 1 yapsın ve kritik bölgede yapmak istediklerini yapsın. Eğer 1 ise, 0 oluncaya kadar beklesin. Bu yöntemde de bahsedilen problem vardır. Bir süreç kilit değerini 0 olarak okusun, 1 yapamadan işlemci başka bir sürece geçerse, her iki süreçte kritik bölgeye girmiş olur.
Özel Donanım Desteği Gerektirmeyen Karşılıklı Dışlama Dikkatli Değiştirme (Strict Alternation)
Dikkatli Değiştirme (Strict Alternation) Çoklu Görev İçin –Çalışmayan Algoritma
Neden Çalışmaz
Özel Donanım Desteği Gerektirmeyen Karşılıklı Dışlama Dekker Algoritması
Özel Donanım Gerektiren Yöntemler Test and Set türü komutlar ts reg, durum Motorola tas Intel 80x86 xchg
xchg komutunun kullanımı
Semaforlar 1965 Dijkstra Etkili bir işbirliği sağlamak amacıyla geliştirdi. İki veya daha fazla görev özel bir sinyal alana kadar özel bir yerde bekletilmeye zorlayan basit bir sinyal aracığıyla işbirliği yapabilir. Bu sinyal için, semafor olarak adlandırılan özel değişkenler kullanılır. Semafor, görevler arası sinyalleme için integer bir değer kullanır. Atomik bir işlemdir. Semafor s ise; Sinyali İletmek için, semSignal(s) Sinyali almak için semWait(s) çalıştırılır.
İkili Semafor struct binary_semaphore { enum {zero, one} value; queueType queue; }; void semWaitB(binary_semaphore s) { if (s.value == one) s.value = zero; else { /* ilgili görev s.queue içine yerleşir */; /* görev bloke edilir*/; } void semSignalB(semaphore s) if (s.queue is empty()) s.value = one; /* s.queue dan bir P görevi silinir*/; /* hazır görevler kuyruğuna yerleştirilir*/;
/* program mutualexclusion */ const int n = /* görev sayısı*/; semaphore s = 1; void P( int i) { while (true) { semWait(s); /* kritik bölge*/; semSignal(s); /* diğer komutlar */; } void main() parbegin (P(1), P(2),…, P(n));
SEMAFORLAR
Üretici Tüketici Problemi Üretici Görev Tüketici Görev Üretim Buffera koy Tüketim Bufferdan al BUFFER
Üretici Tüketici yapısı
İkili Semafor ile Üretici Tüketici Problemi Çözümü /* program producerconsumer */ int n; binary_semaphore s = 1, delay = 0; void producer() { while (true) { produce(); semWaitB(s); append(); n++; if (n==1) semSignalB(delay); semSignalB(s); } void consumer() int m; /* a local variable */ semWaitB(delay); take(); n--; m = n; consume(); if (m==0) semWaitB(delay); void main() n = 0; parbegin (producer, consumer);
MONITORLER Semaforlar karşılıklı dışlama uygulamak ve koordine işlemleri için ilkel ama güçlü ve esnek bir araç sağlar., Monitör, semafor ile eşdeğer işlevsellik sağlayan ve kontrolü daha kolay bir programlama dili yapısıdır.
Message Passing – Mesaj Gönderme Süreçler arasında mesaj gönderip, almak için send ve receive şeklinde iki sistem çağrısı bulunur. Bu çağrılar aşağıdaki gibi kütüphane fonksiyonu olarak tanımlansınlar. send (varış,&mesaj); //varış ile verilmiş olan sürece mesajı gönderir receive(kaynak,&mesaj);//kaynakdan gelen mesajı alır. Eğer mesaj yoksa gelene kadar bloklanır ya da bir hata kodu geriye çevirir.
Bu işlemlerde çeşitli problemler çıkabilir. Örneğin, mesaj gidecek olan bilgisayar ağ üzerinde başka bir bilgisayarda ise mesaj ağda kaybolabilir. Bu yüzden gönderici mesaj göndermeli, alıcı mesajı aldığını belirten kabul (ackowledge) mesajı geriye göndermelidir. Eğer gönderici kabul mesajını belirli bir süre alamazsa mesajı tekrar gönderir. Mesaj ulaşmış fakat kabul mesajı ağda kaybolmuş olabilir. Gönderici mesajı iki kez göndermiş, alıcıda mesajı iki kez almış olur. Bu problem mesaja sıra numarası verilerek çözülür, aynı numaralı iki mesaj gelirse sadece biri kabul edilir. Bu işlemler aynı makine üzerinde olsa dahi semaforlara göre oldukça yavaştırlar.
Mesajlar alıcı tarafından alınmadığında postakutusu (mailbox) adı verilen yapılarda depolanır. Depolanan mesajlar, alıcı tarafından alınır. Mesajlaşmada, ilk önce gönderici mesajı göndermek için send() metodunu çalıştırır ve süreç bloklanır. receive() metodu bir alıcı tarafından çalıştırıldığı anda, mesaj tamponlama yapılmadan alıcıya geçirilir. Aynı şekilde, receive() metoduda mesaj yoksa gelene kadar bloklanır. Bu yönteme randevu(rendezvous) denilir.
Linux Senkronizasyon Kernel ver. 2.6 öncesi kısa kritik bölge uygulamalarında kesme engelleme Ver. 2.6 ve Sonra, başkasına engel olma Linux sağlar Semafor Atomik sayısal değer Okuyucu ve yazıcı versiyonları
Windows Senkronizasyon Tek işlemcili sistemlerde genel kaynaklara erişimi korumak için kesme maskeleme kullanır. Çok işlemcili sistemlerde döndürme kilidi kullanılır. Aynı zamanda dispatcher, semafor, timer, olaylar (değişken) ve mutex kullanır
Ölümcül Kilitlenme Aynı kaynakları kullanan Görevler Birinin istediği kaynağı bir diğeri tutuyor ve bırakmıyor Görevlerin hiç biri ilerleyemez ⇒ ölümcül kilitlenme
Ölümcül Kilitlenme Sistem kaynaklarını ortak olarak kullanan veya birbiri ile haberleşen bir grup görevin kalıcı olarak bloke olması durumuna ölümcül kilitlenme denir.
Ölümcül Kilitlenme Bilgisayar Kaynakları Ele Geçirilebilir (Pre-emptable) İşlemci I/O Kanalları Ana bellek İkincil bellek Aygıtlar Dosyalar Veritabanı Semaforlar Ele Geçirilemez (Non Pre-emptable) Kesmeler Sinyaller Mesajlar I/O tampondaki bilgiler CDROM Yazma Ele geçirilebilir kaynak, bir görev bu kaynağa sahip ise elinden alındığında problemler oluşturmayan kaynaktır. Ele geçirilemeyen kaynak, görev bu kaynağa sahiptir ve elinden alınamaz.
200 KB bir sistemde;
Aynı kaynakların farklı sıralarda istenilmesinde ölümcül kilitlenme olma olasılığı yüksektir.
Ölümcül Kilitlenmeye Neden Olan Durumlar Karşılıklı Dışlama(Mutual Exclusion) Her kaynağı aynı anda bir görev ya kullanıyordur ya da atanmıştır. Tut ve Bekleme Koşulu Elindeki kaynağı bırakmadan başka kaynak ister ve bu kaynağı elde edemediğinde beklemeye geçen görevler Geri Alınamaz Koşulu Bir göreve daha önceden verilen kaynaklar zorla elinden alınamaması durumu. Dairesel Bekleme Koşulu İki veya daha fazla görev zincir şeklinde kendinden önceki göreve ait olan kaynağı bekler.
Ölümcül Kilitlenmeyi Önleme Karşılıklı Dışlamayı önleme (dosya örneği) Okuma – Okuma Okuma – Yazma Yazma – Okuma Yazma – Yazma Okuma için birden fazla erişimi yazma için özel erişim Birden fazla görev yazma izni istiyorsa bu durmda bile kilitlenme oluşabilir.
Ölümcül Kilitlenme Tespiti (Deadlock Detection) 1. Her tip kaynaktan sistemde bir adet olduğu durumda ölümcül kilitlenme tespiti 2. Her tipten birden fazla kaynak için ölümcül kilitlenme tespiti
Kaynak Atama Grafikleri
1. A görevi R yi tutar ve S i ister. 2. B görevi T yi ister. Her tip kaynaktan sistemde bir adet olduğu durumda ölümcül kilitlenme tespiti Örneğin; 7 görev ve 6 adet kaynak olsun. A,B,C,D,E,F,G görevler; R,S,T,U,V,W kaynakları göstersin. Mevcut sistemdeki sahip olunan kaynak durumu ve istenilen kaynak durumu şu şekilde olsun: 1. A görevi R yi tutar ve S i ister. 2. B görevi T yi ister. 3. C görevi S i ister. 4. D görevi U yu tutar ve S ile T yi ister. 5. E görevi T yi tutar ve V yi ister. 6. F görevi W yi tutar ve S i ister. 7. G görevi V yi tutar ve U yu ister. SORU:Sistem ölümcül kilitli midir ? Öyleyse hangi süreçler ?
Her tipten birden fazla kaynak için ölümcül kilitlenme tespiti Matris temelli bir algoritma kullanılır. Elimizdeki kaynakların sınıflarını Ei (1<=i<=n) şeklinde isimlendirelim. E var olan kaynak vektörüdür. Her kaynaktan var olan örnek sayısını verir. Örneğin E1 disket sınıfı olsun. E1=2 elimizde 2 adet disket sürücüsü olduğunu göstersin. A vektörü kullanılabilir olan kaynakları göstersin. Ai i. Sınıf kaynaktan kullanılabilir kaç tane örnek olduğunu göstersin. Eğer A1=0 ise, disket sürücüsünden kullanılabilir yok demektir. Tüm disket sürücüleri şu anda kullanılıyordur.
Her tipten birden fazla kaynak için ölümcül kilitlenme tespiti Algoritmada iki adet matris kullanılır. C = mevcut anda görevlere tahsis edilmiş kaynaklar matrisidir. R = görevlerin istedikleri kaynakları ve sayılarını gösteren matristir. C nin her satırı bir göreve karşılık gelir. Bu satırın sütunları, görevin sahip olduğu kaynakları göstermektedir. Cij = j kaynağından i görevinde kaç adet var. Rij = i görevinin j kaynağından kaç adet istediğini gösterir.
Her tipten birden fazla kaynak için ölümcül kilitlenme tespiti
Ölümcül Kilitlenme olasılığı var mıdır?
Ölümcül kilitlenme tespiti Algoritma: 1-İşaretli olmayan görev ara. Bu görevin R matrisindeki tüm istekleri A dan küçük veya eşit olmalıdır. 2- Bu şekilde bir görev var ise C deki bu sürece karşılık gelen satırın değerlerini A ya ekle. Bu süreci işaretle ve 1. adıma git. 3-Böyle bir süreç yoksa algoritma sonlandırılır. Algoritma bittiğinde işaretli olmayan süreçler ölümcül kilitlidir.
Ölümcül Kilitlenme Onarımı 1. Keserek onarma (Recovery through preemption) 2. Geri alarak onarma (Recovery through rollback) 3. Öldürerek onarma (Recovery through killing process)
Ölümcül Kilitlenmeden Kaçınma Deadlock Avoidance Sistem istenilen kaynağın verilmesinin güvenli olup olmadığına karar vermelidir.
Güvenli ve Güvensiz Durum Herhangi bir zaman anında sistemin durumu E,A vektörleri ve C,R matrisleri ile gösterilir. Eğer A durumu ölümcül kilitli değilse sistem güvenlidir. Örneğin tek bir kaynak için durumu inceleyelim. Elimizde bu kaynaktan 10 adet olsun. Aşağıda A,B,C süreçlerinin durumları gösterilmektedir.
Güvenli ve Güvensiz Durum
Yemek yiyen filozoflar problemi