#include <unistd.h>
int main(int argc, char* argv[]) {
while(1)
{
fork();
}
}
Saya menjalankan program ini di linux saya, tidak ada output di terminal, OS sepertinya mati. Apakah linux memiliki ukuran perlindungan untuk program semacam itu yang dapat kehabisan memori?
Jawaban:
Ini dikenal sebagai bom fork .
Tidak juga. Setiap garpu menghasilkan proses baru, dengan ruang alamat virtual dan penggunaan memori sendiri. Jadi setiap salinan relatif kecil. Akhirnya, Anda akan menggunakan semua memori fisik + swap pada sistem, dan pembunuh yang kehabisan memori (OOM) akan mulai membunuh proses individu. Tetapi bom fork masih akan menciptakan proses secepat (jika tidak lebih cepat).
Salah satu cara untuk mencegah hal ini terjadi di tempat pertama adalah membatasi jumlah proses pengguna, menggunakan
ulimit -u
(dengan asumsi Anda menggunakan Bash; shell lain akan memiliki setara).sumber
ulimit
adalah khusus untuk bash; kerang lain kemungkinan memiliki perintah bawaan yang sama, tetapi mungkin dengan nama yang berbeda.Ya, meskipun mungkin tidak diaktifkan secara default di sistem Anda. The
setrlimit
system call mendefinisikan batas sistem - termasuk jumlah proses per pengguna.Mari kita lihat terlebih dahulu di kernel API (karena Anda menyebutkan "linux"): Anda dapat menggunakan halaman manual untuk setrlimit, yang akan memberitahu Anda untuk melakukan sesuatu seperti
Ini akan mengatur proses maksimum per pengguna (
RLIMIT_NPROC
) menjadi 40 (batas lunak) dan 50 (batas keras).Sekarang, dari shell, jika Anda menggunakan bash, Anda dapat menggunakan
ulimit
perintah bawaan:Anda dapat menetapkan batas dengan meneruskannya sebagai argumen:
ulimit --help
akan menunjukkan kepada Anda bahwa ada beberapa batasan lain yang dapat Anda tetapkan (satu yang mungkin menarik adalah jumlah maksimum deskriptor file yang digunakan oleh pengguna).sumber
Itu tergantung jika Anda ingin menggunakannya pada tingkat pengguna atau tingkat sistem. Pada level pengguna,
ulimit
(atau perintah yang sesuai untuk shell lain) akan menjadi solusi termudah.Namun pada tingkat sistem ada mekanisme untuk mencegah pengguna jahat (atau tidak menggunakan ulimit) menghentikan sistem. Mekanisme Linux cgroups dapat membatasi sumber daya berdasarkan per-kelompok. Anda dapat memaksa (berdasarkan
pam_systemd
machanism) sesi pengguna berada dalam kelompok tertentu. Ini memiliki manfaat lain untuk, misalnya, penjadwal CPU.sumber
/sys/fs/cgroup/
2. dengan mencari di google 3. dengan menelusuri melaluimake menuconfig
4. Dengan melihat ke/usr/src/linux/Documentation/cgroups
5. Dengan membaca dokumentasi systemd. Maaf saya tidak bisa membantu lebih tetapi saya hanya menggunakan sumber daya itu. Saya menggunakan cgroups di desktop untuk mengontrol sumber daya.Gunakan
ulimit -u
dari bash shell untuk menetapkan batas pada "proses pengguna maks".Dari shell C, Anda menggunakan
limit
perintah.Jika Anda memerlukan panggilan sistem untuk melakukan ini, gunakan
setrlimit
panggilan untuk mengaturRLIMIT_NPROC
.sumber
Karena jawaban terbaru di sini sudah lebih dari 3 tahun, saya ingin menunjukkan bahwa kernel yang lebih baru (sejak 4.3) memiliki dukungan eksplisit untuk mencegah bom fork melalui "subsistem PID" yang baru. (Lihat https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=49b786ea146f69c371df18e81ce0a2d5839f865c dan https://git.kernel.org/cgit/linux/kernel/git /torvalds/linux.git/commit/?id=917d8e2d10f40e28aa9e0d824b2e5b8197d79fc2 )
sumber