Pada * nix, PID adalah pengidentifikasi unik untuk menjalankan proses. Bagaimana PID dihasilkan? Apakah itu hanya bilangan bulat yang bertambah atau struktur yang lebih kompleks seperti daftar? Bagaimana mereka didaur ulang? Dengan mendaur ulang, maksud saya, ketika suatu proses berakhir, PID-nya pada akhirnya akan digunakan kembali oleh proses lain.
42
Jawaban:
Seperti kata wikipedia ,
jadi itu benar-benar kebijakan yang sangat sederhana untuk "generasi", hanya menambah penghitung, dan "daur ulang", hanya membungkus nomor sekitar pada nilai maksimal dan terus bertambah sampai Anda menemukan nomor yang ditugaskan untuk proses yang telah selesai dan telah telah dihapus dari tabel proses.
Beberapa implementasi Unix seperti AIX menggunakan kebijakan yang kurang sederhana, lihat misalnya FAQ ini .
sumber
while(true);
), maaf, saya cepat menjawab ;-)Bervariasi.
Sebagian besar sistem hanya menyimpan hitungan PID terakhir yang dihasilkan, menambahkan satu (membungkus pada jumlah maksimum seperti 65535 atau sedikit lebih kecil - sering pembungkus terjadi pada 65000 atau bahkan 60000), dan memeriksa bahwa nomor tersebut tidak sedang digunakan ( ulangi jika PID masih digunakan - jadi PID 1, kernelnya, masih ada dan tidak 'diterbitkan ulang').
Sistem yang memikirkan keamanan lainnya menghasilkan angka secara acak dan memeriksa bahwa nomor itu tidak digunakan.
Pada waktu tertentu, dijamin bahwa semua nomor PID unik.
sumber
Mengenai bagian daur ulang dari pertanyaan, satu hal yang perlu diingat adalah bahwa pid tidak tersedia segera setelah proses dengan pid itu berakhir. Pid tidak menjadi tersedia sampai induk dari proses itu mengumpulkan status terminasi anaknya melalui beberapa bentuk panggilan tunggu () sistem. Seorang anak yang diberhentikan tetapi orang tuanya belum mengeluarkan menunggu disebut zombie dan biasanya akan muncul dalam ps sebagai mati. Ada kemungkinan bagi orang tua yang berperilaku buruk untuk kelaparan sistem pids jika meluncurkan anak-anak dan tidak menunggu () untuk mereka.
Jika induk dari suatu proses mati sebelum mengumpulkan status seorang anak, itu tidak masalah. Anak diwarisi oleh init yang akan memastikan menunggu () dikeluarkan dan pid didaur ulang.
sumber
myprog &
diikuti oleh sederhanawait $!
akan menjadi UB.Mereka nomor urut dan membungkus bulat (pada nilai OS-spesifik) jika sistem cukup lama. Angka tidak pernah digunakan kembali kecuali mereka bebas pada titik
fork()
.sumber