Apa yang terjadi ketika Anda kehabisan PID?

8

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?

Fred Frey
sumber
2
stackoverflow.com/questions/6294133/maximum-pid-in-linux Saya kira Anda bisa mengubah nilai maksimum dan mencari tahu;)
2
Angka yang lebih rendah dapat digunakan kembali (OpenBSD dan yang lainnya mengacak PID) dan Anda mungkin akan mencapai batas lain (misalnya kehabisan memori karena semua proses atau tukar kematian atau pembunuh OOM menjadi liar) sebelum forkgagal karena tidak ada pid tersedia.
thrig
1
Untuk informasi: Saya tidak percaya bahwa saya telah melihat PID lebih besar dari 2 ^ 15-1 = 32767. Apakah Anda?
thb
3
Duplikat yang disarankan tidak menjawab pertanyaan ini.
Julie Pelletier
1
Tidak jelas apakah Anda menanyakan apa yang terjadi ketika PID mencapai nilai maksimum (apakah sekitar 2 ^ 15 atau sekitar 2 ^ 32), atau apa yang terjadi ketika tidak mungkin lagi mengalokasikan PID baru, yang bukan hal yang sama . Saya tidak berpikir pertanyaan Anda merupakan duplikat dari salah satu pertanyaan yang ditandai; keduanya bertanya berapa batasnya, bukan apa yang terjadi ketika Anda melampauinya. Jika Anda memperbarui pertanyaan untuk menjelaskan apa yang Anda minta, saya akan memilih untuk membukanya kembali. (Anda sudah memiliki jawaban untuk kedua versi yang mungkin.)
Keith Thompson

Jawaban:

8

The forksyscall harus kembali -1, dan set errnoke EAGAIN . Apa yang terjadi setelah itu akan tergantung pada proses yang dipanggil fork.

Dari garpu :

Fungsi fork () akan gagal jika:

[EAGAIN]

Sistem tidak memiliki sumber daya yang diperlukan untuk membuat proses lain, atau batas yang ditentukan sistem pada jumlah total proses di bawah seluruh sistem eksekusi atau oleh satu pengguna {CHILD_MAX} akan dilampaui.

JigglyNaga
sumber
9

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 diatur errnoke EAGAINatau ENOMEM( man forkuntuk detail).

Kode yang mengimplementasikan forkmungkin 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.

Keith Thompson
sumber
Tentu saja saya tahu itu tidak akan pernah terjadi, tetapi sistem memiliki jumlah PID yang terbatas untuk ditugaskan. Saya hanya ingin tahu apa yang terjadi ketika habis.
Fred Frey
1
Jawaban ini sebenarnya satu-satunya yang benar-benar menjawab pertanyaan. Perilaku ini bergantung pada sistem tetapi hanya perlu memastikan pid unik per proses baru. Tentu saja Anda dibatasi oleh jumlah PID maksimum yang dikonfigurasi yang dirinci dalam 2 pertanyaan yang ditandai sebagai duplikat, tetapi sangat tidak mungkin terjadi kecuali sistem Anda menjalankan wadah atau Anda memiliki bug parah dalam program atau skrip yang diinstal.
Julie Pelletier
2

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, forkpanggilan akan mulai gagal dengan errno==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)

PSkocik
sumber