多线程在差异进程或同一进程上运行?

时间:2012-03-21 11:41:37

标签: c# multithreading process

在我的.net多线程程序中,我想知道所有这些线程在同一进程或不同进程上运行? 如果它在同一个进程上,那么我假设一个进程在一个核上运行,那么多线程如何利用我在四核CPU中的所有四个核? 但是如果它是在不同的进程上,因为我知道不同的进程和相同的进程有不同的数据共享机制,那么为什么我不需要在我的多线程程序中编写不同的代码来处理它?有人会对此有所了解吗

我想问两个更类似的问题

当我打开任务管理器时,经常会看到大约800个线程和54个进程,而我的cpu使用率仅为5%,我被告知每个核心一次只能执行一个线程。 是我的cpu一直运行这800个线程,或者只是意味着800个线程正在排队,等待cpu处理? 如果我希望我的多线程程序完全利用我的四核cpu,我可以通过创建更多线程来提高CPU使用率(这似乎与一次只有一个线程一个核心的理论相矛盾)

4 个答案:

答案 0 :(得分:1)

多线程意味着同一进程中有多个线程 每个线程都可以分配给不同的核心。

但是所有线程都属于同一个进程,例如,如果其中一个线程抛出一个unhandeled异常,那么进程将崩溃并且所有线程崩溃。

您可以阅读一下,只需搜索谷歌或 Wikipedia - Software Multithreading

答案 1 :(得分:1)

单个进程可能使用多个线程;即使是一个基本的.NET“hello world”控制台exe也可能使用4或5.所以是的,单个进程可以使用所有可用的核心如果你这样写

因为它是相同的过程,所以数据共享是直接的,但是:如果要更改值,必须小心,否则可能会发生非常糟糕的事情。如果要更改线程代码中的数据,则必须仔细同步访问(lock等)。

执行,但通常必须编写不同的代码来支持多个线程。例外情况是框架正在为您执行 ,例如,ASP.NET或WCF可能会接收传入请求并将它们传递给不同的工作线程,即使您没有,也允许多个并发操作以这种方式明确地编码。这意味着在ASP.NET或WCF中,您需要小心共享状态,这完全是已经讨论过的原因。

作为次要补充,请注意一个进程可以支持多个AppDomain;在那种情况下,进程的线程由调度程序随心所欲地在所有AppDomain之间共享。

答案 2 :(得分:0)

该流程创建的线程是该流程的一部分。一个进程中的不同线程可以并且经常在不同的处理器或处理器核心上运行。

答案 3 :(得分:0)

  

在我的.net多线程程序中,我想知道所有这些线程   在相同的流程或不同的流程上运行?

线程总是在进程中运行,但是,多个线程可以在单个进程中运行,每个线程可以由不同的核心处理。

Threading

如果你有一个核心,并不意味着它不能运行多个线程,这只意味着核心不能执行多个线程同时。如果你看一下上面的图片,你会注意到:

  1. 线程#1执行一段时间。
  2. 线程#1“停止”。
  3. 线程#2执行一段时间。
  4. 线程#2“停止”。
  5. 线程#1再次执行一段时间。
  6. 这说明当核心运行多个线程时会发生什么:核心一次只执行一个线程,但为了使两个线程都运行,核心必须执行context switching。换句话说:核心运行来自线程1的一些命令,切换到线程2并从中运行一些命令,然后切换回线程1以执行更多命令。

    杂耍橘子:

    一个好的比喻是杂耍橘子:从技术上讲,你只有两只手,每次只能握住一只橙色,所以你可以容纳的最大值是两个橘子。在这种情况下,征税部分持有橘子。但是,如果你在空中投掷橙色,那么你可以握住第3个橙色而第2个橙色在空中。你扔橙子越高,你可以玩的橙子就越多。更确切地说:橙色回到手中所需的时间越长,你可以玩的橙子就越多。当然,你可能不会玩弄大量的橙子,因为投掷橙子需要的能量比简单地持有它更多。

    从本质上讲,你的CPU处理的是线程:线程远离执行CPU上的代码的时间越长,CPU就可以“耍弄”的线程越多。如果线程正在等待I / O(例如数据库请求),则CPU可以同时执行另一个线程的代码。这与您在任务管理器中看到54个进程和800个线程的原因相同:很多 这些线程正在处理不受CPU限制的事情。

    <强>睡眠:

      

    是我的cpu一直运行这800个线程,或者仅表示800   线程正在排队,等待cpu处理?

    您在任务管理器中注意到的许多线程都处于空闲/休眠状态,因此它们使用的CPU很少(如果有)。但是, 运行的那些是通过上下文切换执行的(如果线程多于核心,则大多数情况下都是这种情况)。有许多事情可以导致线程闲置/睡眠,请参阅橙色杂耍的例子。

    CPU利用率

      

    如果我希望我的多线程程序完全利用我的四核cpu,可以   我通过创建更多线程来提高cpu使用率(这似乎与...相矛盾)   理所当然,一次只有一个线程一个核心)

    它变得棘手:)。想象一下,除了橘子,你还有保龄球:这对你的手很费力,所以即使你尝试过,你也可能无法容纳2个以上的保龄球,更不用说玩弄第3个保龄球了。在最大载荷下,您只能握住任意数量的物体。对于CPU来说也是如此:在最大负载下,CPU只能执行与核心一样多的线程。

    您可以运行比核心数更多的线程的原因是因为线程没有在核心上施加最大负载。如果您的线程受CPU限制,即它们执行一些计算,并且它们对核心征税100%,那么您只能运行与核心一样多的线程。但是,CPU是计算机中最快的东西,并且您的线程可能正在访问计算机中比CPU(硬盘,网卡等)慢得多的其他部分,因此您可以运行更多线程。

相关问题