一 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上,因此性能得到提升。
标签:exhaust,调用,核后,system,CPU,进程,cpu From: https://blog.51cto.com/u_15899033/5902968