CPU占用率呈正弦实现,及实时输出进程和线程的CPU占用率

#include "stdafx.h"
#include <windows.h>
#include <math.h>

// 时间转换
static __int64 file_time_2_utc(const FILETIME* ftime)
{
    LARGE_INTEGER li;

    li.LowPart = ftime->dwLowDateTime;
    li.HighPart = ftime->dwHighDateTime;
    return li.QuadPart;
}

// 获得CPU的核数
static int get_processor_number()
{
    SYSTEM_INFO info;
    GetSystemInfo(&info);
    return (int)info.dwNumberOfProcessors;
}
// 获取进程CPU占用
int get_cpu_usage(HANDLE hand)
{
    //cpu数量
    static int processor_count_ = -1;
    //上一次的时间
    static __int64 last_time_ = 0;
    static __int64 last_system_time_ = 0;

    FILETIME now;
    FILETIME creation_time;
    FILETIME exit_time;
    FILETIME kernel_time;
    FILETIME user_time;
    __int64 system_time;
    __int64 time;
    __int64 system_time_delta;
    __int64 time_delta;

    int cpu = -1;
	if(hand==NULL)
		return cpu;
    if(processor_count_ == -1)
    {
        processor_count_ = get_processor_number();
    }

    GetSystemTimeAsFileTime(&now);

    //HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
    if (!GetProcessTimes(hand, &creation_time, &exit_time, &kernel_time, &user_time))
    {
        return -1;
    }
    system_time = (file_time_2_utc(&kernel_time) + file_time_2_utc(&user_time)) / processor_count_;
    time = file_time_2_utc(&now);

    if ((last_system_time_ == 0) || (last_time_ == 0))
    {
        last_system_time_ = system_time;
        last_time_ = time;
        return -1;
    }

    system_time_delta = system_time - last_system_time_;
    time_delta = time - last_time_;

    if (time_delta == 0)
        return -1;

    cpu = (int)((system_time_delta * 100 + time_delta / 2) / time_delta);
    last_system_time_ = system_time;
    last_time_ = time;
    return cpu;
}
// 获取线程CPU占用
int get_thread_cpu_usage(HANDLE hand)
{
    //cpu数量
    static int processor_count_ = -1;
    //上一次的时间
    static __int64 last_time_ = 0;
    static __int64 last_system_time_ = 0;

    FILETIME now;
    FILETIME creation_time;
    FILETIME exit_time;
    FILETIME kernel_time;
    FILETIME user_time;
    __int64 system_time;
    __int64 time;
    __int64 system_time_delta;
    __int64 time_delta;

    int cpu = -1;
	if(hand==NULL)
		return cpu;
    if(processor_count_ == -1)
    {
        processor_count_ = get_processor_number();
    }

    GetSystemTimeAsFileTime(&now);

    //HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
    if (!GetThreadTimes(hand, &creation_time, &exit_time, &kernel_time, &user_time))
    {
	return -1;
    }
    system_time = (file_time_2_utc(&kernel_time) + file_time_2_utc(&user_time)) / processor_count_;
    time = file_time_2_utc(&now);

    if ((last_system_time_ == 0) || (last_time_ == 0))
    {
        last_system_time_ = system_time;
        last_time_ = time;
        return -1;
    }

    system_time_delta = system_time - last_system_time_;
    time_delta = time - last_time_;

    if (time_delta == 0)
        return -1;

    cpu = (int)((system_time_delta * 100 + time_delta / 2) / time_delta);
    last_system_time_ = system_time;
    last_time_ = time;
    return cpu;
}
//CPU占用率呈正弦实现
const double SPLIT = 0.01;
const int COUNT = 200;
const double PI = 3.14159265;
const int INTERVAL = 300;
UINT ThreadFunT()
{
    DWORD busySpan[COUNT];  //array of busy times
    DWORD idleSpan[COUNT];  //array of idle times
    int half = INTERVAL / 2;
    double radian = 0.0;
    for(int i = 0; i < COUNT; i++)
    {
        busySpan[i] = (DWORD)(half + (sin(PI * radian) * half));
        idleSpan[i] = INTERVAL - 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]);
        j++;
    }
    return 0;
}

int main(int argc, char* argv[])
{
	HANDLE m,c;
	DWORD ThreadID;
	int i=0;
	//让进程在指定处理器上运行
	SetProcessAffinityMask(
		GetCurrentProcess(),
		0x00000001          //cpu mask
         );
	m=GetCurrentProcess();
//	c=CreateThread(NULL,
//		0,
//		(LPTHREAD_START_ROUTINE)ThreadFunT,
//		NULL,
//		0,
//		&ThreadID);
	Sleep(300);
	c=CreateThread(NULL,
		0,
		(LPTHREAD_START_ROUTINE)ThreadFunT,
		NULL,
		0,
		&ThreadID);
	while (i<200)
	{
		Sleep(100);
		printf("CPU:%d%%  Thread:%d%%\n",get_cpu_usage(m),get_thread_cpu_usage(c));
		i++;
	}
	printf("Hello World!\n");
	return 0;
}
时间: 2024-10-08 10:18:29

