在我的 .net 多线程程序中,我想知道所有这些线程
运行在同一个进程还是不同进程上?
一个线程总是在一个进程中运行,但是,多个线程可以在一个进程中运行,并且每个线程可以由不同的内核处理。
如果你只有一个核心,并不意味着它不能运行多个线程,它只是意味着这个核心不能执行多个线程同时。如果你看一下上面的图片,你会注意到:
- 线程 #1 执行了一段时间。
- 线程 #1 “停止”。
- 线程 #2 执行了一段时间。
- 线程 #2 “停止”。
- 线程 #1 再次执行了一段时间。
这说明了当一个核心运行多个线程时会发生什么:核心一次只执行一个线程,但是为了让两个线程都运行,核心必须执行context switching。换句话说:核心从线程 1 运行一些命令,切换到线程 2 并从中运行一些命令,然后切换回线程 1 执行更多命令。
杂耍橘子:
一个很好的比喻是玩橘子:从技术上讲,你只有两只手,每只手一次只能拿着一个橘子,所以你最多可以拿着两个橘子。在这种情况下,征税部分正在持有橙子。然而,如果你把一个橙子扔到空中,那么你可以在第二个橙子在空中的时候拿着第三个橙子。你把橘子扔得越高,你可以玩的橘子就越多。更准确地说:橙子回到你手中的时间越长,你可以玩弄的橙子就越多。当然,你可能无法同时处理大量的橙子,因为扔橙子比拿着它需要更多的能量。
本质上,您的 CPU 正在处理线程:线程在 CPU 上执行代码的时间越长,CPU 可以“处理”的线程就越多。如果一个线程正在等待 I/O(例如数据库请求),那么 CPU 可以同时执行另一个线程的代码。这和你在任务管理器中看到 54 个进程和 800 个线程的原因是一样的:很多
这些线程中有一些正在做不受 CPU 限制的事情。
睡觉:
是我的 CPU 一直在运行这 800 个线程,还是只意味着 800
线程正在排队,等待 cpu 处理?
您在任务管理器中注意到的许多线程都处于空闲/睡眠状态,因此它们使用的 CPU 很少(如果有的话)。但是,正在运行的 会在上下文切换的情况下执行(如果线程数多于内核数,这是大多数情况下的情况)。有很多事情会导致线程空闲/休眠,以橙色杂耍为例。
CPU 利用率:
如果我想让我的多线程程序充分利用我的四核 cpu,可以
我通过创建更多线程来提高 cpu 使用率(这似乎与
理论上一次只有一个线程一个核心)
它变得棘手:)。想象一下,你有保龄球而不是橘子:这对你的手来说非常费力,所以即使你尝试过,你也可能无法握住超过 2 个保龄球,更不用说玩第三个了。在最大负载下,您只能握住与您的手一样多的物体。 CPU 也是如此:在最大负载下,CPU 只能执行与内核一样多的线程。
您可以运行比内核数更多的线程的原因是线程没有将最大负载放在内核上。如果您的线程受 CPU 限制,即它们执行一些 繁重 计算工作并且它们对核心 100% 征税,那么您只能运行与核心一样多的线程。但是,CPU 是您计算机中最快的东西,您的线程可能正在访问计算机中比您的 CPU 慢得多的其他部分(硬盘、网卡等),因此您可以运行更多线程。