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

标签 linux multithreading multiprocessing kernel coroutine

  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/

相关文章:

ios - 解决iOS ARM弱内存写排序的内存障碍?

python - 多处理 + 请求挂起,出现异常 AttributeError : 'file' object has no attribute 'out'

android - 错误: Failed to find 'ANDROID_HOME' environment variable when building apk using ionic

java - 解决 Exception in thread "main"java.lang.NoClassDefFoundError in Linux

c - 在 Linux 上编写 PID 文件

ruby-on-rails - 防止ffmpeg接管stdout

java - 在处理大数据时如何确保您的代码按预期工作?

c++ - 如何决定是否使用超线程?

linux - 如何使用 Linux 系统调用检测何时按下某个键

python - 在多处理或多线程应用程序中保留 cpu 时间