在Ubuntu的 home/用户名 写文件,另外/user是系统文件,需要root权限。
创建名为 test 的文件夹 :mkdir test(删除文件/文件夹:rm)
创建名为 fourfork.c 的文件用于测试 : vi fourfork.c
#include <stdio.h>
void test_little(void)
{
int i,j;
for(i = 0; i < 30000000; i++)
j=i;
}
void test_mdedium(void)
{
int i,j;
for(i = 0; i < 60000000; i++)
j=i;
}
void test_high(void)
{
int i,j;
for(i = 0; i < 90000000; i++)
j=i;
}
void test_hi(void)
{
int i,j;
for(i = 0; i < 120000000; i++)
j=i;
}
int main(void)
{
int i, pid, result;
for(i = 0; i<2; i++) {
result = fork();
/*fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。*/
if(result>0)
printf("i=%d parent parent=%d current=%d child=%d\n", i, getppid(), getpid(), result);
else
printf("i=%d child parent=%d current=%d\n", i, getppid(), getpid());
if(i==0)
{
test_little();
sleep(1);
} else {
test_mdedium();
sleep(1);
}
}
/*等待子进程退出。NULL的意思是退出状态不关注。如果要获取退出状态应该写成wait(&status);*/
pid = wait(NULL);
test_high();
printf("pid=%d wait=%d\n", getpid(), pid);
sleep(1);
pid = wait(NULL);
test_hi();
printf("pid=%d wait=%d\n", getpid(), pid);
return 0;
}
编译fork.c文件gcc fourfork.c -o fourfork -g -O0
.c只是简单的文本文件
.o是编译之后的二进制文件:gcc -c test.c -o test.o
不带后缀的是可执行文件(相当于.exe):
gcc test.c -o test(直接编译)
gcc test.o -o test(从二进制编译成可执行)
gcc选项:
-O0是关闭优化
-o 指定录取保存数据的文件名
-g 使能函数调用图功能
gcc其他其他:
-e record指定PMU事件
–filter event事件过滤器
-a 录取所有CPU的事件
-p 录取指定pid进程的事件
-C 录取指定CPU的事件
在当前目录生成perf.data文件:
sudo perf record -a -g ./fourfork
perf report分析:
如果想看所有的进程:sudo perf report --call-graph none(我的机器上不好使,perf report可以)
说明:swapper 时钟
它只在系统初始化时创建 init 进程,之后,它就成了一个最低优先级的空闲任
务。也就是说,当 CPU 上没有其他任务运行时,就会执行 swapper 。所以,你可以称它为“空闲任务”。事件都耗费在了 do_idle 上,也就是在执行空闲任务。
说明:self,children含义
Self 是最后一列的符号(可以理解为函数)本身所占比例;
Children 是这个符号调用的其他符号(可以理解为子函数,包括直接和间接调用)占用
的比例之和。
如果只看fourfork的:sudo perf report --call-graph none -c fourfork
-i 导入的数据文件名称,如果没有则默认为perf.data
-g 生成函数调用关系图,此时内核要打开CONFIG_KALLSYMS;用户空间库或者执行文件需要带符号信息(not stripped),编译选项需要加上-g。
-sort 从更高层面显示分类统计信息,比如: pid, comm, dso, symbol, parent, cpu,socket, srcline, weight, local_weight.
下载,更新,移除软件包命令
想更新perf,提示:E: 无法定位软件包 perf,尝试解决方法如下,源更新了,update了,但依然无法定位perf
Ubuntu出现无法定位软件包,更换源