gpt4 book ai didi

linux - 为什么 Linux 不使用纤程而不是抢占式多任务处理?

转载 作者:可可西里 更新时间:2023-11-01 11:43:36 27 4
gpt4 key购买 nike

  1. 谁能解释一下什么是协程和fibers是?相比之下,他们解决了什么问题常规例程和多任务处理机制。
  2. 为什么 Linux 使用抢占式多任务而不是协作式多任务处理?

最佳答案

协程、纤程及其同类产品是由编程语言运行时或库管理的类似线程的执行上下文,而不是操作系统,操作系统将它们视为一个整体。它们的用途有限;当真正的线程可用时,头脑正常的人不会使用这样的技巧。

简单地说,Linux 使用抢占式多任务处理。与早期的 Unix 一样,早期的 Linux 使用协作式多任务处理来运行内核代码。这意味着进程可以在执行用户空间时被抢占,但不能在执行内核代码时被抢占。在运行内核代码时,一个进程只有在休眠时才会被取消调度以运行另一个进程,这是通过主动调用一些休眠的阻塞函数来实现的。这种方法极大地简化了操作系统内部结构,因为很多竞争条件都消失了。至少,如果只有一个处理器。运行内核代码的任务只需要担心中断,当它们不方便时可以暂时禁用它们。

随着 1990 年代中期在实验性 Linux 1.3 内核系列中引入对多处理器的支持,这种情况开始发生变化。非抢占式内核不能很好地支持 SMP,因为要保持协作多任务处理的保证,必须在内核周围放置一把大锁,一次只允许一个处理器进入。在 Linux 中,这被命名为 BKL(大内核锁)。

逐渐地,BKL 不再对所有进入内核的条目强制执行,并被更细粒度的 SMP 锁所取代。一旦您有多个处理器同时在内核空间中运行,就会出现一个有趣的情况:真正的并发正在进行,受到锁定机制的保护,但内核仍然是合作的,因为任何任务都不会丢失它正在运行的处理器除非它 sleep 。

在这一点上,只允许抢占是有意义的。因此,它以选项 CONFIG_PREEMPT 的形式被纳入内核,该选项已试验多年,并且往往无法在所有架构和与 SMP 的结合中始终如一地工作。

为什么希望内核是可抢占的只是因为它允许更好的实时处理:更短的事件响应时间。虽然抢占是有风险的,但大多数问题都是通过提高 SMP 效率来解决的,这往往会降低采用抢占的阈值:也就是说,这不是“为什么、为什么”的问题,而是“为什么不”的问题。

关于linux - 为什么 Linux 不使用纤程而不是抢占式多任务处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16765736/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com