Bir işlem çatalları sanal veya yerleşik belleği ne zaman kopyalanır?


12

Linux'ta yeni işlemler yapmanın standart yolu, üst sürecin bellek ayak izinin kopyalanması ve çağrılıncaya kadar alt sürecin ortamı haline gelmesidir execv.

Hangi bellek ayak izinden bahsediyoruz, sanal (süreç ne talep ediyor) veya yerleşik olan (gerçekte ne kullanılıyor)?

Motivasyon: Sınırlı takas alanı olan bir cihazım ve sanal ve yerleşik bellek ayak izi arasında büyük fark bulunan bir uygulamam var. Uygulama, bellek yetersizliği nedeniyle çatallanamıyor ve sanal ayak izi boyutunu azaltmaya çalışmanın yardımcı olup olmayacağını görmek istiyor.

Yanıtlar:


12

Modern sistemlerde, sadece bir çatal sistemi çağrısı kullanıldığı için belleğin hiçbiri kopyalanmaz. Her şey sadece sayfa tablosunda okunmuş olarak işaretlenir, böylece ilk kez çekirdek koduna bir tuzak yazma girişimi gerçekleşir. Kopyalama yalnızca ilk işlem yazma girişimi gerçekleştiğinde gerçekleşir.

Bu yazma üzerine kopyalama olarak bilinir.

Ancak, taahhüt edilen adres alanını da takip etmek gerekebilir. Çekirdek bir sayfayı kopyalamak zorunda olduğu sırada bellek veya takas yoksa, belleği boşaltmak için bazı işlemleri öldürmesi gerekir. Bu her zaman arzu edilmez, bu nedenle çekirdeğin ne kadar bellek harcadığını takip etmek mümkündür.

Çekirdek, kullanılabilir bellek + takasından daha fazlasını taahhüt ederse, çatal çağırma girişiminde bir hata kodu verebilir. Yeterli varsa, çekirdek çataldan sonra her iki işlem için de ebeveynin tam sanal boyutuna bağlı olacaktır.


1
If enough is available the kernel will commit to the full virtual size of the parent for both processes after the fork.Evet teşekkür ederim. Yani, sınırlı belleğe (RAM ve takas) sahip bir ortamda sürecin sanal ayak izinin azaltılması, çatallanamama sorununu çözebilir.
TheMeaningfulEngineer

1
@Alan Evet. Eğer forkyeterli bellek işaret eden bir hata iletisi ile başarısız olur. Daha sonra çatallamadan önce işlemin sanal bellek kullanımını azaltmak yardımcı olabilir.
kasperd

5

Endişelenmeyin, tembel bir kopya oluşturur (yazma üzerine kopyalama). Her iki işlemin sanal bellek adresleri başlangıçta aynı sayfaları işaret eder, ancak çatallı işlem bunu değiştirmeye çalıştığında, aslında sayfanın fiziksel bir kopyasını oluşturur (o andan itibaren, o sayfa RAM'inizde iki yerde bulunur).

Dikkat edin, bildirilen bellek ayak izlerinden hiçbiri size işlemin ne kadar RAM kullandığını söylemez. Takas, bellek paylaşımı ve sanal bellekle ilgili diğer sorunlar nedeniyle kesin olarak bilmek imkansızdır. Bellek alanının bazı bölümleri paylaşılan kütüphanelerdir (nerede sayılır?), Bazıları RAM olmayan belleğe (diğer donanım aygıtları) atıfta bulunur, bazıları şu anda değiştirilir, bazıları henüz kopyalanmaz (yazma üzerine kopyalama) ve yakında. Oku bunu:

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


5

Çekirdek ayarı var

/ Proc / sys / vm / overcommit_memory

Mükemmel makaleden alıntı :

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.)

Bu, çatallar ve normal malloc için geçerlidir. Yani 0 olarak ayarlarsanız, çatal yazma sırasında kopyalanır. Yazarken kopyala, uygulama bir kez çatallandığında, her iki kopyanın da alt sayfalardan bellek sayfalarını paylaşacağı veya orijinalin belleği değiştirmeye başladığı anlamına gelir.

Çoğu dağıtımda aşırı işlem 0 olduğunu biliyorum. Ancak 2'ye ayarlarsanız, tüm bellek sayfaları gerçek bellekle tamamen desteklenir ve bazı durumlarda yüksek bellek basıncı altında daha kararlı olur, ancak bazı programlar (Gitk ile karşılaştım) overcommits başarısız olur.

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.