Yetersiz Bellek koşullarını ele alıyor musunuz?


Yanıtlar:


4

Bir çarpışmadan kaçınmak gibi OOM'dan kaçınırdım.

Aynı anda çok fazla iş yapmaktan (ve çok fazla bellek ayırmaktan) kaçının. Verileri diskte tutun, işletim sistemi disk önbelleğine güvenin ve bellek eşlemeli G / Ç'den mümkün olduğunca yararlanın ve aynı anda verilerin yalnızca küçük bir kısmında çalışın. Büyük miktarda verilerin çevrimiçi olması gerekiyorsa (düşük gecikme ile sunulur), tüm büyük arama motoru şirketlerinin yaptığı gibi bunları birkaç makinede bellekte tutun. Veya bir SSD satın alın.


Görünüşe göre bu en mantıklı.
mbq

2
OOM'un zarif bir şekilde nasıl ele alınacağı konusunda büyük bir tartışma vardı (RAII, istisna güvenliği, falan ...) ama bir kez çok iş parçacıklı bir modülde (bazıları üçüncü taraflardan) çok parçalı bir sistemde , iş parçacığınız olmasa bile Her iş parçacığının bir OOM göreceği talihsiz bir an var . Tek bir kişi bile devam etmeye karar verdiyse, görgü tanığı dışında hiçbir şey yapamazsınız.
rwong

13

Bu soruyu cevaplayan çoğu insan muhtemelen 0 döndüren mallocun çok gerçek bir olasılık olduğu gömülü sistemler üzerinde hiç çalışmadı. Şu anda üzerinde çalıştığım bir sistemde toplam 4.25K bayt RAM var (bu 4352 bayt). Ben yığın için 64 bayt ayırıyorum ve şu anda 1600 bayt yığın var. Sadece dün bir yığın yürüyüş rutin hata ayıklama böylece bellek tahsisi ve boşaltma takip edebilirsiniz. Öbek yürüyüşü, bir seri bağlantı noktasına çıktı vermek için statik olarak ayrılmış küçük (30 bayt) bir tampon kullanır. Yayın sürümü için kapatılacaktır.

Bu bir tüketici ürünü olduğundan, ürün piyasaya sürüldükten sonra hafızası tükenmemelidir. Eminim geliştirme sırasında olacak. Her durumda, yapabileceğim tek şey hoparlörden birkaç kez bip sesi çıkarmak ve yeniden başlatmaya zorlamak.


2
Küçük bir alanın içine işlevsellikler yerleştirmek inanılmaz ... bonsai gibi bir sanat şekli
rwong

6
Gömülü sistemlerle ilgili birçok proje, dinamik bellek tahsisini yasaklamaktadır. Tek OOM durumu yığın taşması olarak kalır.
mouviciel

Haklısınız, ancak özellikle ilk cümlenizde: bunların çoğu, şans eseri çoğu geliştirici için geçerli değildir.
Konrad Rudolph

4

Oldukça dürüst olmak gerekirse, yaptığım tüm projelerde (henüz hiçbir yerde çalışmadığımı aklınızda bulundurun), bunun olabileceğini hiç düşünmedim ve bu nedenle programlarımın çok hızlı bir şekilde öleceğini tahmin ediyorum.

Ayrıca, bir OOM'nin işlenmesi, hata mesajını görüntülemek veya her şeyi kaydetmek için kaynakları önceden tahsis etmenizi gerektirir; bu da biraz rahatsız edici olabilir.

Bugünlerde fıstıktan daha ucuza mal olan haftanın, sık sık olması gereken bir şey olmadığını hissediyorum. Korumalı hafızanın şafağında ve daha önce, belki de bu bir endişeydi, ama şimdi? Şimdiye kadar gördüğüm tek OOM hataları hata kodundan idi.


Sürecin halihazırda sahip olduğu hafızanın bir kısmını geri almayı düşünebilir ve hayatta kalmayı ve kurtarmayı (yararlı bir şey attıysanız zor olanı) veya kurtarmaya çalışan veri + kalıntılar olarak hayatta kalmayı deneyebilirim.
mbq

2

Malloc dönüş kodlarını kontrol etmek her durumda anlamsızdır.

Modern işletim sistemleri belleği aşar: İşlemlere gerçekte olduğundan daha fazla bellek verir. İşleminize verilen bellek sanaldır, tümü tek bir sıfırlanmış sayfaya eşlenmiştir.

Hafızaya, işlemleriniz için fiziksel, benzersiz bir sayfa tahsis edilene kadar değil. Bu ayırma başarısız olursa, çekirdek belleği bulmak için bir işlemi (belki sizinkini!) Sonlandıracaktır. Bu noktada artık yapabileceğiniz bir şey yok.


