【本文链接】

http://www.cnblogs.com/hellogiser/p/cpu-manager.html

【题目】

写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率。程序越精简越好,计算机语言不限。例如,可以实现下面三种情况:

1.    CPU的占用率固定在50%,为一条直线;

2.    CPU的占用率为一条直线,但是具体占用率由命令行参数决定(参数范围1~ 100);

3.    CPU的占用率状态是一个正弦曲线。

【分析】

如果不考虑其它程序的CPU占用情况,可以在每个核上开一个线程,运行指定的函数,实现每个核的CPU占用率相同。

要让CPU的占用率,呈函数 y = calc(t) (0 <= y <= 1, t为时间,单位为ms )分布,只要取间隔很短的一系列点,认为在某个间隔内,y值近似不变。

设间隔值为GAP,显然在指定t值附近的GAP这段时间内,

CPU占用时间为:busy = GAP * calc(t),

CPU空闲时间为:idle = GAP – busy

(1)对于CPU的占用率固定在50%,cacl(t)返回一个常数值0.5;

(2)对于CPU的占用率固定在p%,cacl(t)返回一个常数值p/100;

(3) CPU的占用率状态是一个正弦曲线,则y = 0.5 * (1 + sin(a * t + b))

其周期T = 2 * PI / a  (PI = 3.1415927),可以指定T值为60s即60000ms,则可以确定a值为 2 * PI / T, 若在这60000ms内我们计算200次(c = 200),则GAP值为 T / c = 300ms.也就是说,只要确定了周期和计算次数,其它几个参数也都确定下来。

可以创建一个线程,然后在指定的处理器上运行。具体可以通过CreateThread,SetThreadAffinityMask和WaitForSingleObject函数来实现。

【代码】

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
 
// 01_CPUManager.cpp : Defines the entry point for the console application.
//
/*
    version: 1.0
    author: hellogiser
    blog: http://www.cnblogs.com/hellogiser
    date: 2014/6/24
*/
#include "stdafx.h"
#include <cmath>
#include <iostream>
#include <Windows.h>
using namespace std;

typedef double Func(double);

double cacl_linear(double ratio)
{
    return ratio;
}

void Solve_Linear(Func *cacl)
{
    unsigned BUSY_TIME = GAP_LINEAR * cacl(RATIO); //ms
    unsigned IDLE_TIME = GAP_LINEAR - BUSY_TIME; //ms
;
    while(true)
    {
        //busy loop
        startTime = GetTickCount();
        while(GetTickCount() - startTime < BUSY_TIME)
            ;
        // idle loop
        Sleep(IDLE_TIME);
    }
}

void Run_Linear()
{
    // run on processor 1
    HANDLE handle;
    DWORD thread_id;
    handle = CreateThread(, (LPTHREAD_START_ROUTINE)Solve_Linear,
                          (VOID *)cacl_linear, , &thread_id);
    if (handle != NULL)
        SetThreadAffinityMask(handle, );// run on process #1
    WaitForSingleObject(handle, INFINITE);
}

/*
y = calc(t) (0 <= y <= 1)
GAP
busy: GAP*calc(t)
idle: GAP-busy

y = 0.5 * (1 + sin(a * t + b))
*/
; // ms
;
const double GAP = (double)PERIOD / COUNT;
;
 * PI) / PERIOD;
double cacl_sin(double t)
{
    // t = 0,1*gap,2*gap,...,200*gap
;
}

void Solve_Sin(Func *cacl)
{
    double BUSY_TIME[COUNT] ; //ms
;
    ; i < COUNT; ++i)
    {
        t = i * GAP;
        BUSY_TIME[i] = GAP * cacl(t);
    }
    ;
    INT64 startTime = ;
    unsigned busyTime, idleTime;
    while(true)
    {
        if(i >= COUNT)
            i = ;
        busyTime = BUSY_TIME[i];
        idleTime = GAP - busyTime;
        //busy loop
        startTime = GetTickCount();
        while(GetTickCount() - startTime < busyTime)
            ;
        // idle loop
        Sleep(idleTime);
    }
}

void Run_Sin()
{
    // run on processor 2
    HANDLE handle;
    DWORD thread_id;
    handle = CreateThread(, (LPTHREAD_START_ROUTINE)Solve_Sin,
                          (VOID *)cacl_sin, , &thread_id);
    if (handle != NULL)
        SetThreadAffinityMask(handle, );// run on process #2
    WaitForSingleObject(handle, INFINITE);
}

void test_main()
{
    Run_Linear();
    Run_Sin();
}

int _tmain(int argc, _TCHAR *argv[])
{
    test_main();
    ;
}

【本文链接】

http://www.cnblogs.com/hellogiser/p/cpu-manager.html

