问题描述
我试图找出哪些 C++ 代码会导致 Linux 上的模式切换(用户模式到内核模式)。我知道两件事:
- 系统调用导致模式切换:Is mode switch occur switching from user thread to kernel thread?
- 命令
strace
可以列出所有系统调用。
#include <iostream>
#include <chrono>
#include <thread>
int main()
{
int i = 0;
while (true) {
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
i++;
}
return 0;
}
我使用命令 g++ -std=c++11 test.cpp -lpthread
编译它,然后运行 strace -ttT ./a.out
以列出它的系统调用。这是输出:
22:08:52.424382 prlimit64(0,RLIMIT_STACK,NULL,{rlim_cur=8192*1024,rlim_max=RLIM64_INFINITY}) = 0 <0.000009>
22:08:52.424611 brk(NULL) = 0x55ca3968b000 <0.000009>
22:08:52.424725 brk(0x55ca396ac000) = 0x55ca396ac000 <0.000011>
22:08:52.424887 futex(0x7f0aad83909c,FUTEX_WAKE_PRIVATE,2147483647) = 0 <0.000010>
22:08:52.425070 futex(0x7f0aad8390a8,2147483647) = 0 <0.000010>
22:08:52.425246 nanosleep({tv_sec=1,tv_nsec=0},0x7ffcae110cb0) = 0 <1.000142>
22:08:53.425553 nanosleep({tv_sec=1,0x7ffcae110cb0) = 0 <1.000253>
22:08:54.425924 nanosleep({tv_sec=1,0x7ffcae110cb0) = 0 <1.000138>
22:08:55.426177 nanosleep({tv_sec=1,0x7ffcae110cb0) = 0 <1.000145>
22:08:56.426455 nanosleep({tv_sec=1,0x7ffcae110cb0) = 0 <1.000141>
22:08:57.426710 nanosleep({tv_sec=1,0x7ffcae110cb0) = 0 <1.000146>
22:08:58.426967 nanosleep({tv_sec=1,0x7ffcae110cb0) = 0 <1.000146>
现在我有一些问题:
- 为什么会有
futex
?据我所知,futex
是在 c++11 中实现线程互斥的较低机制,但我这里没有使用任何互斥,那么为什么会有futex
? - 我们可以看到有无限个
nanosleep
,那么是否意味着c++11代码std::this_thread::sleep_for(std::chrono::milliseconds(1000));
会导致模式从用户态切换到内核态? - 是否有更好的方法来检查哪些 C++ 代码/函数会导致模式切换,或者我必须使用命令
strace
?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)