前几天测试软件在多核上的性能,需要按照比例吃各个CPU,查了查资料,撸了下面一小段代码;

 #include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h> #define __USE_GNU
#include <pthread.h>
#include <sched.h> //CPU ID号
#define CPU_0 0x0
#define CPU_1 0x01
#define CPU_2 0x02
#define CPU_3 0x03 //总时间和运行时间
#define FULL_TIME 100
#define RUN_TIME 80 //时钟HZ数
static clock_t clktck; //用户参数输入的吃CPU百分比
static int eat_cpu_percent; //线程绑定CPU
int attach_cpu(int cpu_index)
{
int cpu_num = sysconf(_SC_NPROCESSORS_CONF);
if (cpu_index < || cpu_index >= cpu_num)
{
perror("cpu index ERROR!\n");
return -;
} cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(cpu_index, &mask); if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < )
{
perror("set affinity np ERROR!\n");
return -;
} return ;
} //吃CPU线程
void *thread_task(void *param)
{
int *cpuid = (int *)param;
if (attach_cpu(*cpuid) < )
{
pthread_exit(NULL);
} clock_t time_start;
clock_t fulltime = FULL_TIME;
clock_t runtime = eat_cpu_percent;
while()
{
time_start = times(NULL);
while((times(NULL) - time_start) < runtime);
usleep((fulltime-runtime) * * / clktck);
} pthread_exit(NULL);
} int main(int argc, char *argv[])
{
if (argc < )
{
printf("Please run with 0-100! Example:./eat_cpu 80\n");
return -;
} eat_cpu_percent = (atoi)(argv[]);
if (eat_cpu_percent < || eat_cpu_percent > )
{
printf("eat cpu percent must in range:0-100!\n");
return -;
} int ret = ; clktck = sysconf(_SC_CLK_TCK); pthread_t t0;
int cpuid0 = CPU_0;
if (pthread_create(&t0, NULL, thread_task, &cpuid0) < )
{
perror("create thread 0 ERROR!\n");
ret = -;
goto _OUT;
} pthread_t t1;
int cpuid1 = CPU_1;
if (pthread_create(&t1, NULL, thread_task, &cpuid1) < )
{
perror("create thread 1 ERROR!\n");
ret = -;
goto _CANCEL_0;
} pthread_t t2;
int cpuid2 = CPU_2;
if (pthread_create(&t2, NULL, thread_task, &cpuid2) < )
{
perror("create thread 2 ERROR!\n");
ret = -;
goto _CANCEL_1;
} pthread_t t3;
int cpuid3 = CPU_3;
if (pthread_create(&t3, NULL, thread_task, &cpuid3) < )
{
perror("create thread 3 ERROR!\n");
ret = -;
goto _CANCEL_2;
} //直接停这里好了
while()
{
sleep();
} _CANCEL_3:
pthread_cancel(t3);
pthread_join(t3, NULL); _CANCEL_2:
pthread_cancel(t2);
pthread_join(t2, NULL); _CANCEL_1:
pthread_cancel(t1);
pthread_join(t1, NULL); _CANCEL_0:
pthread_cancel(t0);
pthread_join(t0, NULL); _OUT:
return ret;
}

