关于多线程与CPU时间片

几个知识点
  • 进程是操作系统分配资源的基本单位,很明显在 /proc/pid目录下你可以看到每一个进程的详细信息,资源情况,但是你却找不到线程的资源信息,那是因为线程是共享了进程的资源。
  • 线程是操作系统调度的基本单位,我们打开top命令看到的 tasks 数就是线程数。
  • CPU时间片是有操作系统来调度和管理的,它是将每一个线程任务分配到CPU的某一个核心上,并允许该线程执行一定的时间(比如100ms),超过了这个时间此线程就会被切出来,放到就绪队列的尾部,等待下一次被调度。
  • 一个操作系统自身就运行着很多线程,当然很多线程都处于sleeping状态,你打开top就能看到,running 个数就决定了CPU是否在忙碌。
  • 在多核操作系统上,可以并行运行多个任务,可以理解为有多个消费者。
  • 当需要运行的任务数小于等于逻辑CPU的个数,那么就不需要任务切换。
  • 各个逻辑CPU的使用情况并不是均等的。
增加线程数意味着什么

我们往往想通过启动更多的线程来使程序更加有效率,本质上是使当前程序抢占到更多的CPU执行时间。

假设我的操作系统比较安静,正在运行的任务只有10个,此时我的程序有一个线程,那么根据CPU的时间片轮转原则,我的程序总共占用 1/11 的CPU时间,4个线程对应 4/14,100个线程对应 100/110,可见是无限接近于1的,而且越往后面线程数的增加对CPU的占有率的影响越有限,并且,线程数还跟其他的任务的总数是有关系的,比如讲10换成1,结果又不一样。

所以线程数并不是越多越好,而是取决于整个的系统环境。

有人说,线程数过多会造成更多的上下文切换,所以不建议设置的多大。我觉得这个理由不对,对于一个正常的运行着的操作系统,活跃的线程数可能是CPU核心数的几倍或十几倍,操作系统按照时间片来切换任务,也就是说,任务的上下文切换本来就一直在进行,即使我不启动我的程序。所以,并不是说我的程序的线程数多了,这个切换过程就多了。显然你的程序开启了太多线程,会导致其他程序都很难得到CPU资源。

但是总体的线程数过多肯定会大幅增加操作系统的调度压力,甚至会让操作系统没法正常运行。如果CPU负载很高,那么所有的任务都会堆积在操作系统这边,都会出现卡顿延迟的情况。

所以线程数到底开多少这个完全取决于当前的机器,而且是一个测试后的结果,不同的机器以及操作系统处于不同的繁忙程度下表现也不一样。普遍的观点是你的程序启动的线程总数为逻辑CPU的2倍到3倍,如果大家都按照这个原则的话,那你的机器上就不会出现恶意的抢占CPU的情况,是一个健康的情况。

这里讨论的线程数是出于提高性能的,让程序执行的高效一些,如果你的程序开启多线程的目的是为了实现更多的功能,那就不在讨论的范围。

在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值