当前位置:  开发笔记 > 运维 > 正文

多核用法,线程,线程池

如何解决《多核用法,线程,线程池》经验,为你挑选了2个好方法。

我对多线程编程和多核使用有一些疑问.

特别是我想知道操作系统和/或框架(这是.NET)如何处理大量使用的核心.

这是关于线程的问题:

当产生新线程时,将线程分配给特定核心的算法是什么?

    循环型算法

    随机

    目前使用最少的核心

如果不是当前最少使用的核心,那么确定这种类型的代码是否会使线程的典型使用相形见绌,从而使事情变得更糟?

线程在生命周期内是否从一个核心移动到另一个核心?如果是这样,这是否会处理由于某种原因"过度使用"的内核,因此操作系统会尝试将线程混洗到较少使用的内核以帮助系统?如果不是,为什么不呢?

我的最后一个问题,基本上是上面的重用,是关于.NET ThreadPool类,它处理诸如.BeginInvoke之类的东西.这堂课有没有做过这些?如果没有,为什么不,或者应该呢?

有没有办法调整这个处理,在操作系统上提示这个特定的线程,当你为它分配一个核心时请多关注它,因为我知道它会使用很多cpu.那会有意义吗?或者"很多cpu"只是相对的,因此不够好?



1> jalf..:

当产生新线程时,将线程分配给特定核心的算法是什么?

这完全取决于操作系统.答案通常是经过大量修改的循环方案.每隔x毫秒,一个核心被中断,并在其上放置一个新线程(因此没有"最少使用的核心".只要有线程准备好运行,每个核心都有事情可做).

在Windows中,我相信始终选择最高优先级的线程/进程来执行.(因此,如果在单核系统上有一个进程以高优先级运行,那么该进程可能会在100%的时间内运行,从而使每个其他进程无法运行.当然,这仅适用于该进程从不阻塞的情况,这在现实中.

当然,因为像Windows这样的现代操作系统很复杂,所以它还有很多.某些流程会不时给予优惠待遇,但根据经验,Windows将始终选择高优先级流程(这就是为什么您可以通过在单一时间内提供流程"实时"优先级来冻结您的计算机的原因)

在Linux下,低优先级流程也会定期安排,而不是经常安排.

但是你能做的最好的事情通常只是假设操作系统会制定一个公平的方案,然后尝试与系统的其余部分一起玩.(当你无事可做时,产生/阻止/睡眠,允许其他线程运行).

线程在生命周期内是否从一个核心移动到另一个核心?

当然.想象一下,您在双核系统上运行了三个线程.向我展示一个公平的时间表,不涉及在核心之间定期移动线程.

我的最后一个问题,基本上是上面的重用,是关于.NET ThreadPool类,它处理诸如.BeginInvoke之类的东西.这堂课有没有做过这些?如果没有,为什么不,或者应该呢?什么东西?线程调度和选择要运行的核心?不,线程池只是一种机制,可以为多个任务重用线程,而不必为每个任务创建一个新线程,然后再关闭它.

有没有办法调整这个处理,在操作系统上提示这个特定的线程

这就是线程/进程优先级的用途.如果你有一个必须获得大量CPU时间的线程,即使有其他CPU密集型线程在运行,也要提高线程的优先级.但要小心处理.通常,没有很多CPU密集型线程在运行,这意味着即使在正常优先级下,您也将获得99.9%的CPU时间.正如我所说,Windows非常积极地安排更高优先级的线程,所以只有提升优先级才真正意味着它.


据我所知,Windows使用降级抢先优先级驱动的调度程序; 高优先级线程暂时降级,以防止它们完全饿死低优先级线程.

2> Marc Gravell..:

除了jalf优秀而全面的答案之外,请记住"并行扩展"(应该归入.NET 4.0)有很多代码专门用于将工作(从队列)均匀分配到核心,包括工作窃取,以及潜在的像是关心哪些核心"最接近"作品所在的记忆.

因此,使用.NET 4.0,使用类似的东西Parallel.For,你应该免费获得很多这样的东西.一般来说,操作系统非常聪明,只是从局外人的角度来看.jalf已经提供了很多关于幕后发生的细节,但大多数时候你不需要这个级别的细节,除非你用高度线程代码解决一些性能问题.

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有