CPU占用率呈正弦实现,及实时输出进程和线程的CPU占用率的相关文章

Linux下如何查看高CPU占用率线程 LINUX CPU利用率计算

目录(?)[-] proc文件系统 proccpuinfo文件 procstat文件 procpidstat文件 procpidtasktidstat文件 系统中有关进程cpu使用率的常用命令 ps 命令 top命令 单核情况下Cpu使用率的计算 基本思想 总的Cpu使用率计算 计算方法 某一进程Cpu使用率的计算 计算方法 实验数据 某一线程Cpu使用率的计算 计算方法 实验数据 多核情况下cpu使用率的计算 实验一 描述 数据一 数据二 实验二 描述 数据一 数据二 主要问题 Java 系统

多线程程序 怎样查看每个线程的cpu占用

可以用下面的命令将 cpu 占用率高的线程找出来: ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu 这个命令首先指定参数'H',显示线程相关的信息,格式输出中包含:user,pid,ppid,tid,time,%cpu,cmd,然后再用%cpu字段进行排序.这样就可以找到占用处理器的线程了. 直接使用 ps Hh -eo pid,tid,pcpu | sort -nk3 |tail 获取对于的进程号和线程号,然后跳转到3.查看哪个进程线程

查看线程linux cpu使用率

Linux下如何查看高CPU占用率线程 LINUX CPU利用率计算 转 http://www.cnblogs.com/lidabo/p/4738113.html目录(?)[-] proc文件系统 proccpuinfo文件 procstat文件 procpidstat文件 procpidtasktidstat文件 系统中有关进程cpu使用率的常用命令 ps 命令 top命令 单核情况下Cpu使用率的计算 基本思想 总的Cpu使用率计算 计算方法 某一进程Cpu使用率的计算 计算方法 实验数据

修复VirtualBox &quot;This kernel requires the following features not present on the CPU: pae Unable to boot – please use a kernel appropriate for your CPU&quot;(安装深度Linux的时候就需要)

异常处理汇总-开发工具  http://www.cnblogs.com/dunitian/p/4522988.html 修复VirtualBox "This kernel requires the following features not present on the CPU: pae Unable to boot – please use a kernel appropriate for your CPU" 解决方法

linux 线程与CPU绑定

看到很多程序都是根据CPU个数来创建线程个数,当时很不理解他们之间的关系,咨询了项目组的同事后才有了大致了解.  1. 相关系统函数 下面的函数可以通过man命令查询到. SYNOPSIS #define _GNU_SOURCE #include <pthread.h> int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset); int pthread_getaffinity

Linux编程之《进程/线程绑定CPU》

Intro----- 通常我们在编写服务器代码时,可以通过将当前进程绑定到固定的CPU核心或者线程绑定到固定的CPU核心来提高系统调度程序的效率来提高程序执行的效率,下面将完整代码贴上.```/************************************************ * 该例程讲解了进程.线程绑定到固定的cpu核心上运行 * 来提高程序运行效率************************************************/#include <unistd

C# 线程测试cpu

深夜,闲得无聊,突然奇想,想写控制cpu的,让cpu按照我的思想来,嘎嘎,由于是自己猜的,不要乱喷哦,虽然没人给我评论. 网上看到一个人说,一个死循环就能把单核cpu搞到100%,我不信,(我的电脑i5 4200M),就写了一个控制台程序,代码如下 <span style="color:#3366FF;"> static void Main(string[] args) { while (true) { } }</span> 然后来看效果图 大家看到那个25了吧

linux下如何获取每个线程的CPU占用率

啥也不说,直接上脚本: [email protected]:/mnt/mtd# cat cpu.sh #!/bin/sh while true do ps -H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu sleep 1 done [email protected]:/mnt/mtd#

Ubuntu实时查看网速、CPU、内存等信息

Indicator-Sysmonitor : 好像版本没有下载对,没有办法显示网速 但是百分比的显示非常喜欢..而且还能顺便编辑点字显示 Indicator-Multiload : 下面可以显示很多但是是图形化,百分比就好了干净清晰 sudo add-apt-repository ppa:indicator-multiload/stable-daily sudo apt-get update sudo apt-get install indicator-multiload 参考链接: http: