malloc
0 veya yeni atış istisnası döndürdüğünde ne yaparsınız ? Sadece durdurun veya OOM koşulundan hayatta kalmaya çalışın / kullanıcının çalışmasını kurtarın?
malloc
0 veya yeni atış istisnası döndürdüğünde ne yaparsınız ? Sadece durdurun veya OOM koşulundan hayatta kalmaya çalışın / kullanıcının çalışmasını kurtarın?
Yanıtlar:
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.
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.
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.
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.
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.
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.