代码绑核后调用system占用CPU分析

149 篇文章 2 订阅
69 篇文章 0 订阅

一 system函数分析

1.函数原型:

int system(const char *command)

参数command一般是一条可被/bin/sh -c执行的字符串,可以是"ls -l"这样的shell命令,也可以是"./Test"这样的二进制路径。

如上图所示:

(1)某个进程调用system时,就是fork一个子进程,让子进程调用execl执行命令;

(2)父进程一直会等子进程执行结束,这个与popen不同;

(3)子进程会继续父进程一些属性,如果父进程使用绑核操作,那么system出来的子进程也会在相应核上运行。

二 实验绑核后调用system

1.实验描述:

(1)一个exhaust进程用于消耗CPU,做计算任务,比如可将CPU消耗到70%~100%;

(2)父进程绑核后调用system("./exhaust")执行计算任务;

(3)父进程不进行绑核调用system("./exhaust")执行计算任务

2.实验目的:

证明绑核后进程在调用system产生子进程一定会和父进程位于同样CPU上运行。

3.实验环境:

CPU:4核 Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz

 

OS:centos7.6

3.代码:

https://github.com/wangzhicheng2013/system_call_cpu_bind

4.实验数据对比

(1)绑核

#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <thread>
#include "cpu_utility.hpp"
void exhaust_cpu() {
    std::cout << system("./exhaust_cpu") << std::endl;
}
int main() {
    G_CPU_UTILITY.bind_cpu(1);
    std::thread th0(exhaust_cpu);
    std::thread th1(exhaust_cpu);
    if (th0.joinable()) {
        th0.join();
    }
    if (th1.joinable()) {
        th1.join();
    }
 
    return 0;
}

 

经过绑核后,尽管单个exhaust_cpu进程可以消耗70%CPU,但通过Test调用system后两个exhaust_cpu进程都运行在1核,并且导致1核满负载,使用ps -eo pid,args,psr | grep exh查看:

(2)不绑核

去除代码的绑核操作后,运行Test:

每个exhaust_cpu占用的CPU比例都在近70%,使用ps -eo pid,args,psr | grep exh查看:

可以看出exhaust_cpu分别运行在0号和1号CPU上,因此性能得到提升。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值