生成CPU使用率 sin 曲线 控制cpu使用率 编程之美

入职Oracle 以后想着把之前写过的《编程之美》中控制CPU使用率曲线的程序再写一边, 但是总是因为入职需要学习的东西太多, 没有时间。 程序早就写好了, 终于有机会贴出来了。o(∩∩)o..

最早的时候我采用C实现的效果并不好, 当时也没有认真调试, 最初的时候采用C#实现的效果反而不错, 因为C#有很多方便的类库可以获取CPU的占用率, 控制sleep时间等等。其实在C中也很容易实现。

总体的算法思想, 这里就不再重复了, 可以参考下面的链接 :

http://blog.csdn.net/watkinsong/article/details/6865775

http://blog.csdn.net/watkinsong/article/details/6867373

http://blog.csdn.net/watkinsong/article/details/6867473

http://blog.csdn.net/watkinsong/article/details/6867666

http://blog.csdn.net/watkinsong/article/details/6870748

http://blog.csdn.net/watkinsong/article/details/6871235

本次算法的实现, 所有的代码都托管到了github, 并且使用了makefile编译文件。

地址: https://github.com/weixsong/aventador

下面简单的给出代码和效果截图, 这里的效果实现比以前的C#实现的那个sin曲线要好一些。

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <unistd.h>

extern const double PI = 3.1415926;