按比例吃CPU的更多相关文章

  1. 吃CPU的openmp 程序

    g++ -o eat -fopenmp eat.cpp #include "stdio.h" int main(int argc, char *argv[]) { #pragma ...

  2. .NET(C#):获取进程的CPU使用状况

    第一个是通过手动的方法来计算CPU使用比例:CPU使用比例 = 在间隔时间内进程的CPU使用时间 除以 计算机逻辑CPU数量. 使用Process类的UserProcessorTime和Privile ...

  3. 【转】一文掌握 Linux 性能分析之 CPU 篇

    [转]一文掌握 Linux 性能分析之 CPU 篇 平常工作会涉及到一些 Linux 性能分析的问题,因此决定总结一下常用的一些性能分析手段,仅供参考. 说到性能分析,基本上就是 CPU.内存.磁盘 ...

  4. 一文掌握 Linux 性能分析之 CPU 篇

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 平常工作会涉及 ...

  5. [转帖]Docker容器CPU、memory资源限制

    Docker容器CPU.memory资源限制 https://www.cnblogs.com/zhuochong/p/9728383.html 处理事项内容等 这一块内容感觉 不清楚.. 背景 在使用 ...

  6. Docker 容器CPU设置

    CPU使用率其实就是你运行的程序占用的CPU资源,表示你的机器在某个时间点的运行程序的情况.使用率越高,说明你的机器在这个时间上运行了很多程序,反之较少.CPU使用率的高低与你的CPU强弱有直接关系. ...

  7. 系统性能--CPU

    对于cpu,目前比较关心的是cpu的利用率还有cpu的load,或者还有cpu运行队列. cpu利用率 cpu利用率分为sys,us.分别为操作系统和用户进程所占用的cpu利用率.sys的占用,一般是 ...

  8. Docker(二十)-Docker容器CPU、memory资源限制

    背景 在使用 docker 运行容器时,默认的情况下,docker没有对容器进行硬件资源的限制,当一台主机上运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU.内存和磁盘资源.如果不 ...

  9. docker cgroup技术之cpu和cpuset

    在centos7的/sys/fs/cgroup下面可以看到与cpu相关的有cpu,cpuacct和cpuset 3个subsystem.cpu用于对cpu使用率的划分:cpuset用于设置cpu的亲和 ...

随机推荐

  1. ajax跨域问题解决方案(jsonp的使用)

    错误提示: 是由于在ajax中填写url: "http://10.176.220.60:8080/SSM/login" 包含IP地址,系统默认跨域导致: 解决方法:在ajax当中d ...

  2. Ubuntu安装opencv3.4.4教程

    1 去官网下载opencv 在本教程中选用的是opencv3.4.4,下载链接 http://opencv.org/releases.html ,选择sources. 2 解压 unzip openc ...

  3. English-培训1-Phonetic symbols

  4. 安装HANA Rules Framework(HRF)

    1. 收集文档 1.1  SAP HANA Rules Framework by the SAP HANA Academy link 1.2  HANA Rules Framework (HRF) b ...

  5. jmeter学习笔记(三)配置元件之HTTP信息头管理

    使用jmeter模拟发送http请求时,有些请求是需要带上HTTP请求头里面的信息.比如页面需要登录信息的,那个就需要用户登录信息authorization.这个时候是需要使用到HTTP信息头管理器. ...

  6. stm32 FSMC-外扩SRAM IS62WV51216

    引脚定义 FSMC配置步骤 1.使能对应引脚GPIO时钟 2.配置GPIO引脚模式 3.使能FSMC时钟 4.FSMC初始化 5.存储器块使能 举例 #define Bank1_SRAM3_ADDR ...

  7. Integer和int踩过的坑

    在做SSM项目时发现一个有趣的bug,在这里记录一下. 数据库表如下: 实体类:grade字段初始设定为int类型 在用mybatis对第三条数据进行修改时,希望赋值的更改,未赋值的不更改,测试运行 ...

  8. 剑指Offer(三十):连续子数组的最大和

    .# 剑指Offer(三十):连续子数组的最大和 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...

  9. vs2017 c# 控制台 输出中文显示问号 ; vs2017 c# 控制台 输出中文显示乱码

    问题: 解决: 在main方法最前面加一句就OK了! Console.OutputEncoding = Encoding.GetEncoding("gbk"); 或者 Consol ...

  10. Django REST framework+Vue 打造生鲜电商项目(笔记五)

    一.viewsets实现商品详情页接口 (1)商品详情页只需要多继承一个类(mixins.RetrieveModelMixin)就可以了,(它的功能就是展示商品详情) class GoodsListV ...