Bagaimana PID dihasilkan?

42

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.

Giovanni Funchal
sumber

Jawaban:

39

Seperti kata wikipedia ,

Di bawah Unix, ID proses biasanya dialokasikan secara berurutan, mulai dari 0 dan naik ke nilai maksimum yang bervariasi dari satu sistem ke sistem lainnya. Setelah batas ini tercapai, alokasi dimulai ulang pada nol dan kembali meningkat. Namun, untuk ini dan melewati berikutnya setiap PID masih ditugaskan untuk proses dilewati.

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 .

Alex Martelli
sumber
Terima kasih atas jawabannya. Omong-omong, apa sebenarnya kebijakan AIX ini "yang kurang sederhana"?
1
@Helltone, saya tidak berpikir AIX mendokumentasikan dengan tepat kebijakan apa yang digunakannya (sehingga dapat berubah pada rilis apa pun), tetapi Anda dapat menganggapnya sebagai pembuatan nomor acak dalam kisaran yang sesuai (yang akan diulangi hingga PID dihasilkan yang tidak sedang digunakan).
Alex Martelli
Algoritma ini sepertinya agak bermasalah bagi saya. Bagaimana Anda memastikan bahwa Anda tidak menemui jalan buntu? Dan bukankah ada masalah kinerja?
1
Kernel di kontrol dan tidak perlu mengunci apa pun, jadi bagaimana mungkin jalan buntu? Ya, ada harga kinerja yang kecil untuk dibayar (overhead tambahan kecil pada waktu fork - katakanlah beberapa lusin instruksi mesin untuk membaca PRNG atau / dev / urandom yang kongruensial, vs jauh lebih sedikit untuk kenaikan tambahan), tetapi itu selalu kasus untuk langkah-langkah yang dimaksudkan untuk meningkatkan keamanan (periksa overhead CPU komunikasi HTTPS vs HTTP sederhana misalnya ;-).
Alex Martelli
Maksud saya livelock ( while(true);), maaf, saya cepat menjawab ;-)
11

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.

Jonathan Leffler
sumber
9

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.

frankc
sumber
Ini adalah detail yang sangat penting. Tanpa itu bahkan myprog &diikuti oleh sederhana wait $!akan menjadi UB.
Andreas
3

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().

Donal Fellows
sumber