2016-07-25 8 views
-1

私は非常にリソース集中型のコードを使用しています。そのため、複数のpthreadに分割することができます。私が推測していることは、そのプロセッサコア上の他のプロセスが非常に遅くなり、数秒の実行時間後にクラッシュするということです。リソース集約型マルチスレッドで他のプロセスを殺す

私は既にChromeタブ、Cinnamon DE、さらにはOS全体(カーネル?)のようなランダムなプロセスを強制終了することができました。

コード:(これは遅く、擬似コードやコメントを作成するにはあまりにも疲れました) - しかし、これは無差別なコードです。 CPU IPS。

できるだけ多くのパフォーマンスを維持しながら、これを修正する方法はありますか?

static unsigned int NTHREADS = std::thread::hardware_concurrency(); 
static int   THREAD_COMPLETE = -1; 
static std::string PASSWORD = ""; 
static std::string CHARS; 
static std::mutex  MUTEX; 

void *find_seq(void *arg_0) 
{ 
    unsigned int _arg_0 = *((unsigned int *) arg_0); 
    std::string *str_CURRENT = new std::string(" "); 

    while (true) 
    { 
    for (unsigned int loop_0 = _arg_0; loop_0 < CHARS.length() - 1; loop_0 += NTHREADS) 
    { 
     str_CURRENT->back() = CHARS[loop_0]; 

     if (*str_CURRENT == PASSWORD) 
     { 
     THREAD_COMPLETE = _arg_0; 
     return (void *) str_CURRENT; 
     } 
    } 

    str_CURRENT->back() = CHARS.back(); 

    for (int loop_1 = (str_CURRENT->length() - 1); loop_1 >= 0; loop_1--) 
    { 
     if (str_CURRENT->at(loop_1) == CHARS.back()) 
     { 
     if (loop_1 == 0) 
      str_CURRENT->assign(str_CURRENT->length() + 1, CHARS.front()); 
     else 
     { 
      str_CURRENT->at(loop_1) =  CHARS.front(); 
      str_CURRENT->at(loop_1 - 1) = CHARS[CHARS.find(str_CURRENT->at(loop_1 - 1)) + 1]; 
     } 
     } 
    } 
    }; 
} 
+2

あなたが記述の症状は、メモリやリソースリークに起因するメモリ不足の状態のものは[OOMキラー](HTTPSを呼び出し、あります – kfsone

+0

@kfsone可能性は高いと思われますが、アプリケーションは最大20MBを使用し、Valgrindは次のように報告します。失われた可能性があります:14ブロックの2,223バイト&&まだ到達可能:56バイト7ブロックでもちろん、修正しようとするリークがいくつかありますが、時にはValgrindが無意味なデータを提供することもあります。 – areuz

+1

hogs CPUが他のプロセスをクラッシュさせてはならないプロセス。それらは遅くなりますが、ハードウェアの不具合やカーネルのバグのためにクラッシュする可能性があります。 –

答えて

0

は別のシステム上でそれをしようとする彼の提案のためのあなたの答えと特にマシュー・フィッシャーいただきありがとうございます。私は安定していた(私は一年以上のためにそれを持っていた)、それは、この奇妙な振る舞いを解くと思った私のCPUのオーバークロックを引き戻すことにしましたいくつかの試行錯誤の後


。私は、このようなCPUを集中的に使い果たしたことはないと思う(私は推測している)。

Matthewが提案したように、THREAD_COMPLETE変数をwhile trueループで常時チェックするよりも、より良い方法を考え出す必要がありますが、その点をコメントで解決したいと考えています。

将来の訪問者のための完全な、更新されたコードはここにある:// WWW:pastebin.com/jbiYyKBu

1

Areuz、

あなたは完全なコードを投稿することができますか?問題はNTHREADSの値だと思う。私のUbuntuボックスでは、値は8に設定されています。これは/ proc/cpuinfoファイルのコア数です。私の箱にある8つの「ホット」スレッドをキックオフすると、CPUの100%がぶつかる。カーネルはそれ自身のクリティカルなプロセスのタイムスライスを行いますが、一般に他のすべてのプロセスはCPUを枯渇させます。

/etc/cpuinfoの最大プロセッサ値を調べて、少なくとも1つ下の値を調べてください。 CPUは私のボックスに0〜7の番号がついていますので、7は私の最大値になります。私のコアのうち4つがハイパースレッドなので、実際の最大値は3です。完全なCPUプロセスの場合、ハイパースレッディングは一般的には役に立ちません。

ボトムラインは、すべてのCPUを馬鹿にしないでください、システムを不安定にします。

--Matt

+0

私は3770K @ 4.8GHzのi7を持っています。それは8つのスレッドを持っています。明らかにパフォーマンスを向上させるためにすべてのスレッドを使用しようとしました。私は 'ストレス'コマンドのような何かが何もクラッシュせずにすべてのCPUを使用できるのはなぜかと思っています。 S.たとえ少数のスレッドを使用していても、私が述べたように、これらのスレッドで実行されているプロセスは、ほとんどの場合、時間の経過と共にクラッシュすることがあります。 完全なコードです。http://pastebin.com/jbiYyKBu – areuz

+0

「ストレス」のソースコードを見ることにしました。今はさらに混乱しています。一日中、CPU全体にストレスを与えることができるので、ある種の洗練されたコードを期待したり、しばらくの間スリープ状態にしたり、優先順位を下げたりしていました。しかし、そのコマンドでCPUに負荷をかける文字コードは、 'hogcpu(void) { while(1) sqrt(rand())です。 return 0; } ' – areuz

+0

うーん、喜びはありません。コードをローカルで問題なく実行しました。それは私の8つのコアを打ち切ったが、箱はまだ正常に機能していた。私は問題なく約20分間走った。 Ubuntu 14.04。あなたは別の箱で試すことができますか? AWSには無料のアカウントがあります。 メインのwhileループは、別のコアを使用してホットで実行されています。 pthread_joinは、スレッドが終了したかどうかを監視するために使用できます。スレッド(1) –

関連する問題