c++ - 如何检测c++的哪些代码导致模式切换
问题描述
我试图弄清楚哪些 c++ 代码会导致 Linux 上的模式切换(用户模式到内核模式)。我知道两件事:
- 系统调用导致模式切换:模式切换是否发生从用户线程切换到内核线程?
- 该命令
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, FUTEX_WAKE_PRIVATE, 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, tv_nsec=0}, 0x7ffcae110cb0) = 0 <1.000253>
22:08:54.425924 nanosleep({tv_sec=1, tv_nsec=0}, 0x7ffcae110cb0) = 0 <1.000138>
22:08:55.426177 nanosleep({tv_sec=1, tv_nsec=0}, 0x7ffcae110cb0) = 0 <1.000145>
22:08:56.426455 nanosleep({tv_sec=1, tv_nsec=0}, 0x7ffcae110cb0) = 0 <1.000141>
22:08:57.426710 nanosleep({tv_sec=1, tv_nsec=0}, 0x7ffcae110cb0) = 0 <1.000146>
22:08:58.426967 nanosleep({tv_sec=1, tv_nsec=0}, 0x7ffcae110cb0) = 0 <1.000146>
现在我有一些问题:
- 为什么会有
futex
?据我所知,futex
在 c++11 中实现线程互斥锁的较低机制是什么,但我在这里没有使用任何互斥锁,为什么会有futex
呢? - 我们可以看到有infinite
nanosleep
,那么这是否意味着c++11代码std::this_thread::sleep_for(std::chrono::milliseconds(1000));
会导致模式从用户模式切换到内核模式呢? - 有没有更好的方法来检查哪些 c++ 代码/函数会导致模式切换或者我必须使用命令
strace
?
解决方案
推荐阅读
- firebase - 我可以使用这个 Firebase 函数调用从存储中获取图像吗?
- elasticsearch - 版本 1.7 Elasticsearch 的 TooManyClauses 错误
- swift - Swift:UIStackView 中的文本视图不显示
- kotlin - 如何在运行时调整 Kotlin Exposed 中的表名
- python - AttributeError:模块“torch.optim”没有属性“RMSProp”
- c# - ASP.NET MVC - 发送到控制器的值在视图中为空
- angularjs - 如何让 ng-click 在 AngularJs 中工作
- python - 存储价值
- api - 使用 SwashBuckle 为版本化 API 生成 swagger JSON 文件时删除部分 URL 路径
- vue.js - 电子制造商不打包模块?