お気に入りの言語でコードを記述し、Windows タスク マネージャーが CPU 使用率の履歴で正弦波を表すようにします。
これは Microsoft China の技術面接クイズです。いい質問だと思います。特に、候補者が解決策をどのように理解し、理解しているかを知ることは価値があります。
編集:マルチコア(CPU)のケースが関係している可能性がある場合、それは良い点です。
お気に入りの言語でコードを記述し、Windows タスク マネージャーが CPU 使用率の履歴で正弦波を表すようにします。
これは Microsoft China の技術面接クイズです。いい質問だと思います。特に、候補者が解決策をどのように理解し、理解しているかを知ることは価値があります。
編集:マルチコア(CPU)のケースが関係している可能性がある場合、それは良い点です。
Windows のスレッド タイム スライスは 40 ミリ秒 (iirc) であるため、100% マークとして使用するのに適した数値である可能性があります。
unsigned const TIME_SLICE = 40;
float const PI = 3.14159265358979323846f;
while(true)
{
for(unsigned x=0; x!=360; ++x)
{
float t = sin(static_cast<float>(x)/180*PI)*0.5f + 0.5f;
DWORD busy_time = static_cast<DWORD>(t*TIME_SLICE);
DWORD wait_start = GetTickCount();
while(GetTickCount() - wait_start < busy_time)
{
}
Sleep(TIME_SLICE - busy_time);
}
}
これにより、約 14 秒の期間が得られます。明らかに、これはシステムに他に重要な CPU 使用率がなく、単一の CPU でのみ実行していることを前提としています。これらはどちらも実際にはそれほど一般的ではありません。
これは、Pythonでのわずかに変更された@flodin のソリューションです。
#!/usr/bin/env python
import itertools, math, time, sys
time_period = float(sys.argv[1]) if len(sys.argv) > 1 else 30 # seconds
time_slice = float(sys.argv[2]) if len(sys.argv) > 2 else 0.04 # seconds
N = int(time_period / time_slice)
for i in itertools.cycle(range(N)):
busy_time = time_slice / 2 * (math.sin(2*math.pi*i/N) + 1)
t = time.perf_counter() + busy_time
while t > time.perf_counter():
pass
time.sleep(time_slice - busy_time);
time_period
CPU カーブは、パラメータを使用して微調整できtime_slice
ます。
わかりました、最初の答えとは異なる、おそらくより良い解決策があります。
CPU を操作しようとする代わりに、タスク マネージャー アプリにフックして、CPU の結果ではなく、必要なものを描画するように強制します。グラフなどをプロットするGDIオブジェクトを引き継ぐ
または、CPU % を取得するタスク マネージャーからの呼び出しをフックして、代わりに正弦の結果を返します。
現在、文字通り数百 (数千?) のスレッドが PC で実行されているため、CPU 使用率を可能な限り高速にポーリングすることしか考えられません。 、数字をかき回すだけの短いメソッドを起動します。それは少なくとも、必要に応じて典型的な低使用率を上げますが、何らかの方法で他のスレッドを制御し、優先度を下げるなどのことをせずにそれを下げる良い方法は考えられません.
このようなもの:
while(true)
{
for(int i=0;i<360;i++)
{
// some code to convert i into radians if needed
...
Thread.Sleep(Math.Sin(i)*something_that_makes_it_noticeable_number_of_ms+something_that_makes_it_non_negative)
// some work to make cpu busy, may be increased to bigger number to see the influence on the cpu.
for(j=0;j<100;j++);
}
}