Monday 17 December 2007

LİNUX Çekirdeğini Anlamak - Süreçler 6


3.4 Süreçleri Yok etmek (Destroying Processes)
Süreçlerin çoğu koşturmak zorunda oldukları kodun çalışışını bitirmek anlamında “ölürler.”
Bu olduğunda, çekirdek, bu sürecin sahibi olduğu kaynakları serbest bırakmak için haberdar edilmelidir; bu bellek, açık dosyalar, ve semaphor gibi başka ıvır zıvırı içerir. Bir sürecin alışılagelmiş bitiş şekli çık() (exit()) sistem çağrısını harekete geçirmektir. Bu sistem çağrısı programcı tarafından doğrudan konabilir. Ek olarak, çık() (exit()) sistem çağrısı kontrol akışı ana prosedürün son komut satırına geldiği her kez çalıştırılır (C programlarında ana() (main()) fonksiyonu). Ya da, çekirdek bir süreci ölmeye zorlayabilir.

Bu tipik olarak, süreç, muamele edemeyeceği veya yok sayamayacağı bir işaret (signal) aldığında veya çekirdek bir süreç yararına çalışırken, Çekirdek Çalışma Türünde kurtarılamayacak bir MİB istisnası (exception) ilan edilirse ortaya çıkar.

3.4.1 Süreç Sonu (Process Termination)
Bütün süreç sonları çekirdek veri alanlarının sona eren sürece değindiği noktaları(references) kaldıran çıkış_yap() (do_exit( )) fonksiyonu tarafından ele alınır. çıkış_yap() (do_exit( )) fonksiyonu aşağıdaki eylemleri yapar:

1. Süreç tanımlayıcının PF_ÇIKIYOR (PF_EXITING) bayrak alanını işaretler.
2. Eğer gerekiyorsa süreç tanımlayıcıyı bir IPC semaphore kuyruğundan sem_çık() (sem_exit( )) fonksiyon ya da devingen zamanlayıcı kuyruğundan yoket_zamanlayıcı (del_timer( )) fonksiyonu ile çıkar.

3. __exit_mm( ), __exit_files( ), __exit_fs( ), and _ _exit_sighand( ) fonksiyonları ile sayfalayış, dosyasistemi, ve işaret muamelesi ile ilgili süreç veri yapılarını sınar. Bu fonksiyonlar aynı zamanda eğer başka hiçbir süreç paylaşmıyorsa bu veri yapılarının herhangi birini yok ederler.

4. Süreç tanımlayıcının hal (state) alanını GÖREV_ZOMBİE (TASK_ZOMBIE) olarak işaretler.

5. Süreç tanımlayıcının çıkış_kodu (exit_code) alanını süreç sona eriş koduna eşitler. Bu değer ya çıkış() (exit()) sistem çağrısı parametresi(normal sonlanış), veya çekirdek tarafından sağlanan hata kodudur(anormal sonlanış).

6. Hem ebeveyn sürecinin hem de çocuk süreçlerin ebeveyn ilişkilerini güncelleştirmek için çıkış_bildirim() (exit_notify()) fonksiyonunu harekete geçirir. Sona eren süreç tarafından yaratılmış bütün çocuk süreçleri sıfırdan_başla (init) sürecinin çocukları haline gelirler.

7. Yeni bir süreci koşturmağa seçmek için zaman_ planla() (schedule()) fonksiyonunu harekete geçirir. GÖREV_ZOMBİE (TASK_ZOMBIE) halindeki bir süreç zaman_planlayıcı tarafından yok sayıldığı için, süreç zaman_planla() (schedule( )) içindeki ona_geç() (switch_to) makrosu harekete geçtikten hemen sonra çalışmağı durduracaktır.

3.4.2 Süreç Kaldırılışı (Process Removal)
Unix işletim sistemi bir sürecin ebeveyninin SüreçKimlikNosu (PID)’nu temin etmek için ya da çocuklarından herhangi birinin çalışım halini temin etmek için o sürecin çekirdeği sorgulayışına izin verir.

Bir süreç, örneğin belirli bir görev için bir çocuk süreç yaratır ve sonra bekle() (wait())- benzeri bir sistem çağrısı icra ederek çocuğun bitip bitmediğini kontrol eder. Eğer çocuk bitmiş ise, bitiş kodu ebeveyn sürece görevin başarı ile yapılıp yapılmadığını anlatır. Bu tasarım seçeneklerine uymak için, Unix çekirdeklerinin bir süreç bittikten hemen sonra süreç tanımlayıcı alanı içine dahil edilen verileri çöpe atmalarına izin verilmez. Böyle yapmalarına yalnız ebeveyn süreç bir bekle() (wait()) benzeri sistem çağrısını yaptıktan sonra izin verilir, sona erdirilmiş sürece ilişkin. GÖREV_ZOMBİE (TASK_ZOMBIE) hali işte bu yüzden kullanılmıştır: süreç teknik açıdan ölü olsa bile, tanımlayıcısı, ebeveyn süreci haberdar edilinceye kadar saklanmalıdır.

Eğer ebeveyn süreç çocuklarından önce sona ererse ne olur? Böyle bir durumda, sistem zombie süreçler ile dolup taşabilir, var olan görev hanelerini kullanıp tüketebilen. Daha önce bahsedildiği gibi, bu problem bütün öksüz süreçlerin zorla sıfırdan_başla (init) sürecinin çocukları haline getirilişi ile çözülür.

Bu şekilde, sıfırdan_başla süreci bir bekle()-benzeri sistem çağrısı ile kendi meşru çocuklarından birini kontrol ederken zombie’leri yok eder.