我的应用程序运行了很多任务。其中大多数是CPU密集型的
一个任务(实际上是一个在循环中运行的单个线程,监听来自网络的数据包),是一个非常实时的"任务。为了使它更有趣,该线程是使用pinvoke
调用的本机代码。
当显示大量流量时,任务正在非常努力,并且所有核心都在最大化。当发生这种情况时,"实时"线程(在100%cpu核心上运行)开始丢弃数据包,因为它没有足够的CPU时间。
有可能以某种方式"保留"实时"实时"线程,并将所有其他线程(任务)限制到其他核心?
编辑 - 回答许多有用的评论:
答案 0 :(得分:2)
您可以为进程和线程指定关联掩码。这允许您阻止使用特定处理器的调度程序。因此,您可以将一个线程的线程关联掩码设置为单个处理器,并将所有其他线程的线程关联掩码设置为除保留处理器之外的所有处理器。由于.net使您无法直接创建系统线程,因此在所有系统线程上强加必要的掩码实际上并不容易。
说服调度程序为您的关键线程提供特殊处理的另一种方法是提高其优先级。这是你应该谨慎和重要的预见。但是,这是一种更简单的方法,可以确保您的线程永远不必等待进程中的其他线程。
也许你的应用程序使用比处理器更少的线程更好,但为关键工作创建一个专用线程。这样你可以避免任何亲和力掩码或优先级skullduggery并让系统的线程调度程序为你工作
答案 1 :(得分:1)
是。该概念称为处理器关联性",并且存在于进程级和线程级。调用它有点尴尬,但没什么可怕的:How Can I Set Processor Affinity in .NET?
请注意,您必须为您看到的所有线程设置亲缘关系。但是,您不是线程的唯一创建者 - 像ThreadPool
和GC这样的东西也有一些线程。我并不认为混淆那些是一个好主意,但ProcessThread
课程不会主动阻止你这样做。