PID'ler nasıl üretilir?


42

Açık * nix, PID'ler çalışan işlemler için benzersiz tanımlayıcılardır. PID'ler nasıl üretilir? Sadece artan bir tamsayı mı yoksa liste gibi daha karmaşık bir yapı mı? Nasıl geri dönüştürülürler? Geri dönüşüm ile, bir işlem sona erdiğinde, bunun PID'in sonunda başka bir işlem tarafından tekrar kullanılacağını kastediyorum.


Yanıtlar:


39

Gibi wikipedia diyor

Unix altında, işlem kimlikleri genellikle sırayla verilir, 0'dan başlar ve sistemden sisteme değişen maksimum bir değere yükselir. Bu sınıra ulaşıldığında, tahsis sıfırdan başlar ve tekrar artar. Bununla birlikte, bunun için ve sonraki geçişlerde, hala işlemlere atanmış PID'ler atlanır.

bu yüzden bu, "üretim" için basit bir politika, sadece bir sayaç artırma ve "geri dönüşüm", sadece sayıyı maksimum bir değere sarın ve bitmiş ve sahip olan bir işleme atanan bir numara bulana kadar artırmaya devam edin işlem tablosundan kaldırıldı.

AIX gibi bazı Unix uygulamaları daha az basit bir politika kullanır, örneğin bu SSS bölümüne bakın .


Cevap için teşekkürler. Bu arada, bu AIX politikası tam olarak ne “daha ​​az basit”?

1
@Helltone, AIX'in tam olarak hangi politikayı kullandığını belgelemdiğini sanmıyorum (böylece herhangi bir sürümde değişebilir), ancak uygun aralıkta rastgele bir sayı üretimi olarak düşünebilirsiniz (bu bir PID oluşturulana kadar tekrarlanır) şu anda kullanımda değil).
Alex Martelli

Bu algoritma benim için biraz problemli görünüyor. Çıkmaza girmediğinizden nasıl emin olabilirsiniz? Ve performans sorunu yok mu?

1
Çekirdek kontroldedir ve hiçbir şeyi kilitlemesine gerek yoktur, peki nasıl kilitlenebilir? Evet, ödenmesi gereken küçük bir performans fiyatı var (çatal zamanında küçük bir ek yük - bir düzine PRNG veya / dev / urandom okuması için birkaç düzine makine talimatı söyleyin) güvenliği artırmaya yönelik önlemler için durum (örneğin HTTPS iletişiminin CPU ek yükünü düz HTTP ile kontrol edin; örneğin ;-).
Alex Martelli

Livelock ( while(true);) demek istedim , özür dilerim, hızlı cevap

11

Değişir.

Çoğu sistem basitçe üretilen son PID'nin bir miktarını tutar, bir tane ekler (en fazla 65535 gibi az miktarda sarın - sık sık sargı 65000 veya hatta 60000'de gerçekleşir) ve numaranın şu anda kullanımda olmadığını kontrol edin ( PID hala kullanımda ise tekrarlama - yani PID 1, çekirdek, hala orada ve 'yeniden yayınlanmadı'.

Diğer güvenlik fikirli sistemler rastgele bir sayı oluşturur ve kullanımda olmadığını kontrol edin.

Herhangi bir zamanda, tüm PID numaralarının benzersiz olması garanti edilir.


9

Sorunun geri dönüşüm kısmına gelince, akılda tutulması gereken bir husus, söz konusu sürecin sona ermesi üzerine bir ödemenin mevcut olmamasıdır. Bu işlemin ebeveyni, çocuğunun sonlandırma durumunu wait () sistem çağrısının bir şekliyle toplayana kadar bu hizmet geçerli değildir. Sonlandırılan ancak ebeveyni bekleme izni vermeyen bir çocuğa zombi denir ve genellikle ps olarak geçersiz sayılır. Hasta olmayan bir ebeveynin, çocukları çalıştırırsa ve onları beklemiyorsa () beklemiyorsa, çare sistemini açması mümkündür.

Bir sürecin ebeveyni bir çocuğun durumunu almadan önce ölürse, sorun değil. Çocuk bir bekletme () yapıldığından ve teklifin geri kazanıldığından emin olacak init tarafından miras alınır.


Bu çok önemli bir detay. O olmadan basit bir myprog &takip bile wait $!UB olur.
Andreas

3

Sistem yeterince uzun süre çalışırsa, bunlar sıra numaralarıdır ve tamamlanırlar (işletim sistemine özgü bir değerde). Sayılar, boş olmadıkları sürece asla yeniden kullanılmazlar fork().

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.