Zombi süreci - Zombie process

Açık Unix ve Unix benzeri bilgisayar işletim sistemleri, bir zombi süreci veya geçersiz süreç bir süreç yürütmeyi tamamlayan (aracılığıyla çıkış sistem çağrısı ) ancak yine de işlem tablosu: bu, "Sonlandırılmış durum ". Bu, alt süreçler, girişe izin vermek için hala gerekli olduğunda ana süreç çocuğununkini okumak çıkış durumu: çıkış durumu, Bekle sistem çağrısı, zombinin girişi işlem tablosundan kaldırılır ve "biçilmiş" olduğu söylenir. Bir çocuk süreç, kaynak tablosundan kaldırılmadan önce her zaman önce bir zombi haline gelir. Çoğu durumda, normal sistem çalışması altında zombiler hemen ebeveynleri tarafından beklenir ve daha sonra sistem tarafından biçilir - uzun süre zombi olarak kalan süreçler genellikle bir hatadır ve kaynak sızıntısı, ancak işgal ettikleri tek kaynak işlem tablosu girişi - işlem kimliği.

Dönem zombi süreci ortak tanımından türemiştir zombi - bir ölümsüz kişi. Terimin metaforunda, çocuk süreci "öldü" ama henüz olmadı "biçilmiş ". Ayrıca, normal işlemlerden farklı olarak, öldürmek komutunun zombi süreci üzerinde hiçbir etkisi yoktur.

Zombi süreçleri ile karıştırılmamalıdır yetim süreçler: yetim bir süreç, halen yürütülmekte olan ancak ebeveyni ölmüş olan bir süreçtir. Ebeveyn öldüğünde, öksüz çocuk süreci, içinde (işlem kimliği 1). Yetim süreçler öldüğünde, zombi süreçleri olarak kalmazlar; bunun yerine onlar Bekletarafından düzenlendi içinde. Sonuç, hem zombi hem de öksüz olan bir sürecin otomatik olarak biçilmesidir.

Genel Bakış

Bir işlem bittiğinde çıkış, onunla ilişkili tüm bellek ve kaynaklar başka işlemler tarafından kullanılabilmeleri için serbest bırakılır. Bununla birlikte, işlemin işlem tablosundaki girişi kalır. Ebeveyn, çocuğun çıkış durumunu şu komutu çalıştırarak okuyabilir: Bekle sistem çağrısı, bunun üzerine zombi kaldırılır. Bekle çağrı sıralı kodda yürütülebilir, ancak genellikle bir işleyici için SIGCHLD sinyal, bir çocuk öldüğünde ebeveynin aldığı.

Zombi kaldırıldıktan sonra, işlem tanımlayıcı (PID) ve işlem tablosundaki giriş daha sonra yeniden kullanılabilir. Ancak, bir ebeveyn aramazsa Beklezombi işlem tablosunda bırakılarak kaynak sızıntısı. Bazı durumlarda bu arzu edilebilir - üst süreç bu kaynağı tutmaya devam etmek ister - örneğin ebeveyn başka bir çocuk süreç yaratırsa, aynı PID'nin tahsis edilmemesini sağlar. Modern UNIX benzeri sistemlerde ( SUSv3 bu konuda şartname), aşağıdaki özel durum geçerlidir: eğer ebeveyn açıkça işleyicisini şu şekilde ayarlayarak SIGCHLD'yi yoksayar SIG_IGN (sinyali varsayılan olarak görmezden gelmek yerine) veya SA_NOCLDWAIT bayrak ayarlandı, tüm çocuk çıkış durumu bilgileri atılacak ve hiçbir zombi işlemi kalmayacak.[1]

Zombiler, Unix'in çıktısında tanımlanabilir ps komut bir "mevcudiyetiyleZ"STAT" sütununda.[2] Kısa bir süreden daha uzun süredir var olan zombiler, tipik olarak ana programdaki bir hatayı veya sadece çocukları biçmeme konusunda alışılmadık bir kararı gösterir (örneğe bakın). Ana program artık çalışmıyorsa, zombi işlemleri genellikle işletim sisteminde bir hata olduğunu gösterir. Diğer kaynak sızıntılarında olduğu gibi, birkaç zombinin varlığı kendi başına endişe verici değildir, ancak daha ağır yükler altında ciddi şekilde büyüyecek bir soruna işaret edebilir. Zombi süreçlerine ayrılmış bellek olmadığından - tek sistem belleği kullanımı işlem tablosu girişinin kendisi içindir - birçok zombinin temel sorunu belleğin bitmesi değil, işlem tablosu girişlerinin, somut olarak işlem kimlik numaralarının bitmesidir.

