C#多进程多线程服务和Windows调度程序

时间:2016-11-10 08:58:37

标签: c# windows multithreading process scheduler

我开发了一个Windows服务,很快就能管理数千个远程设备。 目前它由两个precesses组成,每个都有几百个线程(我们可以讨论减少线程数量的机会,但这不是重点),并且所有工作都很好。 现在我试图在一个进程中加入所有线程来简化线程之间的数据交换,但是现在发生的是现在所有线程都运行得更慢(在某些情况下似乎某些线程的运行频率低得多)。 所以我的问题是:与多进程/多线程应用程序相比,预计windows调度程序在单进程/多线程应用程序上的工作方式不同吗?

一些简单的例子: - 单核CPU - 2个线程(A和B) - 线程A正在执行一项非常长的任务,而线程B正在休眠 - 现在是时候唤醒线程B,但线程A仍在运行

我的猜想: - 在单进程/多线程上,调度程序强制线程B进入休眠状态并延迟其唤醒 - 在多进程/多线程上,如果A属于进程1而B属于进程2,则调度程序在预期时唤醒线程

可能是吗? 有没有建议在一个进程中加入所有线程而没有麻烦?

抱歉我的英语不好。

修改 按照Luaan的建议,我正在分析应用程序以检查GC行为。这是我在45秒时间段看到的内容: enter image description here 一些问题: - 为什么13.000.000ms在这里? - 为什么要在这里睡觉?

编辑2 最后我解决了我的性能问题:正如我所说,我在服务中使用了数百个线程。我已经重写了代码的某些部分,以便在几个主线程中对旧线程进行分组,现在我使用8个主要工作线程来完成大部分工作(大约50个线程,包括辅助线程)...而且现在神奇的是服务运行使用一半的CPU。 也许问题也与GC活动有关,但我认为大多数问题都是由于我的线程的上下文切换开销。

编辑3 由于一些小的性能问题仍在继续,我使用PerformanceCounter对象检查了GC加载,你是对的:当GC使用大约99%的cpu时间时,我的线程会挂起。我怎么解决?现在我正在尝试将GC设置为服务器模式。

1 个答案:

答案 0 :(得分:0)

首先,CPU核心和线程是无关的。内核决定如何在逻辑CPU之间划分线程。逻辑CPU越低,上下文切换就越多,整个过程就会减慢,但它仍然是多线程的。

如果您想与其他线程通信,那么正常的过程就是使用主应用程序线程订阅的事件来执行此操作。然后,您可以决定如何处理此信息。

除非您专门使用处理器关联掩码,否则您不应该关心内核如何在逻辑CPU上划分线程,因为它会自动执行此操作。