PID değerleri neden sürekli değil?


14

Eğer ps -efyazarsak, süreçlerin bir listesini alırız. PID numaraları neden sürekli değil?

Yanıtlar:


16

Ubuntu'da süreklidirler. Diğer işletim sistemlerinde farklılık gösterebilir.

Çekirdek PID'leri (RESERVED_PIDS, PID_MAX_DEFAULT) aralığında ayırır. Her ad alanında bunu sırayla yapar (farklı ad alanlarındaki görevler aynı kimliklere sahip olabilir). Aralık tükenirse, pid ataması tamamlanır.

( /programming/3446727/how-does-linux-determine-the-next-pid )

Yine de ...

  • Çekirdek zamanlama bir işlemi çatallayabilir, böylece sayıları atlamış gibi görünebilir.
  • Bu görev sona erdiğinde bir PID kaybolacaktır.
  • PID'ler PID_MAX_DEFAULT değerine ulaşılana kadar yeniden kullanılmaz.
  • Bir reserverd PID'si atlanır.

Stackoverflow ile ilgili bazı konular:

Yorumlarda PID'lerin değerlendirilmesini test etmek için bir komut vardır:

for i in {1..20}; do sh -c 'echo $$'; done

"Çekirdek zamanlama bir işlemi çatallayabilir, böylece sayıları atlıyor gibi görünebilir." - çekirdek hangi işlemin yürütüleceğini belirlerken bir süreç oluşturabilir? Tuhaf görünüyor.
user253751

Zamanlayıcının bir süreci çatallaması oldukça yaygındır. Muhtemelen bu bit: lxr.free-electrons.com/source/kernel/pid.c#L125 bunu belirleyen :)
Rinzwind

8

Aralarında eksik olan işlem kimlikleri zaten öldü ve PID'leri daha sonraki işlemlerde çekirdek tarafından yeniden kullanılacak.

Ölü işlemler, işlem tablosunda gösterilmez (zombiler hariç), dolayısıyla ps -efbunları göstermez.


3

Normalde PID süreklidir, ancak komutu çalıştırdığınızda bazı işlemler ölecektir ps -ef.

Ayrıca, bazı işlemler ps -efkomutta gösterilmeyen başka bir işlemin yalnızca bir alt süreci olabilir . Bazı genişletilmiş sonuçları görmek ve sürekli PID'yi kontrol etmek içinpstree

pstree -p

Örnek çıktı:

   ├─teamviewerd(3468)─┬─{teamviewerd}(3474)
│                   ├─{teamviewerd}(3475)
│                   ├─{teamviewerd}(3476)
│                   ├─{teamviewerd}(3477)
│                   ├─{teamviewerd}(3478)

Eğer çalıştırırsanız ps -efsadece üst süreci görürsünüz.

$ ps -ef | grep teamviewerd
root      3468     1  0 Jul15 ?        00:07:38 /opt/teamviewer9/tv_bin/teamviewerd -f

2

Onlar süreklidir. PID, maksimum sınıra ulaşılana kadar sıralı olarak atanır. Bu sınırdan sonra tekrar sıfırdan başlayacaktır.

Yani sadece eksik PID'ler ps -efölü süreçlerdir. ps -efYalnızca çalışan işlemleri listelediğini unutmayın .

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.