让多核CPU占用率曲线听你指挥——《编程之美》1.1学习笔记
Problem:
写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率。有以下几种情况:
1.CPU占用率固定在50%,为一条直线;
2.CPU的占用率为一条直线,具体占用率由命令行参数决定(范围1~100);
3.CPU的占用率状态为一条正弦曲线。
分析与解法:
(1)通过观察任务管理器,它大约1s更新一次。当CPU使用率为0时,System Idle Process占用了CPU的空闲时间。
System Idle Process在CPU空闲的的时候,发出一个IDLE命令,使CPU挂起(暂时停止工作),可有效的降低CPU内核的温度,无法终止。在这个进程里出现的CPU占用数值并不是真正的占用而是体现的CPU的空闲率,也就说这个数值越大CPU的空闲率就越高,反之就是CPU的占用率越高。Linux中对应的进程为init,PID为1。
当系统中的进程或者在等待用户输入,或者在等待某些事件的发生(发出I/O请求等待I/O响应),或者主动进入休眠状态(比如Sleep())。
在任务管理器中的一个刷新周期内,CPU忙(执行应用程序)的时间和刷新周期总时间的比率就是CPU的占用率。其显示的是每个刷新周期内CPU占用率的统计平均值。我们可以写一个程序让它在任务管理器的刷新时间内一会儿忙,一会儿闲,通过调节忙/闲的比例,来控制任务管理器中显示的CPU占用率。
书上的代码以单核CPU为前提,但对于多核CPU来说,同一个进程可能被CPU的任务分配器分配到不同的核心上执行,所以造成无法让任务管理器达到预想的效果。其实打开任务管理器,可以看到多个CPU使用记录。本人电脑CPU是Core i5 450M,双核4线程。在OS看来就如同有四个CPU工作一样。我的任务管理器中就有四个CPU使用记录。
所谓超线程技术就是利用特殊的硬件指令,把多线程处理器内部的两个逻辑内核模拟成两个物理芯片,从而使单个处理器就能“享用”线程级的并行计算的处理器技术。多线程技术可以在支持多线程的操作系统和软件上,有效的增强处理器在多任务、多线程处理上的处理能力。
可以使用SetProcessAffinityMask()函数可以使特定的处理器运行指定进程。
BOOL SetProcessAffinityMask(HANDLE hProcess, DWORD_PTR dwProcessAffinityMask);
第一个参数用来指定指定哪个进程,传入它的句柄。第二个进程用来指定哪个CPU核心来执行此进程。
DWORD_PTR,其实就是unsigned long*.Unsigned long type for pointer precision.Use when casting a pointer to a long type to perform pointer arithmetic.(Also commonly used for general 32-bit parameters that have been extended to 64 bits in 64-bit windows.)
DWORD 其实就是unsigned long。Windows下常用来保存地址或存放指针。
比如这样调用函数:
::SetProcessAffinityMask(::GetCurrentProcess(),0x1);可以指定当前执行的进程在第一个CPU上运行(00000001)。对于双核CPU,
::SetProcessAffinityMask(::GetCurrentProcess(),0x2);可以指定在第二个CPU上运行。(00000010)
::SetProcessAffinityMask(::GetCurrentProcess(),0x3);可以允许在两个CPU上任意运行。(000000011)
::SetProcessAffinityMask(::GetCurrentProcess(),0x3);可以允许在第三个CPU上任意运行。(000000100)
::SetProcessAffinityMask(::GetCurrentProcess(),0x3);可以允许在第一个和第三个CPU上任意运行。(00000101)
以此类推。。。
HANDLEGetCurrentProcess(void);
可以获得当前进程的句柄。注意,这个句柄为一个伪句柄。只能在我们的进程中才能代表当前进程的句柄,事实上这个函数目前只是简单的返回-1这个值。也就是说在我们的程序中-1便能表示本进程的句柄。
(2)那么对于绘制50%直线,程序代码为:
GetTickCount()可以得到系统从启动到运行到现在所经历时间的毫秒值。最多能统计到49.7天。我们利用它判断busy loop要持续多久。
其中idleTime为busyTime的五倍,可以修改其值使其更逼近50%。不同机子的情况不同。
__int64是VC++的64位扩展。范围为[-2^63,2^63)。当64位与32位混合运算时,32位整数会隐式转换成64位整数。输入输出它时使用cin、cout会造成错误。需要使用scanf("%I64d",&a);和printf("%I64d",a);
还有unsigned __int64,其范围为[0,2^64)。
对应g++中的64位扩展为long long和unsigned long long。范围与运算与上相仿。输入输出使用scanf("%lld",&a);和printf("%lld",a);
int _tmain(int argc, _TCHAR* argv[])。
_tmain这个符号多见于VC++创建的控制台工程中,这个是为了保证移植unicode而加入的(一般_t、_T、T()这些东西都和unicode有关系)。定义在头文件tchar.h中。
(3)对于绘制正弦曲线:
通过在一个周期2*PI中等分200份,将每一个间隔点的half + (sin( PI * radian) * half))的值存入busySpan[i],将其补植存入idleSpan[i]。half是整个值域INTERVAL的一半。这样可以近似趋近一条正弦曲线。
运行效果为:

