GNU/Linux >> Belajar Linux >  >> Linux

Secara khusus, bagaimana fork() menangani memori yang dialokasikan secara dinamis dari malloc() di Linux?

Setiap halaman yang dialokasikan untuk proses (baik itu halaman memori virtual yang memiliki tumpukan atau heap) disalin untuk proses bercabang agar dapat mengaksesnya.

Sebenarnya, itu tidak disalin sejak awal, itu diatur ke Copy-on-Write, artinya begitu salah satu proses (induk atau anak) mencoba memodifikasi halaman itu disalin sehingga tidak akan merugikan satu sama lain, dan masih memiliki semua data dari titik fork() dapat diakses oleh mereka.

Sebagai contoh, halaman kode, halaman-halaman kode yang sebenarnya dapat dieksekusi dipetakan ke dalam memori, biasanya hanya-baca dan dengan demikian digunakan kembali di antara semua proses bercabang - mereka tidak akan disalin lagi, karena tidak ada yang menulis di sana, hanya membaca, dan sebagainya copy-on-write tidak akan pernah dibutuhkan.

Informasi selengkapnya tersedia di sini dan di sini.


Setelah percabangan, anak benar-benar independen dari induknya, tetapi dapat mewarisi hal-hal tertentu yang merupakan salinan dari induknya. Dalam kasus tumpukan, anak secara konseptual akan memiliki salinan tumpukan orang tua pada saat percabangan. Namun, modifikasi kepala di ruang alamat anak hanya akan mengubah salinan anak (mis. melalui copy-on-write).

Adapun dokumentasinya:Saya perhatikan bahwa dokumentasi biasanya akan menyatakan bahwa semuanya disalin, kecuali untuk bla, bla bla.


Jawaban singkatnya adalah 'dirty on write' - jawaban yang lebih panjang adalah .. jauh lebih lama.

Tetapi untuk semua maksud dan tujuan - model kerja yang pada tingkat C aman untuk diasumsikan adalah bahwa tepat setelah fork() kedua proses tersebut benar-benar identik - yaitu anak mendapatkan salinan persis 100% - (tetapi untuk sedikit bit di sekitar nilai pengembalian fork()) - dan kemudian mulai menyimpang saat masing-masing pihak memodifikasi memori, tumpukan, dan tumpukannya.

Jadi kesimpulan Anda sedikit melenceng - anak memulai dengan data yang sama seperti yang disalin orang tua ke ruangnya sendiri - lalu memodifikasinya - dan melihatnya sebagai dimodifikasi - sementara orang tua melanjutkan dengan salinannya sendiri.

Pada kenyataannya hal-hal sedikit lebih rumit - karena mencoba menghindari salinan lengkap dengan melakukan sesuatu yang kotor; menghindari untuk menyalin sampai harus.

Dw.


Linux
  1. cara memeriksa ukuran tumpukan yang dialokasikan untuk jvm oleh linux

  2. Bagaimana cara mengakses alamat fisik dari ruang pengguna di Linux?

  3. Bagaimana saya bisa memesan satu blok memori dari kernel Linux?

  1. Cara Menghapus Cache Memori di Linux

  2. Bagaimana cara Linux membedakan utas dari proses anak?

  3. Bagaimana cara sepenuhnya menonaktifkan tumpukan IPv4 secara dinamis dari Linux?

  1. Linux – Bagaimana Cara Menjalankan Bootloader Dari Linux?

  2. Bagaimana cara kerja copy_from_user dari kernel Linux secara internal?

  3. Bagaimana copy-on-write di fork() menangani banyak fork?