`

让CPU占用率听你指挥

 
阅读更多

CPU占用率显示为y=A+Asin(x)曲线

//基本思路是新建一线程,让这个线程只在某一cpu上运行。这个线程的作用是控制单个cpu的占用率。

#include "stdafx.h"	//建工程时自动引入
#include<stdio.h>
#include<windows.h>
#include <stdlib.h>
#include <math.h>


const double SPLIT = 0.01;
const int COUNT = 200;
const double PI = 3.1415926;
const int INTERVAL = 300;

/*
	1. #define WINAPI __stdcall
	__stdcall是新标准的C/C++函数调用方法,从底层上说,使用这种方法参数的进栈顺序和
	标准C调用(_cdecl方法)相同,都是从右向左。但是__stdcall(WINAPI)采用自动清栈,而
	_cdecl采用手工清栈。
	
	2. 回调(Windows来调用的)
*/
static DWORD WINAPI myProc(LPVOID p)//WINAPI:回调,参数从右向左入栈,自动清栈
{
 DWORD busySpan[COUNT];
 DWORD idleSpan[COUNT];

 int half = INTERVAL / 2;
 double radian = 0.0;//radian弧度,这里指角度值(横坐标)

 for (int i=0; i<COUNT; i++)
 {
  busySpan[i] = (DWORD)(half + half * sin(PI * radian));//y=sin(x)曲线必须向上平移INTERVAL,否则无法到达横轴以下部分
  idleSpan[i] = INTERVAL - busySpan[i];
  radian += SPLIT;
 }

 DWORD startTime = 0;
 int j=0;//j是一个循环的时间坐标
 while (true)
 {
  j=j%COUNT;
  startTime = GetTickCount();
  while ( (GetTickCount() - startTime) <= busySpan[j])
  {
   ;//牢记:即使不做任何操作的while()也不会被挂起,它是一直工作的:{
  }
  Sleep(idleSpan[j]);
  j++;
 }
}


int main(int argc, char* argv[])
{
char szbuf[200];//传给线程的参数
 DWORD id;
 HANDLE h = CreateThread(NULL, 0, myProc, &szbuf, CREATE_SUSPENDED, &id);
 //CREATE_SUSPENDED先挂起线程,设置环境,再ResumeThread(h)
 if (NULL == h)
 {
  printf("error /n");
  return 0;
 }

 SetThreadAffinityMask(h, 1);//?1

 ResumeThread(h);

 /*
	//直接写成不完善:
	::WaitForSingleObject(h,INFINITE);
	::CloseHandle(h);
 */
 if (WaitForSingleObject(h, INFINITE) != WAIT_OBJECT_0)
 {
  CloseHandle(h);
  printf("error /n");
  return 0 ;
 }

 CloseHandle(h);


	return 0;
}
 

 

相关知识:

      1. Windows线程

 

 

      2. WaitForSingleObject(handle,INFINITE)

 

      DWORD   WaitForSingleObject(
        HANDLE   hHandle, //   handle   of   object   to   wait   for
        DWORD   dwMilliseconds   //   time-out   interval   in   milliseconds
      );
参数:
    hHandle   :等待对象句柄。
    dwMillSeconds:   指定以毫秒为单位的超时间隔。
返回值:
    WAIT_ABANDONED:   指定对象是互斥对象,在线程被终止前,线程没有释放互斥对象。互斥对象的所属关系被授予调用线程,并且该互斥对象被置为非信号态。
    WAIT_OBJECT_0:     指定对象的状态被置为信号状态。
    WAIT_TIMEOUT:       超时,并且对象的状态为非信号态。
    WAIT_FAILED:         调用失败。

 

 

      3. 使用多核——线程占用某些CPU:


我的笔记本有4个CPU
    经过试验,
        SetThreadAffinityMask(h,1)使用CPU1
        SetThreadAffinityMask(h,2)使用CPU2
        SetThreadAffinityMask(h,4)使用CPU3
        SetThreadAffinityMask(h,5)使用CPU4

 

以下是转载的文章:http://blog.sina.com.cn/s/blog_4a657c5a0100f4q6.html

 

通过调用SetThreadAffinityMask,就能为各个线程设置亲缘性屏蔽: 


  DWORD_PTR  SetThreadAffinityMask  ( 
      HANDLE  hThread,                                  //  handle  to  thread 
      DWORD_PTR  dwThreadAffinityMask    //  thread  affinity  mask 
  ); 
  该函数中的  hThread  参数用于指明要限制哪个线程,  dwThreadAffinityMask用于指明该线程 
  能够在哪个CPU上运行。dwThreadAffinityMask必须是进程的亲缘性屏蔽的相应子集。返回值 
  是线程的前一个亲缘性屏蔽。例如,可能有一个包含4个线程的进程,它们在拥有4个CPU的计算机上运行。如果这些线程中的一个线程正在执行非常重要的操作,而你想增加某个CPU始终可供它使用的可能性,为此你对其他3个线程进行了限制,使它们不能在CPU  0上运行,而只能在CPU  1、2和3上运行。因此,若要将3个线程限制到CPU  1、2和3上去运行,可以这样操作: 
   
  //线程0只能在cpu  0上运行 
  SetThreadAffinityMask(hThread0,0x00000001); 
  //线程1,2,3只能在cpu  1,2,3上运行 
  SetThreadAffinityMask(hThread1,0x0000000E); 
  SetThreadAffinityMask(hThread2,0x0000000E); 
  SetThreadAffinityMask(hThread3,0x0000000E);
分享到:
评论

相关推荐

    让CPU占用率曲线听你指挥

    编程之美:让CPU占用率曲线听你指挥,C++代码实现

    让CPU曲线听你指挥

    标题“让CPU曲线听你指挥”暗示了我们讨论的主题是关于如何通过编程或者特定的工具来管理和控制计算机的中央处理器(CPU)资源,使得CPU的使用率按照预设的模式运行,比如设置CPU的占用曲线。这样的技术在系统优化、...

    让CPU占用率曲线听你指挥 《编程之美——微软技术面试心得》节选.pdf

    "让CPU占用率曲线听你指挥" 本文主要讲述了如何控制Windows任务管理器中的CPU占用率曲线,让用户可以自定义CPU占用率的变化方式。通过分析和解释相关代码,我们可以了解到如何通过编程来控制CPU占用率,并了解CPU...

    基于VDPAU的GPU多视频解码.pdf

    本文提出了一种基于VDPAU的GPU多视频解码技术,通过将VDPAU集成到GPU中,实现了FFmpeg多视频解码的GPU并行处理,极大地降低了多视频解码的CPU占用率。 VDPAU(Video Decode and Presentation API for Unix)是一种...

    程序员面试前的模拟测验掌握小知识

    3. **算法优化** - "编程之美 让CPU占用率曲线听你指挥.pdf" 暗示了优化代码和算法的重要性。面试中,展示你对算法的理解,如排序、查找、动态规划等,并能解释如何通过优化降低CPU占用率。 4. **数据结构与算法** ...

    编程之美微软技术面试心得.doc

    例如,对于“CPU占用率曲线听你指挥”这个问题,面试官可以评估面试者的算法设计能力、编程能力和问题解决能力。 5. 技术面试的重要性:技术面试是企业招聘的重要环节,对面试者的技术能力和综合素质进行评估。 6....

    微软亚洲研究院经典面试题

    2. **编程之美 让CPU占用率曲线听你指挥.pdf**:此题目可能关注如何优化程序性能,降低CPU占用率。这需要了解CPU调度、并发编程和算法效率。优化技巧可能包括代码重构、算法改进、线程池的使用、异步处理等。 3. **...

    leetcode中国-BeautyOfProgramming:本书的代码

    让CPU占用率曲线听你指挥 CPU占用率曲线为正弦曲线的效果图 1.2 中国象棋将帅问题 1.3 一摞烙饼的排序 扩展问题2:先按照朴素的pancake_sort方法将烙饼按大小排序;然后对于每个正面不朝上的第i个烙饼,先将它翻到...

    微软近几年的面试题目汇总

    2. **系统优化与性能监控**:“让CPU占用率曲线听你指挥.pdf”和“task manager.pdf”可能讨论的是如何优化程序性能,如线程调度、内存管理,以及如何利用任务管理器等工具进行性能分析。 3. **游戏理论与逻辑推理*...

    技术面试技术面试技术面试技术面试技术面试

    1. **编程之美 让CPU占用率曲线听你指挥.pdf**: 这可能涉及到系统优化和性能监控。面试中可能会问到如何通过编程手段来控制或优化CPU使用率,例如通过多线程、异步处理、任务调度等方法。同时,面试者需要了解操作...

    简述对计算机操作系统的认识.docx

    60 年代中期又引入了多道批处理操作系统 OS/360,其运行过程:将 A、B 两道程序同时存放在内存中,它们在系统的控制下,可相互穿插、交替地在 CPU 上运行:当 A 程序因请求 I/O 操作而放弃 CPU 时,B 程序就可占用 ...

    计算机组成原理期中测试.doc

    - A 控制器: 控制器负责指挥整个CPU的操作流程。 - B 控制器、运算器、Cache (正确答案): 这三个部分共同构成了现代CPU的核心部件。 - C 运算器、主存: 运算器是进行数据运算的部分,而主存并不包含在CPU内部。 ...

    2018年山东春考信息技术高考试题.doc

    - 衡量光驱性能的关键指标包括读取速度、平均寻道时间、CPU占用率等。 - 其中,**CPU占用时间**(B. CPU Usage Time)是衡量光驱性能的重要指标之一,因为它反映了光驱读取数据时对CPU资源的占用程度。因此,正确...

    操作系统课后答案

    1. **处理机管理**:主要涉及对中央处理器(CPU)的管理,通过进程调度算法来决定哪个进程占用CPU资源,以及如何分配CPU时间,确保多个进程能够公平且高效地共享CPU资源。 2. **存储管理**:负责内存资源的分配与回收...

    软件测试测试从零开始——LoadRunner入门》书籍

    Analysis章节会讲解如何解读和分析测试结果,识别性能瓶颈,如CPU使用率、内存占用、网络带宽等指标。这些数据对于优化系统性能至关重要,可以帮助开发团队有针对性地改进代码。 除了基本操作,本书可能还会涉及...

    [17个软件测试文档]-5系统性能测试方案

    - **CPU和Memory性能测试**:监控系统在不同负载下内存和CPU的占用情况 - **负载能力测试(压力测试)**:确定系统能支持的最大终端数量 - **可靠性测试**:检查系统在长时间运行中的稳定性,记录错误发生频率 7...

    视频AI智能分析-观鸟系统解决方案202109.pdf

    视频AI智能分析-观鸟系统解决方案 ...它的优点包括:21速度快支持CPU和GPU计算3支持加载训练好的模型4执行前向传播过程(即预测)不断进步的深度学习算法准确率更高,处理帧率更快,资源占用更少。

    计算机软件基础复习

    4. **程序中断方式**:当I/O操作完成时会向CPU发送中断信号,提高了CPU的利用率。 5. **DMA方式**:直接内存访问,允许I/O设备与内存之间直接交换数据,进一步提高了效率。 #### 七、计算机的运算方法 1. **无符号...

    loadrunner

    在测试过程中,LoadRunner的联机监控器能够实时展示服务器在负载下的性能状态,如CPU使用率、内存占用、网络带宽等,这有助于性能工程师识别潜在的性能问题,并对系统进行优化。 通过学习和实践LoadRunner,性能...

Global site tag (gtag.js) - Google Analytics