CnPack Forum


 
Subject: 微软面试题,如何控制CPU占用率?
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6838
Posts 3591
点点分 6838
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2007-7-24 10:01  Profile | Blog | P.M. 
微软面试题,如何控制CPU占用率?

假使Windows中其他进程都不怎么占CPU,如何写一个程序,让CPU占用率保持在50%左右。
或者更复杂一点,如何定量控制CPU占用率。

附件里头一个图,是程序控制的显示正弦波的占用率曲线。


Image Attachment: [一个让] 4caedc7a020011qx.jpg (2007-7-24 10:01, 43.27 K)

Top
shenloqi
灌水处处长
Rank: 4



UID 34
Digest Posts 1
Credits 287
Posts 179
点点分 287
Reading Access 10
Registered 2003-3-15
Status Offline
Post at 2007-7-24 16:01  Profile | P.M. 
...一个不是方法的方法,在任务管理器的CPU占用的图上自己画图...
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6838
Posts 3591
点点分 6838
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2007-7-24 20:09  Profile | Blog | P.M. 
楼上的沈算你狠。
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6838
Posts 3591
点点分 6838
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2007-7-25 09:24  Profile | Blog | P.M. 
转贴stanleyxu在QQ群里头的思路。

stanleyxu(*)(38656530) 09:07:29
其实就是创建线程
双核就创建2个
然后呢,我规定,比如100毫秒内,20毫秒是sleep,80毫秒是processmessage
这样cpu占用大致保持在80
先通过这个思路实现一个线程,控制cpu占用,cpu值是个属性
然后你就可以写个什么sin函数,控制曲线,包括振幅,速度

program Project1;

{$APPTYPE CONSOLE}

uses
  Classes, SysUtils, Windows;

procedure ProcessMessages;
var
  MsgRec : TMsg;
begin
  while PeekMessage(MsgRec, 0 {FWindowHandle}, 0, 0, PM_REMOVE) do begin
     TranslateMessage(MsgRec);
     DispatchMessage(MsgRec)
  end;
end;

procedure Delay(MilliSecs: DWORD);
var
  T: DWORD;
begin
  T := GetTickCount;
  while GetTickCount - T < MilliSecs do
  begin
    // Any more precisely way?
    ProcessMessages;
  end;
end;

function GetNumberOfProcessors: Integer;
var
  SI: TSystemInfo;
begin
  GetSystemInfo(SI);
  Result := SI.dwNumberOfProcessors;
end;

type
  TCPUConsumerThread = class(TThread)
  public
    nRound: Extended;
    ExpectedCPUusage: Integer;
    function GetSleepDuration: DWORD;
    procedure Execute; override;
  end;

const
  DelayDuration = 56;
  TaskManRefreshRate = 100; //not less than 56 ms
var
  Working: Boolean;

function TCPUConsumerThread.GetSleepDuration: DWORD;
const
  Delta = Pi / 80;
begin
  ExpectedCPUusage := Round((Sin(nRound / 4) + 2){1-3} * 10);
  nRound := nRound + Delta;

  Result := TaskManRefreshRate * (100 - ExpectedCPUusage) div 100;
end;

procedure TCPUConsumerThread.Execute;
var
  SleepDurationOfThisRound: DWORD;
  I: Integer;
begin
  while Working do
  begin
    SleepDurationOfThisRound := GetSleepDuration;
    if TaskManRefreshRate > SleepDurationOfThisRound then
      Delay(TaskManRefreshRate - SleepDurationOfThisRound);
    if SleepDurationOfThisRound > 0 then
      Sleep(SleepDurationOfThisRound);
  end;
end;

var
  ACPUConsumerThread: TCPUConsumerThread;
  I: Integer;

begin
  Working := True;
  for I := 1 to GetNumberOfProcessors do
    with TCPUConsumerThread.Create(True) do
    begin
      FreeOnTerminate := True;
      ExpectedCPUusage := 20;
      Resume;
    end;

  WriteLn('Running... (press any key to abort)');
  ReadLn;
  Working := False;
  WriteLn('press any key to exit');
  ReadLn;
end.