Süre içinde uzun uyku ile döngü içine almak ve muhtemelen süreç OOM katil hayatta kalmak eğer kurtarmak için bir fikrim vardı. 0 adresi kullanma girişimi nedeniyle süreçlerin sonlandırıldığına dair bir izlenim edindim, ancak sağlam bir test yapmadım.
mbq

OOM katili ile başa çıkmak için özel bir şey yapmanız gerekmez. İşleminiz tetiklediyse ancak seçilmediyse asla bilemez. Her şey yeterli bellek varmış gibi çalışacaktır. Öte yandan süreciniz seçilirse, feshedilir ve bu konuda yapabileceğiniz hiçbir şey yoktur.
Kristof Provost

Ama OOM'un bir miktar bellek boşaltmasını bekleyip tekrar tahsis etmeye ve devam etmeye çalışabilirim. Malloc / new'in bunun olmasını beklemediğine dair bir izlenimim var.
mbq

Hayır, yapamazsınız. Tahsisatınız her zaman başarılı olacaktır. İstediğiniz tüm sanal belleği alacaksınız. Dokunana kadar fiziksel bellek tahsis edilmez. Ayrılmamış bir sayfaya dokunduğunuzda işleminiz askıya alınır. Çekirdek daha fazla bellek arayacak ve bu da daha fazla bellek için bir işlemi öldürmesine neden olabilir. Bu başarılı olursa (ve sizinkini öldürmezse!), Sayfa ayrılır ve işleminiz devam eder. Sürecinizin bunun olduğunu söylemenin bir yolu yok.
Kristof Provost

2
Eminim pencereler asla fazla işlemez. RAM'den daha fazlasını yapabilir, ancak RAM + takas dosyasından daha fazlasını yapamaz.
CodesInChaos

2

Gömülü sistemler, gerçek zamanlı sistemler veya arızaların hayatlara veya milyarlarca dolara mal olabileceği kadar kritik olan sistemler için geliştirmediğiniz sürece ... O zaman muhtemelen bellek dışı durumlar hakkında endişelenmenize finansal olarak değmez.

Çoğu durumda, bellek yetersiz kaldığında yapılabilecek çok az şey vardır, çünkü yeni nesneler oluşturmak veya bir şeyler yapabilecek görevleri yapmak için bellek yoktur. Uygulamadan elde ettiğiniz faydaya karşı OOM işleme maliyetini tartmak zorundasınız.


Gerçek zamanlı sistemlerin bir arıza hatası hakkında diğer sistemlerden daha fazla kontrol etmesine gerek yoktur.
zneak

@zneak - Untrue. Gerçek zamanlı sistemler tahmin edilebilir olmalı ve özellikle planlamıyorsanız bellek yetersiz tahmin edilebilir.
Erik Funkenbusch

OOM'a çarptıktan sonra daha ne yapacaksınız?
zneak

Boş bellek, iptal işlemleri, vb. Böylece, bellek çok daha kolay bitebilir.
Erik Funkenbusch

Kaçınılmaz olarak bir OOM hatasına yol açacak belirli bir kod yolu göz önüne alındığında, çökmenin hafızayı boşaltmak ve işlemleri iptal etmekten daha az belirleyici bir yaklaşım olduğunu görmüyorum.
zneak

1

Her zaman hatayı kontrol ederdim. Bir şey bir hata koşulu döndürürse, programınız tarafından ele alınmalıdır. "Bellek yetersiz, gitmeliyim!" Yazan bir mesaj olsa bile, "Erişim ihlali", "çekirdek boşaltıldı" ya da her neyse. Biri ele aldığınız bir hata koşulu, diğeri ise bir hatadır. Ve kullanıcı bunu da algılar.

Özel durumunuz için, işlemi geri almayı, hata noktasına ulaşana kadar ayırdığınız kaynakları serbest bırakmayı, hatayı bildirmeyi ve yürütmeyi sürdürmeyi deneyebilirsiniz (belki uygulamadan çıkmaya çalıştığınızda, hemen çıkma seçeneği). Bu şekilde, kullanıcı ne yapacağına karar verebilir veya etrafta dolaşarak, dosyaları kapatarak vb. Bir miktar bellek boşaltmaya çalışabilir. Tabii ki, durumu nasıl ele alabileceğiniz, programınıza oldukça bağımlıdır - etkileşimli olmak, muhtemelen hatayı günlüğe kaydetmeli ve çıkmalı veya devam etmelidir.

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.