为什么说线程太多,cpu切换线程会浪费很多时间?

发布于 2022-09-13 00:39:18 字数 367 浏览 117 评论 0

一直不明白一件事情,说线程不宜开得太多,太多的线程会导致线程频繁切换,消耗cpu时间。但是对于操作系统来说,运行当中的线程肯定是大于1个,所以cpu也是一直在切换的。10个运行中的线程和20个运行中的线程,有什么区别?反正cpu都是一直在切换,这里假设线程的优先级都是一样的,并且都还是按照cpu的时间片轮转来切换线程。

第一种情况,10个运行中的线程a1-a10。cpu在a1-a10来回切换,切换了一轮,又重a1开始,重复切换,不断循环(假设任务一直执行)。

第二种情况,20个运行中的线程b1-b20。cpu在b1-b20来回切换,切换了一轮,又重b1开始,重复切换,不断循环(假设任务一直执行)。

以上两种情况对于cpu来说,都是一直在切换,在线程切换上消耗的时间不是一样的?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

临风闻羌笛 2022-09-20 00:39:18

我自己写了个回答:
https://www.cnblogs.com/ismal...

我早已燃尽 2022-09-20 00:39:18

线程切换本身也需要时间和其他资源
线程越多,这部分消耗就越大,留给线程运行的资源就越少

输什么也不输骨气 2022-09-20 00:39:18

要把大象装冰箱,需要三步:

  1. 打开冰箱门
  2. 把大象装进冰箱
  3. 关上冰箱门

你不能说【1】和【3】不是装冰箱的步骤吧。

同理,你这里说的【CPU切换线程】,不仅仅是【切换】而已:

  1. 保存线程【1】运行上下文
  2. 加载线程【2】运行上下文

这里的【保存】与【加载】的过程同样属于线程切换的过程中的步骤。

除非线程【1】和线程【2】同属一个运行上下文,同个进程里面的线程是会共享相同的虚拟内存和全局变量等资源的,所以同个进程之间的线程切换会消耗更少的资源。

这也是为什么与多进程相比,多线程更有优势的原因。

若无相欠,怎会相见 2022-09-20 00:39:18

首先需要理解,CPU执行代码,是需要把数据加载到CPU缓存中去的,切换1次线程,CPU就要从外部重新加载一次数据,而且还要把上一次执行的线程的所有数据的快照保存起来(上下文),和CPU缓存相比,CPU访问内存和磁盘的速度特别慢,所以一般来说,不愿意频繁切换线程执行。

太多的线程会导致线程频繁切换,消耗cpu时间。这句话其实要分场景,看线程的任务是IO密集还是CPU密集的。

如果是IO密集,例如请求外部网络数据,耗时都在几十毫秒,这种任务,适合多开点线程,CPU切换线程耗费的时间,不值一提。

如果是CPU密集,一般是CPU核心数量的线程比较好,减少CPU切换线程上下文,能提高速度。

所以需要具体问题具体分析。

关注我的博客: https://www.epoooll.com/

欲拥i 2022-09-20 00:39:18

CPU调度的原则要保证绝对的公平。这是前提。

单核情况下:
单位时间内,单线程模式只需要干活,多线程模式不仅要干活还要切换线程。

多核情况类似:
单位时间内,核心数<=任务数只需要干活,否则不仅要干活还得切换线程。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文