1

起動時に大量のデータをロードするプログラムがあります。これにはかなり長い時間がかかるため、Valgrind( memcheck) / DrMemoryの実行時にオーバーヘッドが発生します。そのため、異なる引数でプログラムを数回呼び出すと、かなりの時間がかかります

私の考えはfork()、データ読み込みフェーズの直後に使用して、子を Valgrind/DrMemory に渡すことです。読み込みフェーズが Valgrind/DrMemory の下で実行される場合でも、オーバーヘッドは 1 回だけ発生し、すべてのforked 子プロセスはそこからプリロードされたデータを使用できるはずです。

プログラムの状態を記録して汚染されていないと宣言し、後で Valgrind ( memcheck) または DrMemory でその状態を復元することは可能ですか?

注:私は unixoid プラットフォームにのみ関心があります。Linux だけに限定しても問題ありません。

4

1 に答える 1

1

私の考えは、データ読み込みフェーズの直後に fork() を使用し、子を Valgring/DrMemory に渡すことです。

それは多くの理由で実現不可能です。たとえば、glibcの結果を内部変数にキャッシュsyscall(SYS_getpid)し、同じ pid (実際の pid) を持っていると信じている複数のプロセスを持つことは!=、災害の明らかなレシピです。

とはいえ、初期化後に子プロセスを実行valgrind --trace-children=yesしてからforking することを妨げるものは何ですか? 各子プロセスは、次のようなことを実行できます。

char buf[PATH_MAX];
sprintf(buf, "/tmp/parameters-for-%d", getpid());
while (true) {
  if (FILE *fp = fopen(buf, "r")) {
    // read parameters for this child, and exercise appropriate code paths
    return run_with_parameters(fp);
  }
  sleep(1);
}

子を実行したい場合はN、単にecho "foo bar baz" > /tmp/parameters-for-N完了するのを待ちます。他のすべての子は、あなたがそれらを使用する準備が整うまで、かなり忙しくなります。

于 2013-04-15T04:15:23.210 に答える