İŞLETİM SİSTEMLERİ · İşletim sistemi bütün çalışan prosesleri yönetmek için...

Preview:

Citation preview

İŞLETİM SİSTEMLERİPROSESLER

Dr. Mehmet SARIGÜL

Prosesler

● Günümüz bilgisayarları eş zamanlı olarak bir çok görevi yerine getirmektedir. Modern işletim sistemleri bilgisayar üzerinde çalışan her yazılımı birer proses olarak görür. Kullanıcı bilgisayarını başlattığında birçok proses arkaplanda halihazırda çalışmaya başlar.

● Bir proses arkada mail trafiğini izlerken başka bir proses bilgisayarı virüslerden korumak için sistem taraması yapıyor olabilir. Kullanıcı aynı zamanda tarayıcı programları ile o anda web üzerinde gezinmekte, yada bir CD/DVD yazdırıyor olabilmektedir.

● Bütün bu işlemlerin eş zamanlı başarılı bir biçimde çalışması işletim sisteminin prosesleri doğru bir biçimde yönetmesi ile mümkün olur.

Prosesler

● Birçok prosesin eş zamanlı çalışmasına gereksinim duyulması çok işlemcili sistemlerin ortaya çıkmasına sebep olmuştur.

● İşletim sistemi bir işlemci üzerinde çalışıran prosesi 1/100 sn ya da 1/1000 sn gibi zaman aralıkları ile değiştirir. Bu da kullanıcıya herşeyin aynı zamanda çalıştığı ilüzyonunu yaşatır.

● Çok işlemcili sistemlerde ise birden fazla işlem gerçek anlamda farklı işlemciler üzerinde eş zamanlı olarak çalışmaktadır.

Prosesler

● Proseslerin hangi işlemciyi ne kadar süre kullanacağına karar vermek kullanıcı için zor bir iştir. İşletim sistemi bazı konseptler ile bu konuda en etkili yönetimi sağlamaya çalışır.

Proses Modeli

● Bu modelde bir bilgisayar üzerinde çalışan tüm yazılımlar sıralı bir proses listesi halinde tutulur. Her bir proses için aşağıdaki veriler saklanır: – Program sayacı– Yazmaçlar (Registers)– Değişkenler

Proses Modlei

● Bu konsepte göre her bir proses kendi sanal işlemcisine sahiptir, oysa gerçek işlemci aslında bir çok prosesi hızlı geçişler yaparak ardışıl olarak çalıştırmaktadır.

● Bu hızlı anahtarlama işlemine çoklu programlama adı verilir.

Proses Modeli

● İlk figürde belleğe yüklü 4 farklı program olduğu görülmektedir. Her birinin kendine ait bir akışı vardır ve diğerlerinden bağımsız olarak çalışmaktadır. Her bir program çalışırken onun program sayacı gerçek(fiziksel) program sayacına yüklenerek o programın çalıştırılması sağlanır. Son figürde proseslerin işlemci üzerindeki çalışma durumu görülmektedir.

Proses Modeli

● İşlemci üzerinde prosesler arası geçiş yapılırken yarım kalan prosesin program sayacı belleğe yazılırken yeni prosesin program sayacı fiziksel olarak yüklenir. Her proses işlem yapacak zamana sahip olur ama tek bir zaman anında işlemci üzerinde tek bir proses çalışmaktadır.

Proses Modeli

● Burada fikir aslında şu şekildedir. Bir proses ne olduğundan bağımsız olarak çalıştırılacak kodu, girişi verisi, çıkış verisi ve durumu olan bir yapıdır.

● Bir işlemci birden çok proses arasında proseslerin hangi zamanda ve ne şekilde çalıştırılacağına karar veren bir anahtarlama algoritması kullanılarak paylaştırılabilir.

Proses Yaratma

● Bir proses aşağıdaki durumlarda yaratılır: – Sistem başlangıcı– Bir proses tarafından sistem çağrısı ile başka bir

proses oluşturulması– Kullanıcının talebi ile yeni bir proses oluşturulması– Toplu bir iş akışı başlatılması (batch job)

Proses Yaratma

● UNIX tabanlı işletim sistemlerinde yeni bir proses yaratmak için “fork” sistem çağrısı kullanılır. Bu çağrı çağıran prosesin birebir aynısı olan yeni bir proses oluşturur. Anne ve çocuk proses aynı hafıza imajına, aynı açık dosyalara, aynı çevresel katarlara(string) sahiptir.

● Genellikle çocuk proses “exec” sistem çağrısını çağırıp kendi hafıza imajını değiştirir ve yeni bir program çalıştırır.

Proses Yaratma

● Windows işletim sisteminde ise “CreateProcess” çağrısı ile yeni bir proses oluşturulur. Bu çağrı hem yeni prosesi yaratır hem de ilgili programı belleğe yükler. Bu çağrı çalıştıracağı programı, bazı parametreleri, güvenlik seçeneklerini, kontrol bitlerini, öncelik bilgilerini, pencere bilgilerini ve yeni prosesin işaretçisini içeren 10 tane parametre alır.

● Buna ek olarak Win32 api’si prosesler ve işleyişleri ile ilgili 100den fazla farklı fonksiyon barındırmaktadır.

Prosesin Sonlanması

● Prosesler aşağıdaki konullarda sonlanır:– Normal sonlanma (olağan)– Hatalı sonlanma (olağan)– Ölümcül Hata (olağan dışı)– Başka bir proses tarafından öldürülme (olağan dışı)

Proses Sonlanması

