MS面试题:让CPU USEAGE 成正弦曲线, 对着改成了C#的

refeiner 2008-04-28 04:49:38
在网上看了答案,自己改了一下,结果不是很满意
class Win32
{

[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
public static extern int SetThreadAffinityMask(IntPtr hWnd, int nIndex);
}

IntPtr nHD = new IntPtr(Thread.CurrentThread.ManagedThreadId);
Win32.SetThreadAffinityMask(nHD, 0x00000000);

const double SPLIT = 0.01;
const int COUNT = 200;
const double PI = 3.14159265;
const int INTERVAL = 300;//May be height

int[] busySpan = new int[COUNT];
int[] idleSpan = new int[COUNT];
int half = INTERVAL / 2;
double radian = 0.0;

for (int i = 0; i < COUNT; i++)
{
busySpan[i] = (int)((half + (Math.Sin(PI * radian) * half)));
idleSpan[i] = INTERVAL - busySpan[i];
radian += SPLIT;
}


int startTime = 0;
int j = 0;

while (true)
{
j = j % COUNT;
startTime = Environment.TickCount;
while ((Environment.TickCount - startTime) <= busySpan[j])
{

}
Thread.Sleep(idleSpan[j]);
j++;
}
结果:曲线很不好看,尽管是正弦了

问题
1、我用的是双核CPU,用一个死循环,可以让CPU稳定在50%左右,是为什么?
我猜测一个CPU管用户进程,另一个管着系统进程,但是后面用上面代码,两个CPU图都显示为正弦。。晕了
2、Win32.SetThreadAffinityMask(nHD, 0x00000000),让进程在第一个CPU上运行,但是不管我怎么调第二个参数,得到的结果都是一样的,WHY?
3、怎么样让曲线更回平滑?
上面的INTERVIAL也就是一个时间调度单位,在这个时间内,有一个忙和闲的比例。理论上说,
1)COUNT数值越大,randian越小,所得到的点就越多
2)INTERVAL时间越短,表示出的图样就越精细,在0~PI/2之间,INT值表示的比例在多大范围里面可以接受?比如:INTERVAL = 10,那么根本不可 能得到精确的点,但是INTERVAL越大,如2000MS那么图像就基本快没形状态
3)
while ((Environment.TickCount - startTime) <= busySpan[j])
{

}
执行busySpan[j]次,对应豪秒数是多少?sleep(idleSpan[i]),可是结结实实停了那么多豪秒,它们之间的比例还能准切吗?

各位大拿,多多发表看法~
...全文
130 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
knowledge_Is_Life 2008-04-30
  • 打赏
  • 举报
回复
接分是王道!
HellMoxi 2008-04-30
  • 打赏
  • 举报
回复
CPU好像双核也不能分开工作吧.如果默认的话,应该是两个一起计算不是分开的.怎么会一个管系统,一个管用户呢???
onthebox 2008-04-30
  • 打赏
  • 举报
回复
mark
ojekleen 2008-04-30
  • 打赏
  • 举报
回复
这个好的帖子没人顶,晕啊,有空帮再来看看

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