Üye Kayıt Üye Giriş

Tipik Bir POSIX Sisteminde Process Sıralaması


Tipik Bir POSIX Sisteminde Process Sıralaması

UNIX ve Linux sistemleri arasında kendine özgü farklılıkları olsa da temel olarak bu türden
bir sistem açıldığında kernel tarafından ilk yaratılan process swapper ya da sched isimli
process’tir. Bu process boot işlemi sırasında yaratılır ve handle değeri (process ID değeri)
0’dır. Yine klasik bir UNIX sisteminde swapper tarafından yaratılan bir init process’i
vardır. Bu process’in de ID değeri 1’dir. init process’i de sistem kapanana kadar faaliyet
göstermektedir. Son olarak, tipik POSIX sistemlerinde özellikle sayfalama amacı ile
kullanılan pagedaemon ya da pageout isimli bir process daha vardır. Bu process’in de ID
değeri genellikle 2’dir. init process’i bundan sonra sistemde yaratılacak bütün process’lere
ana process görevi yapmaktadır. Tipik olarak bir terminal yaratıldığında oluşturulan getty
gibi bir process init process’i tarafından yaratılır. getty process’i terminal yaratıldığında
genellikle login process’ini yaratır, login process’i de daha önce ele alındığı gibi shell
process’ini oluşturur. Bu durumda tipik bir POSIX sistemindeki shell process’ine kadar olan
process’lerin yaratılma süreci şöyledir:


init
getty
login
shell


POSIX sistemlerinde process’in handle değeri olarak process’in ID değeri kullanılır.
Process’in ID değeri pid_t türü ile temsil edilir ve normal olarak int türündendir. fork
fonksiyonun prototipi unistd.h başlık dosyası içerisinde aşağıdaki gibi bildirilmiştir.


pid_t fork(void);


pid_t türü diğer türlerde olduğu gibi sys/types.h dosyası içerisinde bildirilmiştir.
fork fonksiyonu tipik olarak yeni yaratılan process’in ID değerini elde etmek için process
tablosunda önce boş bir giriş arar. Process tablosu process handle alanlarınından oluşan bir
yapı dizisi gibi düşünülebilir. fork bu dizide ilk boş elemanı bulur ve yeni process’in ID
değerini bu biçimde oluşturur. Tasarımda genellikle process handle alanları static bir dizi
biçiminde tutulur, son tahsis edilen slot kernel içerisinde ayrı bir sayaçta saklanır. Boş slot
arama işlemleri bu sayaçtan itibaren yapılır, process tablosu bittiğinde yeniden başa dönülür.
Tabii POSIX sistemleri arasında process tablosunun organizasyonu bakımından önemli
farklılıklar olabilir.


fork Fonksiyonunun Kullanımı


fork fonksiyonunun kullanımında iki kalıp söz konusudur. Birinci kalıp:

pid_t pid;
switch (pid = fork()) {
case –1:
fprintf(stderr, “Cannot fork..\n”);
exit(1);
case 0:


// <alt process>
break;
default:
// <üst process>
break;
}
İkinci kalıp:
pid_t pid;
if ((pid = fork()) > 0) {
// üst process
}
else if (pid == 0) {
// alt process
}
else {
fprintf(stderr, “Cannot fork...\n”);
exit(1);
}


Bazı programcılar okunabilirliği arttırmak için ikinci kalıpta önce hata kontrolüne yönelirler.


pid_t pid;
if ((pid = fork()) == -1) {
perror(“Cannot fork...\n”);
exit(1);
}
if (pid == 0) {
// <alt process>
}
else {
// <üst process>
}


Aşağıdaki programda "process..." yazısı toplam 8 kez yazılır ve toplam 7 tane child process
yaratılır.


int main(void)
{
int i;
for (i = 0; i < 3; ++i)
fork();
printf("process...\n");
return 0;
}


fork mekanizması eski sistemlerde kötüye kullanıma açıktı. Örneğin, normal bir kullanıcının
process'i sürekli fork işlemleriyle yeni processler yaratıp sistemin process tablosunu
doldurabiliyor, böylece diğer processler fork yapamaz hale geliyordu. Bu tür sistemlerde
çökmenin asıl nedeni kernel'in kendisinin de doğal çalışma içerisinde fork yapamamasıdır.
Modern sistemlerde bir process'in fork sayısı sınırlandırılmıştır. Process tablosunda yer tahsis
eden fonksiyonlar (yani boş slot arayan fonksiyonlar) belirli bir process sayısını kernel için
ayırırlar.

 Örneğin, process tablosunun toplam uzunluğu 32762 ise bunun 100 tanesi kernel
için ayrılmış olabilir.


fork İşleminde Dosya Tablosunun Kopyalanması


fork işlemi sırasında process handle alanının alt process'e kopyalanmasıyla process'in
kullandığı dosya tablosu da alt process'e kopyalanmaktadır. Bu durumda fork işlemi sırasında
dosya tablolarının durumu şöyle olacaktır:


Görüldüğü gibi burada üst process ile alt process aynı dosya nesnelerini görür hale gelmiştir.
Bu tür mekanizmalarda nesne sayacına gereksinim duyulur. Örneğin dosya nesnesinin
içerisinde bir sayaç vardır, bir process her fork yaptığında sayaç 1 arttırılır, böylece alt
process dosyayı kapattığında dosya nesnesi silinmez, sayacı 1 eksiltilir, sayaç 0'a düşmüşse
dosya nesnesi silinir. Şüphesiz dup ve dup2 gibi fonksiyonlar da dosya nesne sayacını
arttırmaktadırlar. Dosya nesne sayacı close ile dosya kapatıldığında ya da program
sonlandığında eksiltilmektedir.

Bilgisayar Dershanesi Ders Sahibi;
Bilgisayar Dershanesi

Yorumlar

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

ETİKETLER