Bir sistemden zombileri kaldırmak için SIGCHLD sinyal el ile ebeveyne gönderilebilir. öldürmek komut. Ana süreç hala zombiyi biçmeyi reddediyorsa ve ana süreci sonlandırmak iyi olacaksa, bir sonraki adım ana süreci kaldırmak olabilir. Bir süreç üstünü kaybettiğinde, içinde onun yeni ebeveyni olur. içinde periyodik olarak yürütür Bekle ile herhangi bir zombi toplamak için sistem çağrısı içinde ebeveyn olarak.

Misal

Eşzamanlı olarak belirli alt süreçleri (belirli) bir sırada beklemek, zombileri yukarıda belirtilen "kısa süreden" daha uzun süre devam ettirebilir. Bir program hatası olması gerekmez.

#Dahil etmek <sys/wait.h>#Dahil etmek <stdlib.h>#Dahil etmek <unistd.h>int ana(geçersiz){  pid_t pids[10];  int ben;için (ben = 9; ben >= 0; --ben) {    pids[ben] = çatal();    Eğer (pids[ben] == 0) {        printf("Çocuk% d",ben);        uyku(ben+1);        _çıkış(0);    }}için (ben = 9; ben >= 0; --ben){    printf("ebeveyn% d",ben);    waitpid(pids[ben], BOŞ, 0);    }dönüş 0;}

Çıktı

parent9Child3Child4Child2Child5Child1Child6Child0Child7Child8Child9 // bir duraklama var hereparent8parent7parent6parent5parent4parent3parent2parent1parent0

Açıklama

İlk döngüde, orijinal (üst) süreç kendisinin 10 kopyasını çatallar. Bu alt işlemlerin her biri (fork () sıfır döndürdüğü gerçeğiyle algılanır) bir mesaj yazdırır, uyur ve çıkar. Tüm çocuklar esasen aynı anda yaratılır (ebeveyn döngüde çok az şey yaptığı için), bu nedenle her biri ilk kez planlandığında biraz rastgele olur - dolayısıyla mesajlarının karıştırılmış sırası.

Döngü sırasında, bir dizi alt süreç kimliği oluşturulur. 11 işlemin tümünde pids [] dizisinin bir kopyası vardır, ancak yalnızca üstte tamamlanmıştır - her çocuktaki kopyada daha düşük numaralı çocuk PID'leri eksik olacak ve kendi PID'si için sıfır olacaktır. (Yalnızca üst süreç bu diziyi kullandığından, bu gerçekten önemli değil.)

İkinci döngü yalnızca üst süreçte yürütülür (çünkü tüm alt öğeler bu noktadan önce çıkmıştır) ve her çocuğun çıkmasını bekler. Önce 10 saniye uyuyan çocuğu bekler; diğerlerinin tümü çıkalı çok oldu, bu nedenle tüm mesajlar (ilki dışında) hızlı bir şekilde arka arkaya görünür. Tek bir süreçte bir döngü tarafından yönlendirildiği için burada rastgele sıralama imkanı yoktur. İlk ana mesajın aslında herhangi bir çocuk mesajından önce göründüğüne dikkat edin - ebeveyn, herhangi bir alt süreç başlayamadan ikinci döngüye devam edebildi. Bu da yine işlem programlayıcının rastgele davranışıdır - "ebeveyn9" mesajı, "ebeveyn8" den önce dizinin herhangi bir yerinde görünebilirdi.

Child0 ila Child8, bu durumda, çıktıkları zaman ile ebeveynin onlara waitpid () yaptığı zaman arasında bir veya daha fazla saniye geçirir. Ebeveyn, Child9'u çıkmadan önce zaten bekliyordu, böylece bir süreç aslında bir zombi olarak zaman harcamıyordu. [3]

Ayrıca bakınız

Referanslar

  1. ^ "wait (2) Man Page". Linux Programcısının Kılavuzu.
  2. ^ "Zombiler (5) - UNIX System V (Kavramlar)". Fermilab'daki Çarpıştırıcı Dedektörü.
  3. ^ https://stackoverflow.com/questions/42627411/can-someone-please-explain-how-this-worksfork-sleep

Dış bağlantılar