Cara standar untuk membuat proses baru di Linux adalah bahwa jejak memori dari proses induk disalin dan yang menjadi lingkungan proses anak sampai execv
dipanggil.
Apa jejak memori yang kita bicarakan, virtual (apa proses yang diminta) atau yang residen (apa yang sebenarnya digunakan)?
Motivasi: Saya memiliki perangkat dengan ruang swap terbatas dan aplikasi dengan perbedaan besar antara jejak memori virtual dan penduduk. Aplikasi tidak dapat melakukan fork karena kekurangan memori dan ingin melihat apakah mencoba mengurangi ukuran tapak virtual akan membantu.
sumber
If enough is available the kernel will commit to the full virtual size of the parent for both processes after the fork.
Ya terima kasih. Berarti bahwa mengurangi jejak virtual dari proses di lingkungan dengan memori terbatas (RAM dan swap) dapat memecahkan masalah tidak mampu melakukan fork.fork
gagal dengan pesan kesalahan yang menunjukkan memori tidak mencukupi. Kemudian mengurangi penggunaan proses memori virtual sebelum forking bisa membantu.Jangan khawatir, itu membuat salinan malas (copy-on-write). Alamat memori virtual dari kedua proses menunjuk ke halaman yang sama pada awalnya, tetapi ketika proses bercabang mencoba untuk memodifikasinya, sebenarnya membuat salinan fisik halaman (sejak saat itu, halaman itu berada di dua tempat di RAM Anda).
Hati-hati, tidak ada jejak memori yang dilaporkan yang benar-benar memberi tahu Anda berapa banyak RAM yang digunakan proses. Karena pertukaran, berbagi memori, dan masalah lain dengan memori virtual, mustahil untuk mengetahui dengan pasti. Beberapa bagian dari ruang memori adalah shared library (tempat menghitungnya?), Sebagian merujuk pada memori non-RAM (perangkat perangkat keras lainnya), ada yang saat ini ditukar, ada yang belum disalin (copy-on-write) dan begitu seterusnya. Baca ini:
https://lwn.net/Articles/642202/
sumber
Ada pengaturan kernel
/ proc / sys / vm / overcommit_memory
Kutipan dari artikel luar biasa :
Ini berlaku untuk garpu dan juga malloc biasa. Yaitu jika Anda menetapkan ke 0, garpu akan disalin saat menulis. Salin saat menulis berarti bahwa sekali aplikasi bercabang dua, maka salinan itu akan berbagi halaman memori menggunakan anak atau asli mulai mengubah memori.
Dalam sebagian besar distribusi, saya tahu overcommit adalah 0. Tetapi jika Anda mengaturnya menjadi 2, semua halaman memori akan sepenuhnya didukung oleh memori nyata dan dalam beberapa kasus di bawah tekanan memori tinggi akan lebih stabil, tetapi beberapa program (saya menghadapi gitk) yang mengandalkan pada overcommits akan gagal.
sumber