Çatal üzerine yazma üzerine kopya () çoklu çatal nasıl işler?


23

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 çıkar fork(). Ç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ü execonu ç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 ?


Wikipedia bu durumda haklı, sadece daha yüksek seviyede.
Didi Kohen

1
Evet, üzerine yazma kopyalama tembel kopyalama, alt işlem yazmaya çalıştığınızda sayfayı kopyala. Temel olarak, bir çataldan sonra, neredeyse çocuğun hafızası ebeveynle paylaşılır. Ancak, yapılan işlemlerden herhangi birinden önce, her çocuk işleminde, ebeveynin veya yeni tahsisattan değiştirilen bazı özel bellekler vardır. Bu, herhangi bir işlem yapmadan bile, çatallanan çocuğun işleminin özel bir hafızası olduğu anlamına gelir. Biz bunu doğrulayabilir pmap -XX PIDya cat /proc/PID/smap.
23

İlgili - "Orijinal sayfa sonradan yazılabilir olarak işaretlenir." İşte yazmayı denemeyen diğer süreç?
Adil,

Bu çok hoş. Bunu anaokullarında öğretmeye başlayalım
ed22

Yanıtlar:


18

Özel bir şey olmaz. Tüm işlemler aynı sayfa kümesini paylaşır ve her biri bir sayfayı değiştirmek istediğinde kendi özel kopyasını alır.


Sağ. Mesele şu ki, özel, alt paylaşılan sayfaya yazmaya çalışırsa kopyalama işi olan alt süreç. Ne doğru yapılırsa, ne ebeveyn ne de diğer çocukların değişimi bilmesi gerekmez.
Charles Stewart

9
Çocuk süreci o kadar da özel değil. Hem çocuk hem de ebeveyn işlemleri, çataldan sonra salt okunur aynı sayfa kümesine sahiptir. Bu sayfalar söz konusu olduğunda, sayfa işleme simetriktir.
jlliagre

3

Fork () davranışı * nix sisteminin bir MMU'ya sahip olup olmamasına bağlıdır. MMU dışı bir sistemde (PDP-11'lerin başlarında olduğu gibi) fork () sistemi çağrısı, her çocuğun ebeveyn hafızasının tümünü kopyaladı. MMU tabanlı bir * nix sisteminde, çekirdek tüm yığınlanmamış sayfaları R / O olarak işaretler ve bunları üst ve alt arasında paylaşır. Sonra, her iki işlem de herhangi bir sayfaya yazdığında, MMU girişimi yakalar, çekirdek daha sonra yazdırılabilir bir sayfa atar ve MMU sayfa tablolarını şimdi yazdırılabilir sayfaya işaret edecek şekilde günceller. Bu Yazma Kopyalama davranışı, hızlandırmayı sağlar, çünkü başlangıçta her alt işlem için yalnızca özel bir yığının ayrılması ve klonlanması gerekir.

Her çatal () çağrısı arasında bazı ana kodlar uygularsanız, o zaman ortaya çıkan alt işlemler ana tarafından değiştirilen sayfalara göre değişir. Öte yandan, eğer ebeveyn sadece bir döngü halinde çoklu çatal () çağrıları yaparsa, çocuk işlemleri neredeyse aynı olacaktır. Yerel bir döngü değişkeni kullanılıyorsa, bu her çocuğun yığını içinde farklı olacaktır.


0

Sistem bir çatal hazırladığında, genellikle (bu uygulamaya bağlı olabilir) sayfaları salt okunur olarak işaretler ve ana süreci bu sayfaların yöneticisi olarak işaretler.
Bu sayfalara yazmaya çalışırken, bir sayfa hatası meydana gelir ve işletim sistemi tüm sayfaların listesini veya yalnızca değiştirilenleri (tekrar uygulamaya bağlı olarak) kopyalar, böylece yazma işleminin yazılabilir bir kopyası olur.
Aynı işlemden çatallanmış birden fazla işlem olduğunda, "ana" işlem belleğine yazdığında, diğer işlemler eşdeğer sayfalarını kopyalar.


bunu hangi sistem yapar? linux yazma üzerine bir uygulama kullanıyor
brauliobo

Yazma kopyası böyle çalışır ...
Didi Kohen

3
@DavidKohen Bu, üzerine yazılan kopyaların hiç duymadığım bir sürümünde çalışmaz. "Master" işlemi yok. Herhangi bir tek işlem paylaşılan sayfaları yazarsa, diğer tüm işlemler paylaşmaya devam ederken kopyası özel bir numaraya gönderilir.
Celada

1
Bence David Kohen bir noktada haklı. Bu bir kopyasını üzerinde yazma uygulamak için bir yol. Temel nokta, bu işaretlemeyle, o sayfaya yazmanın, daha sonra uygun eylemi gerçekleştirecek, yani yazma üzerine kopyalayacak bir sayfa hata işleyicisini tetikleyeceği şeklinde olacaktır. Maalesef, bu ayrıntı (sisteme özgü olacaktır) çoğunlukla soru ile ilgili değildir. CoW'un iki boyutu olduğunu unutmayın: süreç tarafından görülebilen ve çekirdeğin bunu nasıl uygulayabileceği.
0xC0000022L
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.