加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

如何为Windows上的一个线程保留核心?

发布时间:2020-12-14 04:30:28 所属栏目:Windows 来源:网络整理
导读:我正在研究一个非常时间敏感的应用程序,该应用程序在检测到发生了更改时轮询共享内存区域.变化很少,但我需要尽量减少从变更到行动的时间.鉴于变化的频率很低,我认为CPU缓存变冷了.有没有办法为我的轮询线程保留一个核心,以便它不必与其他线程竞争缓存或CPU?
我正在研究一个非常时间敏感的应用程序,该应用程序在检测到发生了更改时轮询共享内存区域.变化很少,但我需要尽量减少从变更到行动的时间.鉴于变化的频率很低,我认为CPU缓存变冷了.有没有办法为我的轮询线程保留一个核心,以便它不必与其他线程竞争缓存或CPU?

解决方法

仅线程关联(SetThreadAffinityMask)是不够的.它不保留CPU核心,但它反过来,它将线程绑定到您指定的核心(这不是一回事!).

通过约束CPU亲和性,可以降低线程运行的可能性.如果具有较高优先级的另一个线程在同一个核心上运行,则在完成其他线程之前不会调度您的线程(这是Windows调度线程的方式).
在不约束亲和力的情况下,您的线程有可能被迁移到另一个核心(最后一次作为该决策的度量运行).线程迁移是不可取的,如果它经常发生并且在线程运行后(或者在它运行时)很快就会发生,但如果自上次调度后已经过了几十毫秒,则它是一种无害的,有益的事情(缓存将被覆盖然后无论如何).

你可以“通过”赋予它一个更高优先级的类来确保你的线程运行(不保证,但很可能).如果你随后使用SetThreadAffinityMask,你有可能在大多数常见的桌面CPU(通常是VIPT和PIPT)上保持缓存总是很热.对于TLB,你可能不那么幸运,但你无能为力.

高优先级线程的问题在于它会使其他线程饿死,因为调度已经实现,因此它首先提供更高优先级的类,并且只要不满足这些优先级,下级类就会变为零.因此,在这种情况下的解决方案必须是阻止.否则,您可能会以不利的方式损害系统.

试试这个:

>创建一个信号量并与其他进程共享
>将优先级设置为THREAD_PRIORITY_TIME_CRITICAL
>阻止信号量
>在另一个进程中,在写入数据之后,在信号量上调用SignalObjectAndWait,超时为1(甚至超时为零)
>如果你愿意,你可以尝试将它们绑定到同一个核心

这将创建一个线程,它将是第一个(或第一个)获得CPU时间的线程,但它没有运行.当编写器线程调用SignalObjectAndWait时,它会自动发出信号并阻塞(即使它等待“零时间”足以重新安排).另一个线程将从信号量中唤醒并完成其工作.由于其高优先级,它不会被其他“正常”(即非实时)线程中断.它会一直占用CPU时间直到完成,然后再次阻塞信号量.此时,SignalObjectAndWait返回.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读