如何检测c++的哪些代码导致模式切换

问题描述

我试图找出哪些 C++ 代码会导致 Linux 上的模式切换(用户模式到内核模式)。我知道两件事:

  1. 系统调用导致模式切换:Is mode switch occur switching from user thread to kernel thread?
  2. 命令 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>

现在我有一些问题:

  1. 为什么会有futex?据我所知,futex 是在 c++11 中实现线程互斥的较低机制,但我这里没有使用任何互斥,那么为什么会有 futex
  2. 我们可以看到有无限个nanosleep,那么是否意味着c++11代码std::this_thread::sleep_for(std::chrono::milliseconds(1000));会导致模式从用户态切换到内核态?
  3. 是否有更好的方法来检查哪些 C++ 代码/函数会导致模式切换,或者我必须使用命令 strace

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...