- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
最佳答案
协程、纤程及其同类产品是由编程语言运行时或库管理的类似线程的执行上下文,而不是操作系统,操作系统将它们视为一个整体。它们的用途有限;当真正的线程可用时,头脑正常的人不会使用这样的技巧。
简单地说,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/
我写了一段代码,其中有一个数据: unsigned char buf[4096]; // data in chunks of size 4k unsigned counter[256]; 我将每 3
这个问题已经有答案了: Ajax too slow - Recursion (1 个回答) 已关闭 5 年前。 所以这件事在我脑海里思考了很长时间,是否 AJAx 中给出的计时器在它必须发送另一个请求
据我所知,在 Linux 中有许多机制可以实现 bottom-halves: 软中断 任务 工作队列 线程中断 ( request_threaded_irq() ) 它们在可调度性方面都有自己的特点。
根据这个问题here使用 pthread_spin_lock 锁定关键部分是危险的,因为线程可能会被调度程序中断,而其他线程可能会在该资源上保持旋转状态。 假设我决定从 pthread_spin_lo
从SLF4J页面我明白了这一点 The purpose of slf4j-log4j12 module is to delegate or redirect calls made to an SLF4
我在我的项目中使用了 xuggle library 将视频从 mp4 转码为 flv。我也使用 slf4j 库 来支持日志结束。 import com.xuggle.mediatool.IMediaR
我是一名优秀的程序员,十分优秀!