UNIX/Linux sistemlerinde Process’ler
Her işletim sisteminde bir process yaratıldığında sistem bu process’i izleyebilmek ve process
işlemlerini yapabilmek için bir handle alanı oluşturur. Bu handle alanı şüphesiz koruma
mekanizması tarafından korunmuş olan sistem alanında tahsis edilir. Process yaratan
fonksiyonlar geri dönüş değeri olarak yeni yaratılmış process alanının handle değerini
verirler. Process’in handle değeri bir tamsayı formatında olabildiği gibi (void *) biçiminde de
olabilir. Win32 sistemlerinde process’in handle alanına “process database” denilmektedir.
UNIX/Linux sistemlerinde bu alan için çeşitli isimler kullanılmaktadır. Şüphesiz sistem tüm
process handle alanlarını bir veri yapısı içinde tutmalıdır. Örneğin tipik olarak sistemler şöyle
stratejiler kullanırlar:
1) Process yaratıldığında process’in handle alanı kernel içerisinde organize edilen bir heap
alanında tahsis edilebilir ve bu alanlar bağlı liste biçiminde tutulabilir. Dinamik tahsisat hız
bakımından dezavantajlı olabilmektedir.
2) Kernel başlangıçta static düzeyde bir yapı dizisi biçiminde handle alanları için genel bir
tahsisat yapmış olabilir. Bu durumda process yaratıldığında bu dizi üzerinde boş slot aranır ve
böylece hızı yavaşlatan heap tahsisatının önüne geçilmiş olur. Tabii bu yöntemde de static
alan üzerinde yine bağlı liste kullanılmalıdır.
3) Bu yöntem ilk iki yöntemin bir karışımı gibidir. Bu yöntemde process handle alanı
process’in kernel stack’i üzerinde bulunur (kernel stack process bir sistem fonksiyonunu
çağırdığında kapı yoluyla ring0’a geçildiğinde kullanılan stack bölgesidir). Bu sistem
özellikle Linux 2.4 tarafından benimsenmiştir. Bu yöntemde iki fayda düşünülmüştür.
a) Process handle alanları sınırlı sayıda değildir.
b) Sistem fonksiyonları stack değişimi yapıldığı için ESP yazmacı üzerinde basit bir
işlemle process handle alanına hızlı bir erişim yapabilir.
Process handle alanının oluşturulmasında temel performans ölçütleri:
1) Toplam process handle alanlarının sınırlılığı veya sınırsızlığı
2) Process handle alanına erişim kolaylığı
fork İşlemi
fork sistem fonksiyonu çalışmakta olan bir process’in bir kaç istisna durum dışında tamamen
bir kopyasını oluşturur. fork sistem fonksiyonu ile yeni bir process oluşturulduğunda yeni
oluşturulan process'e alt process (child process), bu process'i oluşturan process'e ise üst
process (parent process) denir. Bir process’in kullandığı bellek alanına ilişkin tüm bilgiler
process handle alanında tutulur. Örneğin process’in bölümlerini oluşturan .text, .data, .bss gibi
bellek alanları process handle alanında tutulmaktadır. Process’in sanal bellekteki yerinden
başka process’in handle alanında aşağıdaki temel bilgiler tutulmaktadır.
- Çevre değişkenleri
- user id, group id, etkin user id, etkin group id
- O andaki geçerli dizin
- Ek grup id’leri
- Dosya tablosu
- ve diğerleri
fork işlemi sırasında özdeş bir process’in oluşması demek;
1) Process handle alanının bir kopyasından oluşturulması
2) Process’in bellek alanının bir kopyasından oluşturulması
demektir. Zaten bu iki bilgi neredeyse process kavramının tüm bilgilerini oluşturmaktadır.
fork işlemi sırasında özdeş kopya çıkartılırken asıl önemli zaman kaybı üst process’in bellek
alanının kopyalanması işlemine ilişkindir. Neyseki “copy on write” denilen sanal bellek
yönteminde yalnızca üst process’in bellek alanının bir sayfası değiştirildiğinde gerçek bir
kopyalama yapılır. “Copy on write” sistemi pek çok nedenden dolayı eski bazı sistemlerde
yoktu. “Copy on write” özelliği gerçek kopyanın yalnızca gerektiğinde çıkartması anlamına
gelir. Bu sistemWin32’de de aynı programdan ikinci kez çalıştırıldığında kullanılmaktadır.
fork işlemi sırasında yeni bir process yaratıldığına göre, yani yeni bir process handle alanı
oluşturulduğuna göre yaratılan alt process’in de bir process handle değeri oluşmaktadır.
fork fonksiyonu yeni process yaratıldığında üst ve alt process’ler için ayrı değerler ile geri
döner. Üst process’te fork yeni yaratılan alt process’in handle değeri ile geri döner. Alt
process’te ise 0 ile geri döner. Akış fork içerisinde ikiye ayrılmaktadır. Hem üst process, hem
de alt process fork işleminden sonra program kodunun aynı yerinden çalışmayı sürdürür. Yani
her iki process’in akışı da fork fonksiyonundan çıkar. Ancak kod bir tanedir, fakat akış ikiye
ayrılır. fork fonksiyonunu çağıran programcı fonksiyonun geri dönüş değerine bakarak hangi
process’in hangi işlemleri yapacağına karar verir. fork fonksiyonunun sembolik biçimi
şöyledir.
int fork(void)
{
// 1) Process handle alanının kopyasından oluştur
// 2) Bellek alanının kopyasından oluştur
// 3) Yeni bir çizelge elemanı oluştur
// ve bunun başlangıcını NEWEXIT yap.
return (yeni process’in handle değeri);
NEWEXIT:
return 0;
}
fork fonksiyonu başarısız olabilir. Örneğin sistemin izin verdiği en yüksek process sayısı
aşıldığında fork başarısız olacaktır. fork başarısız olduğunda –1 değerine geri döner. Bu
C ve Sistem Programcıları Derneği 53
durumda fork 3 değere geri dönebilir. ‘–1’, ‘0’ ya da ‘> 0’ . Programcı bu üç değeri de kontrol
ederek akışını yönlendirir.