代码绑核后调用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
    评论
调用一个exe接口,可以使用Java的ProcessBuilder类和Process类。ProcessBuilder类用于创建进程,并提供一些方法来设置进程的环境变量、工作目录、标准输入输出流等。Process类用于控制进程的执行,并提供一些方法来获取进程的状态、输入输出流、运行时间等信息。 要分析运行时间、内存、CPU占用,可以在Java代码使用Process类的一些方法来获取这些信息。下面是一些示例代码: 1. 获取运行时间 ```java Process process = new ProcessBuilder("path/to/exe").start(); long startTime = System.currentTimeMillis(); process.waitFor(); // 等待进程执行完成 long endTime = System.currentTimeMillis(); long elapsedTime = endTime - startTime; System.out.println("运行时间:" + elapsedTime + "毫秒"); ``` 2. 获取内存占用 ```java Process process = new ProcessBuilder("path/to/exe").start(); long memoryUsed = process.totalMemory(); // 获取进程占用的总内存 System.out.println("内存占用:" + memoryUsed + "字节"); ``` 3. 获取CPU占用 ```java Process process = new ProcessBuilder("path/to/exe").start(); long cpuTime = process.info().totalCpuDuration().orElse(0L); // 获取进程占用的总CPU时间 System.out.println("CPU占用:" + cpuTime + "纳秒"); ``` 需要注意的是,以上代码只是示例,具体实现可能会受到操作系统、Java虚拟机等因素的影响。在实际使用时,需要根据具体情况进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值