Saya tahu bahwa bom fork dapat dicegah dengan membatasi jumlah proses satu pengguna, dan kebocoran memori tidak akan membekukan OS saya karena Linux memiliki pembunuh OOM. Tapi bagaimana dengan bom garpu yang bocor memori?
#include <vector>
#include <unistd.h>
#include <ctime>
#include <cstdlib>
using namespace std;
int main() {
srand(time(NULL));
vector<int> vec;
do {
try {
for (int i=0; i<10000000; i++)
vec.push_back(rand());
} catch (bad_alloc e) {
}
fork();
} while (1);
return 0;
}
Linux saya menjadi beku setelah mencoba kode ini. Apakah ada yang bisa saya mencegahnya membeku?
Kode ini diuji pada Archlinux, Linux 4.0.5
kompilasi kode hanya menggunakan perintah ini:
g++ -o test test.cpp
Informasi lebih lanjut: Karena kode dapat menghabiskan semua ingatan saya hanya dengan forking beberapa kali, itu tidak seperti bom fork normal, dan membatasi jumlah proses tidak berguna. Juga, fork () sering dieksekusi (ketika ada memori rendah) sehingga OOM-killer jauh lebih lambat daripada fork. Akibatnya, saya harus menggunakan Alt-SysRq-REI untuk menghentikan proses ini, tapi bukan itu yang saya inginkan.
Ini adalah pertama kalinya saya bertanya pada SuperUser. Bantu saya jika pertanyaan saya tidak pantas. Dan terima kasih atas bantuannya.
Jawaban:
Itu tidak harus berupa bom memori yang bocor - bahkan, misalnya, a
make -j
(atau denganj
faktor yang terlalu tinggi ) pada ukuran kode moderat atau proses apa pun yang memunculkan setumpuk keturunan (kurang dari batas yang wajar untuk pengguna aktif) ), masing-masing mengunyah sejumlah memori yang signifikan dengan sendirinya tetapi terlalu kecil untuk ditargetkan oleh pembunuh OOM (atau untuk menawarkan bantuan yang signifikan ketika dipaku oleh pembunuh OOM) dapat memiliki efek yang sama.Dimungkinkan untuk menulis skrip / alat pemantauan khusus (untuk dieksekusi oleh root pada prioritas tinggi) yang dapat mengawasi proses pemijahan seperti itu dan, jika perlu, membunuhnya dengan pgid atau userid (yaitu secara simultan, tidak satu per satu seperti OOM pembunuh) sebelum mereka menjadi fatal bagi sistem. Akan bekerja untuk tingkat pengeringan sumber daya yang wajar , tapi saya tidak yakin apakah mungkin untuk sembarang harga.
sumber
-j32
jika satu pengguna membangun dan-j8
jika 4 pengguna membangun. Nilai mana pun OK di satu kasus, tetapi tidak demikian di yang lain.