在一个操作系统课程中,我花了一段时间才开始研究一个旧的,非抢占式的Linux内核(2.4.X)。但是,我们被告知内核中可能同时存在多个控制路径。这与内核的非抢先性质相矛盾吗? 编辑:我的意思是,内核中没有上下文 。上次我尝试提出这个问题时得到了回答“好吧,Linux内核 抢先一步,所以没有问题。”
答案 0 :(得分:7)
在2.4内核中,虽然内核代码不能被其他内核代码任意抢占,但内核代码仍然可以主动通过休眠放弃CPU(这显然是很常见的情况)
此外,内核代码总是可以被中断处理程序抢占(除非它专门禁用了中断),2.4内核也支持SMP,允许多个CPU同时在内核中执行。
答案 1 :(得分:2)
Linux内核可以在中断上下文或进程(用户)上下文中运行。进程上下文意味着它代表一个已调用系统调用的进程运行。中断上下文意味着它代表某种中断运行(硬件中断,softirq,...)。
当你谈到抢占式多任务时,这意味着内核可以决定抢占某项任务来运行另一项任务。当你谈到抢占式内核时,这意味着内核可以决定抢占自己运行以运行其他内核代码。
现在,在Linux是抢占式内核之前,您可以在多个CPU上运行内核代码,并且内核代码可能会被硬件中断中断(这可能会在返回之前运行softirqs,...)。抢占式内核意味着内核也可以被进程上下文内核代码预先抢占,以避免长时间延迟(抢先Linux来自Linux实时树)。
当然,在Rusty Russell的Unreliable Guide to Kernel Hacking和Unreliable Guide to Kernel Locking中可以更好地解释所有这些。
编辑:
或者,尝试更好地解释它,当一个任务在非抢占式内核上调用一个系统调用时,该任务不能被预先抢占,直到系统调用结束(可能是EINTR,但这可能需要很长时间)。抢占式内核允许该任务被抢占,从而导致等待运行的其他任务的平均延迟和最坏情况延迟。
答案 2 :(得分:1)
非抢占式内核意味着内核不代表另一个进程执行上下文切换,或者中断另一个正在运行的进程。它仍然可以通过实现协作式多任务处理来进行多处理,其中实际运行的进程本身可以控制内核或其他进程。所以,是的,你可以拥有多任务和非抢占式内核。
内核中没有针对MONOLITHIC内核的上下文切换,但当然内核仍然执行多任务处理....因此,您仍然具有多任务和非预占性
答案 3 :(得分:0)
Linux内核将大量工作卸载到内核线程,这些内核线程可以与用户空间任务一起调度进出,与内核抢占无关。即使是旧的2.4内核也有这些内核线程,尽管它们比现代2.6内核更少。 2.6内核现在有几个级别的抢占,可以在编译时选择,但完全抢占不是默认值。