1.1 让CPU占用率曲线听你指挥[cpu manager]的更多相关文章

  1. 第1章 游戏之乐——让CPU占用率曲线听你指挥

    让CPU占用率曲线听你指挥 写一个程序,让用于来决定Windows任务管理器(Task Manager)的CPU占用率.程序越精简越好,计算机语言不限.例如,可以实现下面三种情况: CPU的占用率固定 ...

  2. 让cpu占用率曲线听你指挥(多核处理器)

    编程之美 1.1 让cpu占用率曲线听你指挥(多核处理器) [版权声明]转载请注明出处 http://www.cnblogs.com/TenosDoIt/p/3242910.html  [目录] 不考 ...

  3. 编程之美_1.1 让CPU占用率曲线听你指挥

    听到有人说让要写一个程序,让用户来决定Windows任务管理器的CPU占用率. 觉得很好奇.但第一个想法就是写个死循环.哈哈.不知道具体的占用率是多少,但至少能保证在程序运行时,CPU的占用率终会稳定 ...

  4. 编程之美 1.1 让cpu占用率曲线听你指挥(多核处理器)

    [目录] 不考虑其他进程,cpu画正弦曲线 获取总体cpu利用率 获取多核处理器单个cpu利用率 考虑其他进程,cpu画正弦曲线 下面的程序针对多核处理器,可以设置让任何一个cpu显示相应的曲线(本文 ...

  5. 让CPU占用率曲线听你指挥

    使用GetTickCount()和Sleep(): Code#include <stdio.h> #include <unistd.h> #include <time.h ...

  6. 编程之美读书笔记1.1——让CPU占用率曲线听你的指挥

    http://blog.csdn.net/pipisorry/article/details/36189155 <strong><span style="font-size ...

  7. 让CPU的占有率曲线听我指挥

    最近我要在公司的一个study group负责AWS的AutoScaling功能的介绍.AWS可以根据instance(虚拟机)的CPU使用量进行scaling. 为了做demo,于是就有这样一个需求 ...

  8. 控制CPU占用率曲线

    编程之美的第一个问题,我的机器是双核的,用文中的代码,得到的曲线波动比较大额,受其他进程的影响比较大.文中提到10ms接近windows的调度时间片,如果选得太小,会造成线程被频繁唤醒和挂起,造成内核 ...

  9. 编程之美 之 让CPU占用率听你指挥

    昨天在bbs上淘到了这本编程之美.顺手刷了第一章,很有意思.第一章的要求是要控制CPU曲线,绘制出对应的形状. 拿到这个问题,我的第一反应是, 是不是有这么一个API,能在任务管理器上的对应区域直接绘 ...

随机推荐

  1. Java算法-希尔排序

    希尔排序的诞生是由于插入排序在处理大规模数组的时候会遇到需要移动太多元素的问题.希尔排序的思想是将一个大的数组“分而治之”,划分为若干个小的数组,以 gap 来划分,比如数组 [1, 2, 3, 4, ...

  2. 取出list的数组元素

    java中将list中的一维数组中的元素取出需要2步.第一步:获取list的迭代器,将数组从迭代器中遍历取出:第二部:对取出的数组进行遍历,取出数组中存储的元素.java的list集合中只能存储引用型 ...

  3. Spring学习1-初识Spring

    一.简介   1.Spring是一个开源的控制反转(Inversion of Control ,IoC)和面向切面(AOP)的容器框架.它的主要目得是简化企业开发.  2.为何要使用Spring?   ...

  4. MongoDB之bson的介绍

    MongoDB之bson的介绍 1. 什么是bson BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JS ...

  5. ci默认控制器

    默认控制器 前面提到,如果在请求中没有指明具体的控制器,CI将会把页面重定向到一个系统默认的页面.这个默认页面可以自己设定,它存放在如下地址:/system/application/config/ro ...

  6. Linux目录结构及常用命令(转载)

    一.Linux目录结构 你想知道为什么某些程序位于/bin下,或者/sbin,或者/usr/bin,或/usr/sbin目录下吗?例如,less命令位于/usr/bin目录下.为什么没在/bin中,或 ...

  7. MyEclipse代码提示快捷键和常用设置

    我使用的是MyEclipse 6.0版本,代码助手(content assist)的快捷键由 Alt + / 改成了 Ctrl + Space,恰好我的输入法快捷键也是 Ctrl + Space .造 ...

  8. PHP文件包含漏洞剖析

    一. 什么才是”远程文件包含漏洞”?回答是:服务器通过php的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到邪恶的目的. ...

  9. php中mysql参数化查询

    $query = sprintf("SELECT * FROM Users where UserName='%s' and Password='%s'",mysql_real_es ...

  10. apache mysql 正常启动 打开php网页延时

    金山毒霸或者升级精灵修改了WINSOCK导致的.由于我电脑上也安装了金山毒霸,而且最近几天也升级过了,应该是同样的问题.于是搜索到恢复Winsock的方法: netsh winsock reset 使 ...