微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在debugging时,单个线程应用程序是否会在内核之间跳转?

我正在尝试使用Eclipse CDT来debugging多体系结构的OSS程序(沙箱configuration下的DAS u-boot引导装载程序 – 它生成标准的linux可执行文件)。 我喜欢它如何呈现的东西(精彩的GUI工作!)。 例如,它显示了这样的线程,

Thread [1] 9480 [core:2] (Suspend:Step)

当我运行程序时,“核心号码”会改变(在Intel i3上运行时,值在0和3之间)。 这最初导致我相信debugging器向我展示了应用程序的不同处理上下文(即,我认为它在所有4个处理器内核上运行)。 我花了很多时间试图安装“多核gbddebugging器”并对其进行configuration,但最后不得不承认失败。

当我回到问题的一个周末后,我注意到,虽然“核心号码”会改变,线程ID没有(此外,我找不到(在源代码中) fork() (或类似的)系统调用正在从)。

我目前的理论是,该程序确实是作为一个单线程应用程序运行,但出于我不明白的原因,喜欢在我的系统的不同处理器内核之间跳跃。

Wndproc处理事件less代码

更高效地使用fork()和copy-on-write内存共享

控制台+ Windows“窗体

包含WinAPI(Win8)组件的WPF应用程序

距离UTC – Linux上的LocalTime

我的问题如下:

我目前的理论是正确的吗?

如果是这样的话,我可以期待在debugging环境之外运行__any__单线程应用程序的这种行为吗?

从优化angular度来看,在内核之间移动时会有一些上下文切换,即使是单线程的应用程序也是如此。 是否有任何实际的好处跳跃?

C# – 生成一个随机数到一个字段

如何在不打开的情况下获得最大文件的大小?

将parameter passing给我的lua dll函数

在程序结束时,类的静态实例不能正确处理资源删除

检测麦克风何时拔出

这取决于。

发生什么事是调度程序选择最好的cpu(让我们把它定义为任何一个:物理cpu,核心,超线程),让你的进程运行取决于很多变量。 通常情况下,调度程序将尝试在同一个cpu上保留进程,以避免cpu间的高速缓存和TLB未命中,但是必须在将进程移动到之前没有运行的cpu的成本和等待以前的cpu变得可用的成本。

假设您的进程X正在cpu 0上运行,由于某种原因(等待锁定或I / O或被抢占,因为它使用了太多的cpu以及其他一些进程需要运行),它变成了不可运行的。 Y开始在cpu 0上运行另一个进程。出于某种原因,进程X可以再次运行。 cpu 1空闲。 现在调度程序可以做出四个可能的决定:

等待进程Y完成运行,然后在cpu 0上运行进程X.

抢占进程Y,在cpu 0上运行进程X,将进程Y移动到cpu 1。

抢占进程Y,运行cpu 0上的进程X直到停止运行,恢复cpu 0上的进程Y.

cpu 1上运行进程X.

不同操作系统中的不同调度器将做出不同的决定。 有些人喜欢所有进程的低延迟,而不考虑切换到另一个cpu的成本,所以他们总是选择4.有些人喜欢强亲和力,所以他们会选择1.在许多情况下,调度程序会对有多少缓存进行有根据的猜测状态进程X已经留在了cpu 0上,并且决定,因为进程被暂停了一段时间,所以它可能没有在cpu 0上留下那么多的高速缓存/ TLB,并且将其移动到一个不同的cpu。 许多人会考虑内存总线布局,并计算移动过程的成本,在你的情况下,也许调度人员知道,这是很便宜的举动。 调度程序还可以尽力猜测进程Y的行为方式,如果可能很快完成运行,可能会等待它完成。 等等

一般来说,除非你真的需要从应用程序中挤出性能的最后一个纳秒,否则不需要担心。 调度程序将做出足够好的决定,如果不行的话,对于大多数应用程序来说都不会有太大影响。 就你所需要知道的,在大多数情况下,你的过程是在每个指令之间的某个cpu之间移动的,而从不是。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