(4)可以通过RDTSC指令获得当前CPU核心运行周期数。
在x86平台上定义函数:
在x64平台上定义:
使用CallNtPowerInformation API得到CPU频率,从而将周期数转化为毫秒数,例如如下:
RDTSC指令读取当前CPU的周期数,在多CPU系统中这个周期数在不同的CPU间基数不同,频率也不同。用从两个不同的CPU得到的周期数来计算会得出没有意义的值。所以需要用SetProcessAffinityMask避免进程迁移。另外,CPU的频率也会随系统供电及负荷情况有所调整。
More:
如何在Linux下如Ubuntu中的系统监视器中实现绘制正弦曲线?请听下回分解。
分享到:
相关推荐
本文将详细探讨如何使用Visual C++使多核CPU占用率达到100%,以及与之相关的OpenMP技术。 首先,`#pragma omp parallel` 是OpenMP中的一种指令,用于指示编译器创建一个并行区域。当执行到这个指令时,编译器会根据...
《Windows系统CPU内存网络性能统计第三篇 CPU 多核CPU各核使用率 C#》 http://blog.csdn.net/morewindows/article/details/8678382 配套程序,能获取多核CPU各核的使用率,已经测试,能在WinXP及Win7运行。
"linux-让多核CPU达到指定的CPU使用率脚本"是一个旨在提升机器CPU使用率的实用工具,它能帮助系统管理员更好地控制和利用计算资源。下面我们将详细探讨相关知识点。 1. **CPU使用率**: - CPU使用率是指CPU在单位...
在IT领域,CPU占用率是衡量计算机性能的重要指标之一,它反映了处理器在一段时间内执行任务的繁忙程度。易语言是一款中国本土开发的编程语言,旨在让编程变得更加简单、直观。本模块“CPU占用率检测模块”是专为...
总的来说,易语言取进程CPU占用率的源码是IT领域中一个实用的编程示例,它涵盖了进程管理、系统资源监控和多核处理器利用等关键概念。对于学习易语言或者希望提升系统级编程能力的开发者来说,这是一个很好的学习...
在Windows操作系统中,使用C语言获取进程的CPU使用率、内存使用情况以及I/O状态是一项基本的任务,这对于系统监控、性能分析以及优化程序性能都至关重要。以下是对这些知识点的详细解释: 1. **CPU使用率**: CPU...
多核cpu和gpu系统上椭圆曲线点乘并行计算研究.pdf
在Windows 7操作系统中,了解和监测CPU各个核心的使用率是系统性能分析的重要环节,尤其是在多核处理器的环境下。CPU使用率反映了处理器在给定时间内的繁忙程度,它可以帮助我们诊断系统性能瓶颈,优化任务分配,...
该资源主要介绍了并行计算的概念、多核CPU编程的 Demo 及其实现。下面是从该资源中提取的知识点: 并行计算简介 并行计算是计算机科学中的一种技术,通过将计算任务分解成多个子任务,从而提高计算速度。随着多核...
实验中提到,在多核环境下可能无法如预期那样实现特定的CPU占用率曲线。 8. **正弦曲线模拟**: 实验中还涉及到了通过sin函数来模拟CPU占用率变化,使其呈现正弦波形。这需要根据sin函数的值来动态调整繁忙和空闲...
在多核CPU环境下,为了获取总体CPU占用率,你需要累加所有核心的使用时间,因为每个核心的使用时间是独立的。对于内存占用,GetProcessMemoryInfo返回的信息已经考虑了多线程和多进程的共享内存。 最后,将这些功能...
3. 线程管理服务系统:基于 Windows 内核驱动的线程管理服务系统,可以让用户根据每一个任务线程对 CPU 资源的需要程度和对实时性的要求,在多核 CPU 上合理地分配 CPU 核。 4. 实时性提高:通过多核 CPU 资源的合理...
本文将深入探讨如何获取多核CPU的使用率、设置CPU亲和性、调整并发线程数和优先级,以及如何将线程绑定到特定的CPU核心上运行。我们将以`SystemInfoDemo`为例进行讲解。 1. **获取多核CPU使用率**: 获取CPU使用率...
Windows操作系统,作为全球最广泛使用的桌面操作系统之一,其多核CPU内核线程管理机制对于提升软件的实时性能和资源利用效率至关重要。 #### Windows系统进程调度机制分析 Windows NT内核是Windows操作系统的核心...
AMD多核CPU补丁XP专用1.3.2.0053版是一款专为Windows XP操作系统设计的软件,旨在解决AMD多核处理器与特定应用程序,尤其是游戏的兼容性问题。在早期的操作系统如Windows XP中,对于多核处理器的支持并不完善,可能...
AURIX™多核编程精华应用笔记围绕着如何在基于AURIX™的多核项目中开展编程工作,提供了详细的指导和案例分析。首先,笔记介绍AURIX™是英飞凌在2012年推出的第五代TriCore™系列,首次实现了最多包含三个32位...
通过这个实验,学生不仅可以掌握CPU占用率的概念,还能学习到如何在实际编程中实现对CPU占用率的控制,这对于理解和优化操作系统性能有着重要的意义。同时,实验也提醒我们,多核环境下的CPU占用率控制会更为复杂,...
为了获取类似任务管理器显示的进程CPU占用率,你需要遍历`SystemProcessInformation`中的所有进程,累加它们的CPU时间,同时考虑到多核CPU的情况。这可能涉及到一些复杂的同步和计时问题,因为CPU时间是随着时间推移...
基于Pytorch分布式包的单机多核CPU实现横向联邦学习项目源码+文档说明(毕业设计),本资源中的源码都是经过本地编译过可运行的,评审分达到98分,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足...