stanleyxu(*)(38656530) 09:10:53
我的思路大致这样,现在振幅不高兴仔细研究了。谁有兴趣谁去继续研究
要让cpu占用到100,我用delay函数,具体实现还可以改,可能可以直接用什么cpu指令,强制占用cpu之类的?
因为delay里面用到GetTickCount,而这个函数的精度最低就是56毫秒,所以我硬性规定,每次占用cpu至少56毫秒。
因为时间再短,可能就误差很厉害了。
Top
stanleyxu2005
新警察
Rank: 1



UID 5617
Digest Posts 1
Credits 45
Posts 15
点点分 45
Reading Access 10
Registered 2007-2-11
Status Offline
Post at 2007-7-25 09:40  Profile | Site | Blog | P.M. 
我说的办法效果一般,只能粗略模拟顶楼效果。

[ 本帖最后由 stanleyxu2005 于 2007-7-25 09:44 编辑 ]


Image Attachment: [效果图] {60BFBE90-AD59-4E69-94A0-96D9BFF97C60}.JPG (2007-7-25 09:44, 82.71 K)





http://getgosurf.com/forum/
Top
jAmEs_
灌水部部长
Rank: 8Rank: 8



Medal No.1  
UID 886
Digest Posts 0
Credits 1134
Posts 600
点点分 1134
Reading Access 10
Registered 2005-6-5
Location 广东
Status Offline
Post at 2007-7-25 11:24  Profile | Blog | P.M. 


QUOTE:
原帖由 shenloqi 于 2007-7-24 16:01 发表
...一个不是方法的方法,在任务管理器的CPU占用的图上自己画图...

兄弟太有才了
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6838
Posts 3591
点点分 6838
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2007-7-25 17:10  Profile | Blog | P.M. 
转贴群里shenloqi的不bt的看法:

要占用CPU到指定的利用率,真正处理应该不会很容易,起码会遇到多核心和其他程序干扰的问题,只有在环境理想的情况下才可能通过程序控制,通过程序控制的最简单的方法就是分时间片的方法,先设定程序的优先级和CPU的相关性(SetProcessAffinityMask),如果有多个CPU则需要有多个线程,同时设置线程的相关性(SetThreadAffinityMask),然后把取CPU利用率的时间间隔细分,然后循环占用时间片。
Top
kendling (小冬)
高级版主
Rank: 8Rank: 8
MyvNet


Medal No.1  
UID 703
Digest Posts 5
Credits 978
Posts 580
点点分 978
Reading Access 101
Registered 2005-2-18
Location 广东
Status Offline
Post at 2007-7-27 13:40  Profile | Site | Blog | P.M.  | QQ | Yahoo!
这个问题有点挑战性。。。




小冬
http://MyvNet.com
Top
zzzl (早安的空气)
版主
Rank: 7Rank: 7Rank: 7



UID 590
Digest Posts 0
Credits 399
Posts 199
点点分 399
Reading Access 100
Registered 2004-11-29
Status Offline
Post at 2007-8-2 08:42  Profile | Blog | P.M.  | QQ
晕,参考开源软件boinc,精确控制cpu占用率
Top
zzzl (早安的空气)
版主
Rank: 7Rank: 7Rank: 7



UID 590
Digest Posts 0
Credits 399
Posts 199
点点分 399
Reading Access 100
Registered 2004-11-29
Status Offline
Post at 2007-8-2 22:15  Profile | Blog | P.M.  | QQ
。。。
谁能开发一个基于那个图的游戏
Top
Rainstorey
普通灌水员
Rank: 2
菜鸟


UID 977
Digest Posts 0
Credits 82
Posts 39
点点分 82
Reading Access 10
Registered 2005-8-8
Location 苏州
Status Offline
Post at 2007-8-3 11:04  Profile | Blog | P.M. 
硬盘内存读写有DMA,图形处理有GPU,所以最耗费CPU时间的应该是数值计算.这就是用算法能解决该问题的最佳方法.找出一算法来无限逼近正弦图形应该就可以了.当然运行前先设置主线程的优先级为实时来更好的控制CPU的时间片.




Top
 




All times are GMT++8, the time now is 2024-11-24 14:46

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.015192 second(s), 9 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP