4

私は「make -j8」を使用してビルドを高速化することの大ファンです (もちろん、8 を現在のコンピューターのコア数に置き換えます)。通常、N 個のファイルを並列にコンパイルすると、コンパイル時間を短縮するのに非常に効果的です。 . コンパイル プロセスの一部がコンピュータの RAM を使い果たすほど十分にメモリを集中的に使用する場合を除き、その場合、さまざまなコンパイル プロセスがすべて相互にスワップアウトし始め、すべてがゆっくりと遅くなり、並列処理を行う目的が無効になります。最初にコンパイルします。

さて、この問題の明らかな解決策は「RAM を追加購入する」ことですが、私はそれを行うには安すぎるので、「make」(または同等のもの) を実装することが可能であるべきだと思います。システムの使用可能な RAM を監視し、RAM がほぼゼロになり、システムがスワッピングを開始すると、make は自動的に介入し、作成したコンパイル プロセスの 1 つまたは複数に SIGSTOP を送信します。これにより、停止したプロセスを完全にスワップアウトできるため、他のプロセスはそれ以上スワップせずにコンパイルを終了できます。次に、他のプロセスが終了し、より多くの RAM が使用可能になると、「make」プロセスは一時停止されたプロセスに SIGCONT を送信し、プロセスが独自の処理を再開できるようにします。そうすれば、ほとんどのスワッピングが回避され、すべてのコアで安全にコンパイルできます。

このロジックを実装するプログラムを知っている人はいますか? または逆に、そのようなプログラムが機能しない/機能しない正当な理由はありますか?

4

1 に答える 1

0

GNU Makeには、次の-lオプションがあります。

   -l [load], --load-average[=load]
        Specifies  that  no  new jobs (commands) should be started if there are others jobs running and the load average is at least load (a floating-
        point number).  With no argument, removes a previous load limit.

ただし、これには標準的なオプションはないと思います。

于 2011-04-11T01:36:25.953 に答える