[转]关于Linux下时间片分配给进程还是线程的问题

技术_编程语言 专栏收录该内容
128 篇文章 0 订阅

原文地址:https://www.zhihu.com/question/64723752/answer/223613245
 

在Linux系统中,对于用户创建的进程(线程)来说,CPU分配时间片的单位是线程还是进程?

是线程。线程是实际工作的单元[1],进程只是一个容器,用来管理一个或多个线程。

1.这是不是就意味着尽量使用多线程并发,这样可以抢到更多的时间片。

理论上是的,多线程的一种用途就是能同时做好几件事情,以提高效率。但实际问题是,CPU的数量(核心数,下同)是有限的,而且并不多。如果你的CPU有8个CPU,并且整个系统中有8个线程的话,不考虑中断等因素,每个线程理论上能一直执行下去。然而多于8个线程以后,操作系统就必须进行调度,也就是分配时间片。具体的分配方案,或者说调度算法有很多种,详情参见Scheduling (computing)。如果一个进程创建了很多线程的话,最多也只有8个能够处于执行的状态[2],其余的线程必须等待调度。线程被调度的时候需要进行上下文切换,这个操作是一种额外的开销。线程数量过多的时候,上下文切换产生的额外开销会对系统的效率造成负面影响。

2.操作系统对于拥有多线程的进程,是否会减少其每个线程的时间片,或做其他处理来保证公平性?

这就是调度算法需要考虑和优化的问题。比如线程和进程有优先级,在抢占式的调度中,优先级高的线程可以从优先级低的线程那里抢占CPU。另外,在多CPU平台上,调度算法还要考虑缓存的关联性等。

在一个进程中的多个线程要注意在可能的情况下将本线程阻塞,将剩余的时间片让给兄弟线程。

在主流的操作系统实现里,一般进程是不能直接控制自己的线程的执行顺序的。也就是说,把一个线程挂起并不能保证另一个线程一定能够被执行。

注1:Linux内核其实不区分进程和线程,内核把执行单元叫做任务(task)。操作系统实际上调度的是进程,进程通过fork()来创建同样的另一个进程。每个进程有一个PID,同一组进程中最先启动的那个还有一个TGID。严格来说前者应该叫线程ID,后者应该叫进程ID。Linux里的线程实际上是共享一些资源的一系列进程而已。不过这里面要展开讲的话就又能写一篇回答了,就先讲这么多吧。

注2:这里说的是物理线程,有别于逻辑线程。

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值