● Normal: Çoğu proses kendilerine atanmış işlemleri bitirdikten sonra sonlanırlar. Sonlanma işleminde işletim sistemine bunu bildirmek için sistem çağrısı yaparlar. Bu sistem çağrısı UNIX için exit(), Windows için exitprocess()’tir.

● Hata: Burada proses bir hata ile karşılaşır ve sonlanır. Program içerisindeki herhangi bir hatadan kaynaklı olabilir.

● Ölümcül hata: Proses ölümcül hata durumuna sebebiyet verdiği için zorunlu olarak sonlandırılır.

● Başka bir proses tarafından sonlandırılma: Bir proses işletim sistemi üzerinden sistem çağrısı kullanarak başka bir prosesi sonlandırabilir.

Proses Hiyerarşisi

● Bazı sistemlerde bir proses yaratıldığında anne proses ve çocuk proses ilişkili bir halde bulunurlar. Çocuk proses kendisi de yeni prosesler oluşturabilir.

● UNIX tabanlı sistemlerde bir proses ve ailesi bir grup oluşturur. Kullanıcı klavye üzerinden bir sinyal yolladığında bu sinyal proses grubunun tüm fertlerine iletilir. Her proses bu sinyali işlemek ya da görmezden gelmek konusunda kendi karar verir.

Proses Hiyerarşisi

● Windows OS’ta bunun aksine böyle bir hiyerarşi yoktur. Tüm prosesler eşittir.

● Yeni bir proses oluşturan anne proses bu prosesin id’sini alır, başka proseslere geçirebilir. Bu da üst alt ilişkisini bozar.

Proses Durumları

● Bir proses 3 farklı durumda bulunabilir: – Çalışıyor (Halihazırda CPU üzerinde çalışıyor)– Hazır (CPU üzerinde çalışmayı bekliyor)– Bloklanmış (Dışarıdan bir olayın gerçekleşmesini

bekliyor)

Çalışıyor

HazırBloklanmış

1 2

3

4

Proses Durumları

● 4 geçiş durumu mümkün olabilir. – 1. Proses giriş beklediği için blok duruma geçer– 2. Zamanlayıcı yeni bir prosesi seçer– 3. Zamanlayıcı bu prosesi seçer– 4. Beklenen giriş gelir.

Çalışıyor

HazırBloklanmış

1 2

3

4

Proses Durumları

● 1. Geçiş proses dışarıdan bir bilgi bekleme durumuna geçtiğinde ve işlemci üzerinde bir işi kalmadığında olur.

● 2. ve 3. geçişler zamanlayıcının anahtarlama durumlarında gerçekleşirler. Zamanlayıcı istediği işlemci üzerindeki prosesi belleğe yazıp hazır durumuna alırken(2) bir diğer prosesi işlemci üzerine alarak çalışıyor duruma geçirir(3). Bu zamanlama işlemlerinin nasıl yapılması gerektiği ile ilgili bir çok farklı zamanlayıcı algoritması bulunmaktadır.

Proses Durumları

● 4. geçiş ise ilgili prosesin beklediği giriş gerçekleştiğinde olur. Bu proses hazır duruma alınır ve zamanlayıcının kendisini işlemci üzerine almasını bekler.

Proses Yönetimi

● İşletim sistemi bütün çalışan prosesleri yönetmek için “Proses tablosu” adı verilen yapılardan oluşan bir dizi tutar. Burada her proses için bir kayıt tutulur.

● Bu kayıt üzerinde proses ile ilgili önemli bilgiler tutulur. Bunlar; prosesin durumu, program sayacı, hafıza kaplama durumu, açık dosyaları, işlemci zaman bilgileri ve prosesin işlemesi için gerekli tüm bilgilerdir.

Sistem Programlama

● Bazı konseptleri tam anlayabilmek için bazı kod örneklerine bakılabilir. – Hatalı paralellik– Standart paralellik– Seri paralellik– Katil proses– Zombi proses– Öksüz proses

Hatalı Paralellik

#include <stdio.h>

#include <unistd.h>

main()

{fork();

execl(“hello”, “hello”, NULL , NULL );

printf(“I am parent process.”);

}

Standart Paralellik

#include <stdio.h>

#include <unistd.h>

main()

{int pid = fork();

if (pid==0)execl(“hello”, “hello”, NULL , NULL );

elseprintf(“I am parent process.”);

}

Sıralı Paralellik

#include <stdio.h>

#include <sys/types.h>

#include <sys/wait.h>

#include <stdlib.h>

#include <unistd.h>

main(){pid_t pid;

int status;

pid = fork();

if (pid==0){execl(“hello”, “hello”, NULL , NULL );}

else{waitpid(pid, &status, 0);

printf(“I am parent process.”);}

}

Katil Proses

#include <stdio.h>

#include <sys/types.h>

#include <sys/wait.h>

#include <stdlib.h>

#include <unistd.h>

#include <signal.h>

main(){

pid_t pid;

int status;

pid = fork();

if (pid==0){printf(“I am child process”);

sleep(5);printf(“I woke up”);}

else{kill(pid, SIGKILL);

waitpid(pid, &status, 0);

printf(“I killed my child.”);}

}

Zombi Proses

#include <stdio.h>

#include <sys/types.h>

#include <stdlib.h>

#include <unistd.h>

main()

{pid_t pid;

pid = fork();

if (pid==0)exit(0);

elsesleep(30);

}

Öksüz Proses

#include <stdio.h>

#include <sys/types.h>

#include <stdlib.h>

#include <unistd.h>

main(){pid_t pid;

pid = fork();

if (pid==0){sleep(5);

printf(“where is my mom?”);}

elseprintf(“I am parent process.”);

}

Recommended