GNU/Linux >> Belajar Linux >  >> Linux

Ketika proses bercabang, apakah memori virtual atau residennya disalin?

Dalam sistem modern tidak ada memori yang benar-benar disalin hanya karena pemanggilan sistem fork digunakan. Itu semua ditandai hanya baca di tabel halaman sehingga pada upaya pertama untuk menulis jebakan ke dalam kode kernel akan terjadi. Hanya sekali upaya proses pertama untuk menulis penyalinan akan terjadi.

Ini dikenal sebagai copy-on-write.

Namun mungkin perlu untuk melacak ruang alamat yang dikomit juga. Jika tidak ada memori atau swap yang tersedia pada saat kernel harus menyalin halaman, itu harus mematikan beberapa proses untuk membebaskan memori. Ini tidak selalu diinginkan, jadi dimungkinkan untuk melacak berapa banyak memori yang telah dikomit oleh kernel.

Jika kernel akan melakukan lebih dari memori + swap yang tersedia, itu dapat memberikan kode kesalahan saat mencoba memanggil fork. Jika tersedia cukup, kernel akan berkomitmen pada ukuran virtual penuh induk untuk kedua proses setelah fork.


Jangan khawatir, itu membuat salinan malas (copy-on-write). Alamat memori virtual dari kedua proses mengarah ke halaman yang sama pada awalnya, tetapi ketika proses bercabang mencoba untuk memodifikasinya, itu benar-benar membuat salinan fisik dari halaman tersebut (sejak saat itu, halaman tersebut 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 tersebut. Karena pertukaran, berbagi memori, dan masalah lain dengan memori virtual, tidak mungkin untuk mengetahui dengan pasti. Beberapa bagian dari ruang memori adalah pustaka bersama (di mana menghitungnya?), beberapa mengacu pada memori non-RAM (perangkat keras lainnya), beberapa sedang ditukar, beberapa belum disalin (copy-on-write) dan segera. Baca ini:

https://lwn.net/Articles/642202/


Ada pengaturan kernel

/proc/sys/vm/overcommit_memory

Kutipan dari artikel bagus:

Since 2.5.30 the values are: 0 (default): as before: guess about how much  
overcommitment is reasonable, 1: never refuse any malloc(), 2: be precise 
about the overcommit - never commit a virtual address space larger than swap 
space plus a fraction overcommit_ratio of the physical memory. Here 
/proc/sys/vm/overcommit_ratio (by default 50) is another user-settable 
parameter. It is possible to set overcommit_ratio to values larger than 100. 
(See also Documentation/vm/overcommit-accounting.)

Ini berlaku untuk garpu serta malloc biasa. Yaitu. jika Anda menyetelnya ke 0, garpu akan disalin saat ditulis. Salin saat menulis berarti bahwa setelah aplikasi bercabang, kedua salinan itu akan berbagi halaman memori menggunakan turunan atau yang asli mulai mengubah memori.

Di sebagian besar distribusi yang saya tahu overcommit adalah 0. Tetapi jika Anda menyetelnya ke 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.


Linux
  1. Proses Induk Baru Ketika Proses Induk Meninggal?

  2. Penggunaan memori dari proses saat ini di C

  3. Bagaimana cara hibernasi suatu proses di Linux dengan menyimpan memorinya ke disk dan mengembalikannya nanti?

  1. malloc mengembalikan memori atau ruang alamat virtual

  2. Bagaimana cara memulai proses dalam grup prosesnya sendiri?

  3. Menumbuhkan penggunaan memori residen (RSS) dari Proses Java

  1. Apa yang harus dilakukan ketika Ctrl + C tidak dapat menghentikan proses?

  2. Kapan saya tidak boleh membunuh -9 proses?

  3. Bagaimana penggunaan memori dilaporkan di Linux?