Ini murni pertanyaan akademis, karena ini tidak akan pernah terjadi.
Jika PID disimpan sebagai tipe pid_t, dan bukan tipe presisi arbitrer, maka ada batasan jumlah PID yang bisa ada pada satu waktu. Apakah ada perilaku yang pasti ketika PID meluap?
Akankah proses ke-65536 mematikan / sbin / init dan membuat panik kernel? Atau apakah ada tindakan pengamanan di tempat?
fork
gagal karena tidak ada pid tersedia.Jawaban:
The
fork
syscall harus kembali -1, dan seterrno
ke EAGAIN . Apa yang terjadi setelah itu akan tergantung pada proses yang dipanggilfork
.Dari garpu :
sumber
POSIX tidak menentukan bahwa PID dari setiap proses baru diperoleh dengan menambah PID sebelumnya. Itu hanya mengharuskannya menjadi unik.
Pada sistem di mana PID bertambah pada masing-masing
fork()
, saya telah mengamati bahwa nilai membungkus setelah mencapai beberapa batas atas (yang menurut pengalaman saya adalah sekitar 15 ). Setelah melilit, PID baru tidak secara bertahap bertambah, karena beberapa nilai PID masih akan digunakan dari siklus sebelumnya.Seharusnya tidak ada masalah sampai Anda memiliki 2 N secara bersamaan menjalankan proses. Saya menduga sistem akan mengalami beberapa batasan kapasitas jauh sebelum itu terjadi. Dalam hal ini,
fork()
panggilan sistem akan gagal dan mungkin diaturerrno
keEAGAIN
atauENOMEM
(man fork
untuk detail).Kode yang mengimplementasikan
fork
mungkin atau tidak memeriksa apakah ada PID yang tersedia. Itu mungkin tidak mengganggu, karena mengasumsikan bahwa sumber daya sistem akan habis sebelum sampai ke titik itu, atau mungkin memiliki pemeriksaan eksplisit demi kelengkapan dan untuk menangani kemungkinan masa depan. Saya belum memeriksa, dan jika saya punya saya hanya bisa alamat kernel mana pun yang saya lihat.sumber
Batas PID maksimum jauh lebih sedikit daripada
2^((sizeof(int)*CHAR_BIT)
. Lihat Berapakah nilai maksimum ID Proses? . Dengan kata lain, PID Anda tidak akan pernah mendekati 4 miliar.Ketika semua slot pid terisi,
fork
panggilan akan mulai gagal denganerrno==EAGAIN
(lihat garpu (2) ). Jika Anda cukup menekan bagian atas tanpa mengisi semua slot, PID berikutnya akan menjadi slot gratis berikutnya setelah 1 (1 adalah init)sumber