Üye Kayıt Üye Giriş

Alt Process'lerin Beklenmesi ve Zombie Process Kavramı


Alt Process'lerin Beklenmesi ve Zombie Process Kavramı

Bir process sonlandığında process'in sonlanma kodu (exit code) denilen bir sayı bir bilgi
olarak onu çağıran process'e iletilir. Process'in sonlanma kodu exit fonksiyonunun parametresi
ile ya da main fonksiyonunun geri dönüş değeri ile tespit edilir. Process'in sonlanma
kodlarının genellikle sistem için bir anlamı yoktur. Daha çok üst process ile alt process'in
anlaşması için bu kod kullanılır.


Process'in sonlanma kodu process bittiğinde nerede saklanır? Sistemlerin çoğu bu çıkış
kodunu process handle alanında saklarlar, üst process bu çıkış kodunu alana kadar process
handle alanını yok etmez. Örneğin, Win32 sistemlerinde CreateProcess ile yaratılan process
sonlandığında process'in bellek alanı boşaltılır, ama process handle alanı boşaltılmaz.
Programcı çıkış kodunu GetProcessExitCode fonksiyonu ile alır, daha sonra üst process
CloseHandle API fonksiyonu ile process handle alanını siler.


POSIX sistemlerinde çıkış kodunun alınması ve process handle alanının boşaltılması iki ayrı
fonksiyonla değil, tek fonksiyonla yapılmaktadır. Bu işi yapan fonksiyonlar wait ve
waitpid isimli fonksiyonlardır. UNIX/Linux sistemlerinde bir alt process sonlandığında
onu yaratan process wait ya da waitpid fonksiyonlarıyla çıkış kodunu almazsa process handle
alanı wait işlemi yapılana kadar bellekte kalır, bu tür process'lere zombie processler
denilmektedir. Zombie processler ps komutu ile process listesi alındığında 'z' harfi ile
gösterilir.


Process'lerin çıkış kodları ve genel çıkış bilgileri process handle alanında tutulmak zorunda
değildir. Örneğin bu bilgiler process sonlandıktan sonra daha küçük bir alana taşınabilir ve
process handle alanı serbest bırakılabilir. wait fonksiyonunun prototipi şöyledir:

pid_t wait(int *pStat);


Bu fonksiyon sırada bekleyen alt process’in çıkış kodunu alır ve bunu parametresiyle
belirtilen adrese yerleştirir. Geri dönüş değeri çıkış kodu alınan process’in handle değeridir.
Fonksiyon başarısızlık durumunda –1 değerine geri dönmektedir. Bu fonksiyon eğer alt
process henüz sonlanmamışsa alt process sonlanana kadar üst process’i bloke eder. Yani wait
fonksiyonu çağırıldığında alt process bitene kadar wait fonksiyonu geri dönmeyecektir. Üst
process birden fazla alt process yaratmış ise bu fonksiyon sıradaki ilk alt process’e ilişkin
çıkış bilgisini alır. Bu tür durumlarda wait fonksiyonu tarafından alınan çıkış kodunun hangi
alt process’e ilişkin olduğunun standart bir belirlemesi yoktur. Bu tür durumlarda fonksiyonun
geri dönüş değeri hangi alt process’în çıkış kodunu belirlemek için kullanılır? Programcı alt
process’i beklemek istediği halde çıkış kodu ile ilgilenmeyebilir. Bu durumda wait
fonksiyonuna NULL değeri parametre olarak geçilir. Fonksiyon çıkış kodunu bu durumda
yerleştirmez. Fonksiyonun prototipi sys/wait.h dosyası içerisindedir. Aşağıdaki programda bir
alt process yaratılmış ve üst process alt process’i wait fonksiyonu ile beklemiştir. Böylece
önce alt process’in sonlanacağı garanti altına alınmıştır. Ekrana sırasıyla


I am child..
end..
I am parent..
end..
yazıları çıkar.
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid;
if ((pid = fork()) == -1) {
perror("fork");
exit(1);
}
if (pid == 0) {
printf("I am child..\n");
}
else {
wait(NULL);
printf("I am parent..\n");
}
printf("end..\n");
return 0;
}


Şüphesiz wait fonksiyonu eğer beklenecek hiç bir alt process yoksa başarısız olur ve bloke
olmadan –1 ile geri döner. Başarısızlık nedeni için errno değişkenine bakılmalıdır.

Process fork ile yaratıldıktan sonra çizelgeleme işleminin üst processten mi yoksa alt
processten mi devam edeceği standart olarak belirlenmemiştir, kullanılan çizelgeleme
algoritmasına bağlıdır.


wait fonksiyonu ile elde edilen int değer programcıya iki bilgi verir.


1) Alt process’in çıkış kodu
2) Alt process’in sonlanma biçimi


Genellikle çıkış kodu düşük anlamlı byte değerindedir. Ancak bu durum POSIX
standartlarında garanti altına alınmadığı için bu değerler standart makrolar ile elde
edilmelidir. Örneğin WEXITSTATUS makrosu çıkış kodunu, WIFEXITED makrosu ise
normal sonlanmayı tespit eder.


Sınıf çalışması: fork fonksiyonu ile bir alt process yaratınız. Alt process’te exit
fonksiyonunda 10 değeri ile geri dönünüz. Üst process’te wait fonksiyonu ile alt process’i
bekleyiniz ve çıkış kodunu alarak yazdırınız.


#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
pid_t pid;
int Status;
if ((pid = fork()) == -1) {
perror("fork");
exit(1);
}
if (pid == 0) {
printf("I am child..\n");
exit(10);
}
else {
wait(&Status);
printf("Exit code: %d\n", WEXITSTATUS(Status));
}
printf("end..\n");
return 0;
}


Alt process’lerin sonlandırılmasında iki önemli durum oluşabilir.


1) Alt process üst process’ten daha önce sonlanmıştır
2) Üst process alt process’ten önce sonlanmıştır
Alt process üst process’ten önce sonlanmışsa, fakat üst process wait fonksiyonu ile alt
process’i beklememişse alt process zombi duruma düşer. Üst process daha önce sonlanmışsa
alt process’in üst process’i otomatik olarak sistem tarafından init process’i yapılacaktır. init
process’i tüm alt process’ler için wait fonksiyonu uygulamaktadır. Yani üst process alt
process’ten daha önce sonlanmışsa alt process zombi duruma düşmez. Çünkü sistem o
process’in üst process’ini init process’i yapacaktır, init process’i de wait ile çıkış kodunu
alacaktır. Görüldüğü gibi zombi durumu üst process’in de çalışmaya devam ettiği durumlarda
oluşmaktadır.


Üst process sonlandığı anda zombi durumu ortadan kalkmaktadır. Şüphesiz alt process daha
önce sonlanmış olabilir ve üst process herhangi bir zaman wait fonksiyonunu uygulayabilir.
Bu durumda wait fonksiyonu bloke olmadan başarılı bir biçimde çıkış kodunu alacaktır ve alt
process’i zombi durumundan kurtaracaktır.


Win32 Programcıları İçin Not: Win32’de bir program başka bir programı CreateProcess
fonksiyonu ile çalıştırdığında alt process sonlanana kadar beklenmesi WaitForSingleObject
fonksiyonu ile process handle değeri kullanılarak gerçekleştirilir.


waitpid Fonksiyonu
wait fonksiyonu herhangi bir process’i bekleyebilmektedir. Yani pek çok alt process
yaratılmışsa wait fonksiyonu bitmiş olan herhangi bir alt process’in çıkış kodunu alır. Oysa
bazı uygulamalarda programcı belirli bir alt process’in çıkış kodunu almak isteyebilir. waitpid
fonksiyonu bunun için kullanılmaktadır.


pid_t waitpid(pid_t pid, int *stat, int options);


Fonksiyonun birinci parametresi beklenecek olan alt process’in handle değeridir. Bu değerin
normal olarak sıfırdan büyük olması beklenir. Ancak aşağıdaki özel durumlarda aşağıda
belirtilen işlemler oluşmaktadır.


Seçenek Olay
pid > 0 pid ile belirtilen alt process sonlanana kadar beklenir.
pid == -1 Herhangi bir alt process için bekleme yapılır. Bunun da wait
fonksiyonundan farkı kalmaz.
pid == 0 Process grup ID’si üst process ile aynı olan herhangi bir alt process
beklenir.
pid < -1 Process grup ID’si |pid| ile aynı olan herhangi bir alt process beklenir.
Fonksiyonun ikinci parametresi çıkış kodu bilgilerini yerleştirmek için kullanılır. Son
parametre ek belirlemeleri belirtir. Genellikle bu parametre 0 olarak girilir. 0 olarak
girilmezse aşağıdaki değerlerden biri olarak girilmelidir.


0
WHOHANG
WUNTRACEN

Bilgisayar Dershanesi Ders Sahibi;
Bilgisayar Dershanesi

Yorumlar

Yorum Yapabilmek İçin Üye Girişi Yapmanız Gerekmektedir.

ETİKETLER