首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >标记为顶部热点的sched_yield

标记为顶部热点的sched_yield
EN

Stack Overflow用户
提问于 2021-07-29 11:57:42
回答 1查看 167关注 0票数 0

在使用Vtune分析程序时,我看到libc函数sched_yield被标记为一个重要的热点。

现在我看到这个函数大致负责上下文切换;我说大概是因为这是我第一次遇到这个函数,所以我的理解是它运行在OS调度器中,以提供对更改活动线程的支持。

sched_yield作为主要热点对我的程序意味着什么?这是否意味着我要创建比我应该创建的更多的线程,并且操作系统正在尝试处理连续的上下文切换?

什么是解决这种情况的良方?可能会求助于更集中的线程池,以避免过度生成线程?

接下来我该分析什么?在这种情况下,是否有“典型的”下一步?维特已经建议对“线程”进行分析。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-29 17:09:39

sched_yield作为主要热点对我的程序意味着什么?

在Linux上,sched_yield不一定切换到另一个线程执行。如果没有可以在同一个CPU上运行的线程,内核就不会释放调用线程。最后一部分很重要,因为内核不会在这个调用时重新安排CPU之间的线程。这是一种设计权衡,因为sched_yield应该是内核的一个低成本提示。

因为sched_yield可能会立即返回而什么都不做,所以您的代码可能在这个调用周围有一个繁忙的循环,这看起来就像是概要文件中的一个热点。您的代码只是在sched_yield上循环了很多,而没有做太多其他工作。这样的旋转会消耗大量的CPU周期,可以用于运行在系统上的其他线程和应用程序。

什么是解决这种情况的良方?

这很大程度上取决于您的用例。当您愿意浪费一些CPU周期以换取更好的延迟时,使用sched_yield可能是可以接受的。您必须意识到这个决定,即使这样,我还是建议使用适当的线程阻塞来测试不同的解决方案。Linux线程调度程序非常高效,因此阻塞和唤醒线程并不像在其他系统上那样昂贵。

自定义自旋锁算法中经常使用sched_yield。我建议用线程组件(特别是pthread_cond_t )替换这些组件,这些组件允许正确地阻塞和唤醒线程。如果您使用的是C++,那么标准库中有一些等价项(例如,std::condition_variable)。在其他情况下,可能值得研究其他阻塞API,如selectepoll。确切的解决方案取决于您的用例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68575478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档