Wikipedia'ya göre (yanlış olabilir)
Bir fork () sistem çağrısı yapıldığında, ana işleme karşılık gelen tüm sayfaların bir kopyası yaratılır ve alt işlem için işletim sistemi tarafından ayrı bir hafıza konumuna yüklenir. Ancak bazı durumlarda buna gerek yoktur. Bir çocuğun bir "
exec
" sistem çağrısı yürütmesi durumunda (bu, bir C programının içinden çalıştırılabilir herhangi bir dosyayı yürütmek için kullanılır) veya bu programdan çok kısa bir süre sonra çıkarfork()
. Çocuğun yalnızca ana işlem için bir komut yürütmesi gerektiğinde, ana işlemin sayfalarını kopyalamaya gerek yoktur, çünküexec
onu çağıran işlemin çalıştırıldığı adres alanı yerine geçecektir.Bu gibi durumlarda, yazma üzerine kopya (COW) adı verilen bir teknik kullanılır. Bu teknikle, bir çatal oluştuğunda, ana sürecin sayfaları alt işlem için kopyalanmaz. Bunun yerine, sayfalar çocuk ve ana süreç arasında paylaşılır. Bir işlem (ebeveyn veya çocuk) bir sayfayı her değiştirdiğinde, değişikliği yapan bu işlem (ebeveyn veya çocuk) için yalnızca belirli bir sayfanın ayrı bir kopyası oluşturulur. Bu işlem, daha sonra tüm referanslarda paylaşılanlar yerine yeni kopyalanan sayfayı kullanacaktır. Diğer işlem (paylaşılan sayfayı değiştirmeyen), sayfanın orijinal kopyasını kullanmaya devam eder (artık paylaşılmamaktadır). Bu teknik, bazı işlemler yazarken sayfa kopyalandığından, kopyalanamaz.
İşlemlerden herhangi biri sayfaya yazmaya çalıştığında, sayfanın yeni bir kopyası tahsis edilir ve sayfa hatasını oluşturan işleme atanır. Orijinal sayfa daha sonra yazılabilir olarak işaretlendi.
Sorum şu: fork()
süreçlerden herhangi biri paylaşılan bir sayfaya yazma girişiminde bulunmadan önce defalarca aranırsa ne olur ?
pmap -XX PID
ya cat /proc/PID/smap
.