C#中的处理器,内核和各种其他功能

时间:2012-05-19 05:24:48

标签: c# .net

我正在编写一个资源密集型应用程序,我正试图找到一种方法让所述应用程序的用户决定应用程序应该使用的资源。

这里的部分问题是知道CPU能够做什么 - >我想如果用户希望该应用程序在AMD Phenom II X6上使用5个核心,我可以放弃将所有内容扔到这5个核心上。另一方面,如果处理器是Intel i7或AMD FX-8510,则其中一些内核共享各种组件。那么我应该做些什么,以确保我没有意外地向超线程调度程序安排某些事情,或者那种程度上的事情?

我正在努力避免CPU窒息的情况,因为我把所有东西扔到错误的部分(这是一个老问题)。有任何想法吗?

1 个答案:

答案 0 :(得分:1)

操作系统中的线程调度程序具有所需的所有信息(物理CPU核心数,逻辑核心共享资源,核心停放到安全能量,启用超线程,哪些核心使用turbo频率,另一个使用哪些资源)程序等...)有效的CPU资源分配。您的程序对这些事情一无所知,因此您可以做的最好的事情是让操作系统决定如何分配资源。即使您的程序没有任何特殊支持,用户也可以通过设置进程优先级或处理器关联来限制程序使用的资源。

您可以尝试的一件事是根据CPU核心数(由Environment.ProcessorCount返回)创建线程数。如果您为每个物理核心调度一个线程(而不是每个逻辑核心一个线程)的性能会更好,那么您可以使用Process.GetCurrentProcess()。ProcessorAffinity属性 - 在具有超线程的CPU上将其设置为0x55555555,但这也可以使比以前更糟糕的事情(如果未来的某个CPU每个物理核心有3个逻辑核心而不是2个,或者如果另一个程序将处理器亲和性设置为相同的核心怎么办?)。