操作系统CPU占用率控制实验报告

  • 格式:docx
  • 大小:62.33 KB
  • 文档页数:5

实验一:CPU占用率控制
一、实验目的
1、通过编写和调试程序以加深对CPU调度的理解;
2、熟悉Windows任务管理器CPU信息的获取和使用方法;
二、实验要求
编写程序实现下面任意一题:
1、CPU占用率为一条直线,固定在50%;
2、CPU占用率为一条正弦曲线。

三、实验原理
在任务管理器的一个刷新周期内,CPU忙(执行应用程序)的时间和刷新周期总时间的比率,就是CPU的占用率,也就是说,任务管理器中显示的是每个刷新周期内CPU占用率的统计平均值。

通过控制程序在任务管理器的刷新期间内忙/闲的比例,就可以控制管理器的CPU占有率。

问题的关键在于如何控制两个loop的时间。

四、实验内容及结果
1、实现CPU占用率为一条直线,固定在50%;
分析:GetTickCount()可以得到“系统启动到现在”的毫秒值,最多能够统计到49.7天。

另外,利用Sleep()函数,最多也只能精确到1毫秒。

因此,可以在“毫秒”这个量级做操作和比较。

步骤1要操纵CPU的usage曲线,就需要使CPU在一段时间内跑busy和idle两个不同的循环,从而通过不同的时间比例来获得调节CPU占用率的控制。

步骤2利用GetTickCount()来实现busy loop的循环,用Sleep()实现idle loop。

实验源程序:
#include <windows.h>
int main(void)
{
//50%
int busyTime=10;
int idleTime=busyTime;
_int64 startTime;
SetThreadAffinityMask(GetCurrentProcess(), 0x00000001);
while(true)
{
startTime=GetTickCount(); //获取从系统从开机到此刻
//为止运行的时间
while((GetTickCount()-startTime)<=busyTime)
{
;
}
Sleep(idleTime);
}
return 0;
}
实验结果:
(图一CPU占用率为一条直线,固定在50%)
2、CPU占用率为一条正弦曲线。

分析:可以用sin函数的幅度来表示忙状态占用的时间的大小,当sin函数达到最大值时,CPU占用率为100%,空闲时间大小为0,当sin函数达到最小值时,CPU占用率为0%,忙时间大小为0。

步骤1首先设定采样参数,设一个周期内采样点的个数和步进单位的大小。

步骤2根据sin函数的大小分别计算忙时间和空闲时间的大小,通过计数完成周期采样。

步骤3同第一题用GetTickCount()来实现忙状态的循环,用Sleep()实现空闲状态循环。

通过计数实现周期采样。

实验源程序:
#include <stdlib.h>
#include <windows.h>
#include <math.h>
const double SPLIT=0.05; //步进量为0.05
const int COUNT=200; //刷新周期内采样200个点
const double PI=3.14159265;
const int INTERVAL=300; //正弦幅值最大单位
int _tmain()
{ DWORD busySpan[COUNT];
DWORD idleSpan[COUNT];
int half=INTERV AL/2;
double radian=0.0;
for(int i=0;i<COUNT;i++)
{ busySpan[i]=(DWORD)(half+(sin(PI*radian)*half)); //忙状态时间idleSpan[i]=INTERV AL-busySpan[i]; //空闲状态时间
radian+=SPLIT; // 步进量}
DWORD startTime=0;
int j=0;
while(true)
{ j=j%COUNT;
startTime=GetTickCount();
while((GetTickCount()-startTime)<=busySpan[j]);
//如果没有到忙截止时间则循环等待
Sleep(idleSpan[j]); //执行休眠idleSpan[j]时间大小
j++;
}
return 0;
}
void main()
{
_tmain();}
实验结果
(图二CPU占用率为一条正弦曲线。


五、实验收获
通过本次实验,从原理上加深了对CPU调度的理解,并且对于windows任务管理器中CPU占用率的获取方法有了了解。

在具体编程中,通过控制刷新周期内CPU工作忙状态和闲状态的时间比例,来获得预期的CPU占用率曲线,体会了人为控制CPU调度的过程。

在原理和具体的编程方法上有了巩固和提高。