Mac OS X Yosemite 10.10.5'te, 128 GB bellek tahsis etmesi ve kullanması gereken bir hesaplama yapmaya çalıştığımda (C ile yazılmış bir komut satırı programıdır), çekirdek işlemimi aşırı önyargı ile öldürür. Bu konsol günlüğü girdisi bir örneğe örnektir:
25/09/15 7: 08: 40.000 PM çekirdek [0]: düşük swap: öldürme pidesi 6202 (huffgrp)
Hesaplama 64 GB bellek ayırıp kullandığında iyi ve makul bir süre içinde çalışır. Mac bilgisayarımın sabit diskinde 32 GB RAM ve beaucoup alanı var. Bunu, 64 GB hesaplamanın da iyi çalıştığı, elbette daha uzun sürdüğü 8 GB RAM ile başka bir Mac'te denedim, ancak 128 GB hesaplaması çekirdek tarafından aynı şekilde öldürüldü.
Bu arada, malloc()
ne kadar yer istersem de asla hata döndürmez. Çekirdek, işlemi yalnızca bu bellek çok fazla işlem tarafından kullanıldığında öldürür ve bu da sabit sürücüye çok fazla değişimle sonuçlanır.
Yani 64 GB ile 128 GB arasında bir yerde gizli bir takas alanı sınırı var gibi görünüyor.
Benim sorum: Çekirdeği daha fazla takas alanına izin verecek şekilde nasıl yeniden yapılandırabilirim? Umut verici görünümlü bir dosya buldum /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
, ama orada gizli numarayı göremiyorum. Man sayfası dynamic_pager
, tüm yaptığı takas dosyalarının adını ve konumunu ayarlamak olduğunu söylüyor. Aynı man sayfasının, -S
oluşturulan swap dosyalarının boyutunu ayarlama seçeneğini belgeleyen daha eski bir sürümü var . Bunu denedim, 160 GB takas dosyaları istedim, ancak hiçbir etkisi olmadı. Takas dosyaları hala 1 GB'dı ve işlem hala çekirdek tarafından öldürüldü.
malloc
daha fazlasını yapabilmenizin nedeni, commit_limit çok yüksek (muhtemelen sonsuz) olmasıdır. Bu nedenle işletim sistemi sahip olmadığı belleği tahsis edecektir (bu işlemin kullanmayacağına bahse girer, işletim sistemi genellikle bu bahsi kazanır). Taahhüt sınırını bellek sınırı olarak ayarlamak isteyebilirsiniz, bu şekilde işlem erken başarısız olur.
malloc()
yaptığını biliyorum . Birisinin dönüş değerini kontrol etmediğimi düşünen biri hakkında olası yorumları saptırıyordum malloc()
. Bu arada, amacım daha önce başarısız olmak değil. Amacım başarılı olmak.