2

システム リソースをあまり消費しないように、1 つの CPU だけで実行したいプログラムがあります。問題は、使用可能なすべての CPU コアを自動的に使用する外部 DLL を呼び出すことです。外部 DLL のソース コードがありません。DLL が 1 つの CPU のみを使用するように制限するにはどうすればよいですか?

編集:助けてくれてありがとう、これは私が1つのCPU(Windows)に制限するために使用したコードです:

// Limit the process to only 1 thread so we don't chew up system resources
HANDLE ProcessHandle = GetCurrentProcess();
DWORD ProcessAffinityMask;
DWORD SystemAffinityMask;
if(GetProcessAffinityMask(ProcessHandle,&ProcessAffinityMask,&SystemAffinityMask)
    && SystemAffinityMask != 0)
{
    // Limit to 1 thread by masking all but 1 bit of the system affinity mask
    DWORD NewProcessAffinityMask = ((SystemAffinityMask-1) ^ SystemAffinityMask) & SystemAffinityMask;
    SetProcessAffinityMask(ProcessHandle,NewProcessAffinityMask);
}

編集:プロセスの優先度を設定するBrannonのアプローチは、プロセスがリソースを食い尽くさないようにするという、私が望むものに対してさらにうまく機能することがわかりました。そのコードは次のとおりです(Windows):

// Make the process low priority so we don't chew up system resources
HANDLE ProcessHandle = GetCurrentProcess();
SetPriorityClass(ProcessHandle,BELOW_NORMAL_PRIORITY_CLASS);
4

6 に答える 6

9

プログラムの CPU アフィニティを設定できます。Windows ではSetProcessAffinityMask関数を、Linux ではsched_setaffinityを試してください。

于 2009-02-07T07:35:12.090 に答える
5

プロセッサ アフィニティの設定は、間違ったアプローチです。OS にスケジューリングを処理させます。

マシンがアイドル状態の場合は、できるだけ多くのプロセッサを使用したいと考えています。そうしないと、理由もなく仕事が減ります。マシンがビジー状態の場合は、「空き」サイクルを利用して、他のプロセスに悪影響を与えないようにする必要があります。

Windows には、この機能が組み込まれています。これに対する適切な解決策は、プロセスの基本優先度を設定することです。

の詳細については、http://msdn.microsoft.com/en-us/library/ms686219( VS.85 ).aspxを参照してくださいSetPriorityClass()

コードを記述せずにこれをテストする場合は、タスク マネージャーを使用してプロセスの優先度を変更します。

于 2009-02-07T08:56:14.207 に答える
1

通常、dll はそれを呼び出すコードと同じスレッド/メモリ空間に存在します。DLL 自体を呼び出す行為は、スレッドを作成するべきではありません。DLL を呼び出すと、より多くのスレッドが作成されるように見える場合は、DLL 自体がそのコードのどこかにスレッドを作成していることを意味します。DLL のソース コードやドキュメントがない場合、それについてできることはあまりありません (DLL にその仕事をさせたい場合は、これについて行うべきことはあまりありません)。

アプリケーションの優先度をいじってみるとよいでしょう。優先度を低く設定すると、作成されるスレッドが変わらなくても、CPU 使用率が変わる可能性があります。しかし、あなたが本当に望むのは、この怪物のドキュメントを入手することであると思われます。一般に、コードがどのように機能するかを知らなければ、その機能を変更するためにできることはあまりありません。それを変えられる超天才はいない。

于 2009-02-07T07:39:10.977 に答える
0

これがどのプラットフォーム向けかは言いませんでした。ここではウィンドウを想定します。

子プロセスを作成し、ジョブ オブジェクトに関連付けます。次に、そのジョブ オブジェクトのプロセッサ アフィニティを設定して、使用可能な CPU コアを 1 つだけ含めることができます。子プロセスは、アフィニティ マスクをジョブ オブジェクトのプロセッサ アフィニティのサブセットではないものに変更できません。JOB_OBJECT_LIMIT_BREAKAWAY_OKさらに、ジョブに制限または拡張制限を設定しないように注意してください。そうしないとJOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK、子プロセスがジョブから抜け出すことができます。

さらに、ジョブの優先順位とスケジューリング クラスを設定できます。おそらく、低い CPU および/または IO 優先度レベルで子プロセスを作成するだけで十分でしょうか?

于 2009-02-07T08:06:02.263 に答える
0

えっと……どうして?真剣に、なぜそのような方法で追加のパフォーマンスを提供できるライブラリを制限するのでしょうか? 共有リソースなどにアクセスしようとしていますか? マルチスレッド ライブラリがこれを安全に処理できると考える人もいるでしょう。

あなたが言及していないことがない限り、マルチスレッドライブラリをシングルスレッドに制限しようとする正当な理由がわかりません。

于 2009-02-07T07:36:32.090 に答える
0

あなたのプログラムは 1 つのスレッドを使用していますが、外部 DLL に複数のスレッドを使用させたくありませんか? 外部 DLL の動作を制御することはあまりできませんが、次のようなアプローチが考えられます。

于 2009-02-07T07:36:52.353 に答える