smw*_*dia 28 linux linux-kernel multitasking
我读到Linux内核是先发制人的,这与大多数Unix内核不同.那么,核心先发制人意味着什么呢?
一些类比或例子比纯粹的理论解释更好.
pra*_*tri 26
在Linux内核版本2.5.4之前,Linux内核不抢占,这意味着在内核模式下运行的进程无法移出处理器,直到它自己离开处理器或开始等待某些输入输出操作完成.
通常,用户模式下的进程可以使用系统调用进入内核模式.以前,当内核是非抢占式时,优先级较低的进程可以通过重复调用系统调用并保留在内核模式中来拒绝对处理器的访问来优先反转更高优先级的进程.即使优先级较低的进程'时间片到期,它也将继续运行,直到它完成其在内核中的工作或自愿放弃的控制.如果等待运行的较高优先级进程是用户正在键入的文本编辑器或准备好重新填充其音频缓冲区的MP3播放器,则结果是交互性能差.这种方式非抢占式内核是当时的一个主要缺点.
Eri*_*nen 19
想象一下先发制人多任务的简单观点.我们有两个用户任务,它们都在不使用任何I/O或执行内核调用的情况下一直运行.这两项任务不需要做任何特殊的事情就可以在多任务操作系统上运行.内核通常基于定时器中断,只是决定一个任务暂停以让另一个任务运行的时间.有问题的任务完全没有意识到发生了什么.
但是,大多数任务通过系统调用偶尔发出内核请求.发生这种情况时,存在相同的用户上下文,但CPU代表该任务运行内核代码.
较旧的Linux内核在忙于运行内核代码时永远不会允许抢占任务.(请注意,I/O操作总是自愿重新安排.我在谈论内核代码有一些CPU密集型操作的情况,比如对列表进行排序.)
如果系统允许该任务在运行内核代码时被抢占,那么我们就拥有所谓的"抢先内核".这样的系统不受系统调用期间可能遇到的不可预测的延迟的影响,因此它可能更适合嵌入式或实时任务.
例如,如果在特定的CPU上有两个可用的任务,一个需要一个需要5ms才能完成的系统调用,另一个是需要每隔2ms输入音频管道的MP3播放器应用程序,您可能会听到口吃的声音.
反对抢占的论点是,可能在任务上下文中调用的所有内核代码必须能够在抢占中存活 - 例如,如果它总是能够在之前完成操作,则可能会有更好的设备驱动程序代码.允许其他任务在该处理器上运行.(现在多处理器系统是规则而不是例外,所有内核代码必须是可重入的,因此这个参数今天并不相关.)此外,如果通过改善系统调用可以实现相同的目标延迟,也许是先发制人是不必要的.
折衷方案是CONFIG_PREEMPT_VOLUNTARY,它允许在内核中的某些点进行任务切换,但不是在任何地方.如果只有少数几个内核代码可能陷入困境的地方,这是一种减少延迟同时保持复杂性可管理的廉价方法.
传统的unix内核有一个锁,在内核代码运行时由一个线程持有.因此,没有其他内核代码可以中断该线程.
这使得设计内核更容易,因为你知道当一个线程使用内核资源时,没有其他线程.因此不同的线程不能搞砸彼此的工作.
在单处理器系统中,这不会导致太多问题.
但是,在多处理器系统中,您可能会遇到不同处理器或内核上的多个线程都希望同时运行内核代码的情况.这意味着根据工作负载的类型,您可能拥有大量处理器,但所有处理器都将大部分时间用于等待彼此.
在Linux 2.6中,内核资源被划分为更小的单元,由单独的锁保护,并且检查内核代码以确保仅在相应资源被使用时保持锁.因此,现在不同的处理器只有在想要访问相同的资源(例如硬件资源)时才必须等待.
抢占允许内核给出并行性的IMPRESSION:你只有一个处理器(比如说十年前),但你觉得你的所有进程都是同时运行的.这是因为内核从一个进程抢占(即执行执行)执行以将其提供给下一个进程(可能根据它们的优先级).
编辑不抢占式内核等待进程返回手(即,在系统调用期间),因此如果您的进程计算大量数据并且不调用任何类型的yield函数,则其他进程将无法执行以执行他们的电话.据说这种系统是合作的,因为它们要求过程的合作以确保执行时间的公平性
编辑2抢占的主要目标是提高系统在多个任务中的反应性,这对最终用户有利,而另一方面,服务器希望实现最高的吞吐量,因此他们不需要它: (来自Linux内核配置)
| 归档时间: |
|
| 查看次数: |
16269 次 |
| 最近记录: |