// setup the cpu set of this program to run on
int set_cpu(int id)
{
    cpu_set_t mask;
    CPU_ZERO(&mask);
    CPU_SET(id, &mask);
    if (sched_setaffinity(0, sizeof(mask), &mask) == -1)
    {
        fprintf(stderr, "warning: could not set CPU affinity/n");
        return 0;
    }
    return 1;
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <unistd.h>

#include "CPUtils.h"

const int CPU_KERNEL_ID = 0x0003;

const int SAMPLE_COUNT = 200;
const int TIME_SLICE = 200; // ms in second
const int TIME_TRANFORM = 1000; // change ms to us
long * busy_span;

// init the busy span, this is used to control the cpu busy time for each sample point
int init_busySpan(int sample_count)
{
	busy_span = (long *)malloc(sample_count * sizeof(long));
	if(busy_span == NULL)
	{
		return -1;
	}
	double radian = 0.0;
	double radianIncrement = 2.0 / (double)sample_count;
	int amplitude = (int)(TIME_SLICE / 2); // amplitude of sin curves, it means half of the time slice because sin() has negative value

	int i;
	for(i = 0; i < sample_count; i++)
	{
		busy_span[i] = (long)(amplitude + sin(radian * PI) * amplitude);
		radian = radian + radianIncrement;
	}
	return 1;
}

int main(void)
{
	if(set_cpu(CPU_KERNEL_ID) == 0)
	{
		printf("cpu affinity set failed\n");
	}
	else
	{
		printf("cpu affinity set succeeded\n");
	}

	printf("clock per second:%ld \n", CLOCKS_PER_SEC);
	fflush(stdout);

	if(!(init_busySpan(SAMPLE_COUNT)))
	{
		printf("init error \n");
		return 0;
	}

	int i = 0;
	long busy_time; // us
	long sleep_time; // us
	clock_t begin;
	for(i = 0; ; i = (i + 1) % SAMPLE_COUNT)
	{
		busy_time = busy_span[i] * TIME_TRANFORM;
		begin = clock();
		while((clock() - begin) < busy_time)
		{
			// loop
		}
		sleep_time = (long)((TIME_SLICE - busy_span[i])) * TIME_TRANFORM;
		usleep(sleep_time);
	}

	return 1;
}

生成CPU使用率 sin 曲线 控制cpu使用率 编程之美

时间: 2024-11-03 21:03:06

生成CPU使用率 sin 曲线 控制cpu使用率 编程之美的相关文章

C++11单例模式,另附C++11令CPU占用率为sin曲线

C++11 单例模式 对于C++11来说,单例模式就是这样简单!请看代码. <span style="font-size:14px;">#include <iostream> #include <ratio> #include <chrono> #include <thread> #include <cmath> using namespace std; template <typename T> cl

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

http://blog.csdn.net/pipisorry/article/details/36189155 <strong><span style="font-size:48px;color:#ff0000;">问题:</span></strong>写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率. 假设机器是多CPU,上面的程序会出现什么结果?怎样在多个CPU时显示相同的状态?比如.在双核的

cpu占用率曲线-笔记

我们知道要查看电脑的cpu占用率的话可以从任务管理器得知,进一步可以从->性能栏 看到CPU占用率的曲线的变化.今天看了编程之美的第一章第一节,看到对电脑cpu占用率的控制,控制CPU占用率曲线变化,达到特定的效果. cpu占用率曲线的刷新频率为1秒.要使在某一时刻CPU占用率达到目的中的百分比,可通过分配1秒内程序运行和休眠的时间的所占比,来达到.如在某1秒内,程序都处于休眠状态,那么,CPU占用率将达到0(理想化).反正,cpu占用率将达到100%. 第一种方法:基于计算程序所运行的电脑CP

Linux资源控制-CPU和内存

主要介绍Linux下, 如果对进程的CPU和内存资源的使用情况进行控制的方法. CPU资源控制 每个进程能够占用CPU多长时间, 什么时候能够占用CPU是和系统的调度密切相关的. Linux系统中有多种调度策略, 各种调度策略有其适用的场景, 也很难说哪种调度策略是最优的. Linux的调度策略可以参见代码: include/linux/sched.h /* * Scheduling policies */ #define SCHED_NORMAL 0 #define SCHED_FIFO 1

1.1 让CPU占用率曲线听你指挥[cpu manager]

[本文链接] http://www.cnblogs.com/hellogiser/p/cpu-manager.html [题目] 写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率.程序越精简越好,计算机语言不限.例如,可以实现下面三种情况: 1.    CPU的占用率固定在50%,为一条直线: 2.    CPU的占用率为一条直线,但是具体占用率由命令行参数决定(参数范围1~ 100): 3.    CPU的占用率状态是一个正弦曲线. [分析] 如果不考

Cgroups控制cpu,内存,io示例

Cgroups是control groups的缩写,最初由Google工程师提出,后来编进linux内核. Cgroups是实现IaaS虚拟化(kvm.lxc等),PaaS容器沙箱(Docker等)的资源管理控制部分的底层基础. 百度私有PaaS云就是使用轻量的cgoups做的应用之间的隔离,以下是关于百度架构师许立强,对于虚拟机VM,应用沙盒,cgroups技术选型的理解 本文用脚本运行示例进程,来验证Cgroups关于cpu.内存.io这三部分的隔离效果. 测试机器:CentOS relea

cgroup介绍、安装和控制cpu,内存,io示例

cgroup介绍 cgroup是control group的简称,它为Linux内核提供了一种任务聚集和划分的机制,通过一组参数集合将一些任务组织成一个或多个子系统. Cgroups是control groups的缩写,最初由Google工程师提出,后来编进linux内核. Cgroups是实现IaaS虚拟化(kvm.lxc等),PaaS容器沙箱(Docker等)的资源管理控制部分的底层基础 子系统是根据cgroup对任务的划分功能将任务按照一种指定的属性划分成的一个组,主要用来实现资源的控制.

用SpeedFan来控制CPU风扇转速

用SpeedFan来控制CPU风扇转速 浏览:63252 | 更新:2011-04-07 21:14 1 2 3 4 5 6 7 分步阅读 原创文章:看到SpeedFan,很多朋友最想要的是用SpeedFan来自动控制CPU风扇转速.刚打开这个软件,显示的项目太多,不够简单明了.就像图中所示,Fan2的转速1985才是CPU的风扇转速.不过这些并不影响它进行CPU风扇转速调整.接下来,我将在文章中为您详细介绍使用SpeedFan自动对CPU风扇进行调速的方法和步骤. 工具/原料 SpeedFan

《编程之美》之如何控制CPU的暂用率固定在50%

<编程之美>第一章 让CPU暂用率听你指挥的粗糙实现,如何控制CPU的暂用率固定在50% #include <stdio.h> #include <Windows.h> #ifdef __cplusplus extern "C" { #endif #include <Powrprof.h> #ifdef __cplusplus } #endif #define GetCPUTickCount() __rdtsc() typedef str