0

centOS で実行されるプログラムを作成しました。私の ram +swap メモリは 16 GB です。

 #include <iostream>
#include <list>
#include<cstdlib>
#include<new>
#include <exception>

using namespace std;
int main ()
{
  std::list<double> mylist;

  double i;
  try{
    for (double i=1; i<=250000000; ++i) mylist.push_back(i); 
   }
  catch (std::bad_exception& ba) {
        cout << "Allocation failure: " << ba.what() << endl;
    mylist.clear();
        exit(1);
   }
    mylist.clear();

//  std::cout << "mylist contains:";
//  for (it=mylist.begin(); it!=mylist.end(); ++it)
//    std::cout << ' ' << *it;
//  std::cout << '\n';

  return 0;
}

私の問題は、プログラムが実行されてRAM領域のメモリ割り当てを超えたときに、メモリ割り当てがスワップメモリ​​で行われることです。スワップ メモリがいっぱいになると、OS はプログラムを強制終了します。プログラムが使用可能なメモリをいっぱいにするため、OSによって強制終了されないようにするために、どのタイプの実行処理を使用する必要がありますか。

4

1 に答える 1

1

簡単な答えは、「十分なメモリがない場合に大量のメモリを使用するコードを記述しないでください」ですが、実際にコードに大量のメモリが必要な場合は、実際に実装するよりも書く方がはるかに簡単です。

あなたが見ている問題は、「メモリのオーバーコミット」と「OOM-killer」と呼ばれています。メモリのオーバーコミットは、アプリケーションが実際には存在しないメモリを要求するケースです。一部の乗客が(統計的に)現れないことを期待して、航空会社がフライトでいくつかの余分な座席を販売するのと少し似ています. 同様に、アプリケーション (または他のアプリケーション) がメモリを要求すると、OS は要求されたメモリのすべてを実際には必要としないと想定するため、実際に利用可能なメモリよりも多くのメモリを割り当てることができます。 .

ただし、場合によっては、システムが完全にメモリ不足になり、システムを存続させる唯一の方法 (システムをクラッシュさせて再起動するよりも適切な方法) は、一部のプロセスを強制終了することです。何を強制終了するかについていくつかの「ルール」があります。基本的には、最初に多くのメモリを使用しているプロセスを調べ、その中で最近最も成長しているプロセスを最初に強制終了します。プロセスはおそらくその基準を十分に満たしているため、強制終了されたプロセスである可能性が高く、大量のメモリを使用しているため、これ以上進む必要はありません。

これが起こらないようにするためにできることはあまりありません。OOM キラーなしでカーネルを再構成することもできますが、システムが「OOPS」して再起動する可能性があります。これは、より良い代替手段ではありません [実際にシステムをクラッシュさせようとしている場合を除きますが、実際にはそうではないと思います。それをしたい]。@Stefanが言うように、おそらく「実際の」問題とは異なる問題の解決策を求めているでしょう。つまり、私の答えはおそらくそれがあなたにとって役立つということです。

于 2013-05-03T10:58:42.510 に答える