linux内核的调度机制
linux内核的调度机制
抢占式内核与⾮抢占式内核
linux抢占式内核与实时系统的关系
⼀个好的系统的进程调度机制,要兼顾三种不同的应⽤的需求:
1交互式应⽤。这种应⽤,着重于系统的响应速度,当系统中有⼤量的进程共存时(多⽤户),要保证每个⽤户都有可以接受的响应速度,
⽽不感到明显的延迟。当延迟超过150毫秒时,使⽤者会明显地感觉到。
2.批处理应⽤。批处理的应⽤往往都是“后台作业”,对响应速度没有要求,但要考虑到“平均速度”
3.实时应⽤。这是时间要求最强的,不但要考虑进程执⾏的平均速度,还要考虑到“即时速度”;不但要考虑响应速度(即从⼀个事件发⽣
到系统对此作出反应,并开始执⾏有关程度之间所需的时间),还要考虑有关程序(⽤记程序)能否在
规定时间内执⾏完。在实时应⽤中,
注重的是对程序执⾏的“可预测性”。
在设计⼀个进程调度机制时考虑的问题有:
1.调度的时机:在什么情况下,什么时候调度?【在什么情况下,什么时候,把现在占⽤CPU的进程换下来。主要在什么位置调
⽤schedule函数】
2. 调度的“政策”policy:根据什么准则挑选下⼀个进⼊运⾏的进程。【从running的进程队列中出⼀个进程,来占⽤CPU,让它运
⾏】。
3.调度的⽅式:是”可剥夺“(preemptive)还是“不可剥夺”(nonpreemptive)。【⼀进程主动让出CPU,进程在⽤户态或是在内核态调
⽤schedule,⼆是强制剥夺其使⽤权,在发⽣中断或是异常或是系统调⽤之后,从内核态返回到⽤户态的前⼣,由内核调⽤schedule。】
调度的时机:
⾃愿⽅式
1.在内核⾥⾯,进程可以通过schedule()或是schedule_timeout启动⼀次调度。在⽤户空间可以使⽤调⽤pause()或是sleep(s)也可
以。【这是可见的主动让出的⽅式。这⾥指程序员可以看见,程序员编程时主动地让出。】
2.当⽤户使⽤open(),read(),write()等N多个涉及到外设的系统调⽤时,都可能受阻。这时在内核中⾃愿放弃运⾏是不可见的。【程序员认为
是阻塞了,其实就是让出CPU,进⼊等待队列,等⼀个信号或是软中断,或是硬件中断】
不⾃愿⽅式,即强制地发⽣在每次从系统调⽤返回的前⼣,以及每次从中断或是异常处理返回到⽤户空间的前⼣。注意:返回到⽤户空间是
关键性的。这意味着只有在⽤户空间(当CPU在⽤户空间运⾏时)发⽣的中断或是异常才会引起调度。(在内核空间发⽣的中断或是异
常,不引起调度。linux2.4)
【以上这种⽅式不⾃愿地⽅式我们习惯地称为“⾮抢占式内核”也有叫“⽤户抢占”。其实也就只能叫作“半抢占式内核”或是“有条件抢占”。这种⽅式是linux2.4的实现⽅式。在linux2.6中对此进⾏了修改。⼤家习惯地称linux2.6内核是“抢占式内核”。】
抢占式内核
以下是“抢占式内核”的英⽂解释。
Kernel preemption is a method used mainly in  and  where all or most  are run in , whereby the  is permitted to
forcibly perform a  (ie, preemptively schedule; on behalf of a runnable and higher priority process) on a driver or other part of
rather than  wait for the driver or kernel function (such as a ) to complete its execution and return control of the processor to
There are two main benefits to this method in monolithic and hybrid kernels, and answer one of the main criticisms of monolith
1 A device driver can enter an infinite loop or other unrecoverable state, crashing the whole system
2 Some drivers and system calls on monolithic kernels are slow to execute, and can't return control of the processor to the sch
execution.
源于:
对“⾮抢占式内核”、“抢占式内核”的认识过程。
当⼀看到这两个名词时,第⼀感觉就是这是⼀个不同调度⽅式的内核。在有⼀些了解之后,发现这种理解有⼀些问题。“⾮抢占式内核”说
的含义是:不可抢占⽤户进程内核态的调度⽅式。当然这种⽅式与内核实现有关,但它的重点是讲⼀种什么样的调度⽅式。针对
Kernel preemption我们可以翻译为“内核抢占调度模式”,或是“抢占内核调度模式”。
抢占式内核与⾮抢占式内核的不同
Linux2.4只实现了“有条件抢占式”的调度。它的缺点在于:当进程在内核态时,调度的时机有局限。就是只能在xxx的前⼣。例如:当外部
来⼀中断,中断程序过程完后,需要⼀个⽤户进程B对此进⾏进⼀步的处理(响应IP包数据)。此时进程A正在使⽤系统调⽤进⼊了内核
态。那么等到A从系统调⽤返回之际,内核进⾏调度,B才有可能运⾏。假设A的系统调⽤占⽤了CPU的时间为T。这个T⼤于⽤户要求的响
应时间。那这个系统就不够实时。
为了提⾼linux的实时性。在linux2.6中引⼊了“Kernel preemption”(内核抢占调度模式)。并很好的解决了这个问题。⼀句话就是抢占式
内核可以在进程处于内核态时,进⾏抢占。
当然抢占式内核在以下⼏种情况下不可抢占:
1.当内核运⾏中断处理程序和异常处理程序时,在linux内核中进程不能抢占中断,在中断例程中不允许进⾏调度。进程调度函数schedule会
对此作出判断,如果是在中断中调⽤,会打印出出错信息。
2.当进程在内核态运⾏临界区的代码时,不可抢占。这些临界区被⾃旋锁spin_lock保护了起来。【但是当进程使⽤spin_lock时,⾃⼰被锁
住并⾃旋时,这时可以调度。】
3. 内核正在进⾏bottom half(中断的底半部)处理时,不可抢占。【不太懂】
4.内核正在执⾏调度程序Scheduler时,不可抢占。
5.内核正在对每⼀个CPU“私有”数据结构操作(per CPU date structures)时,不可抢占。在SMP中,对于Per-cpu数据结构未⽤spinlocks保护,因为这些数据结构隐含地被保护了。
抢占式内核什么时候,什么位置调⽤schedule函数?
当中断发⽣,并完成中断处理时,在返回之前被中断的进程时,可以根据需要进⾏调度。
抢占式内核为每⼀个进程的task_struct结构引⼊了preempt_count变量,称为内核抢占锁。每当进程进⼊以上五种状态
时,preempt_count加1.表⽰不可抢占。当退出以上五种状态时,preempt_count减1. 每次进⾏抢占式调度时,先判断preempt_count与0⼤
⼩,preempt_count<0,表⽰可抢占。preempt_count>0表⽰不可抢占。
⼀系统抢占式的调度器函数:preempt_schedule;preempt_schedule_irq。它们都是调⽤schedule来完成调度的。
实时操作系统与抢占式内核的关系
实时操作系统要求就是对来⾃外部的请求,要求有及时的处理。及时到什么程度就是实时操作系统呢?这个没有⼀个明确的定义,因为⽤户
对响应时间的要求各不相同。
我们可以说当在同样的硬件条件下,Linux2.4的实时性不⾼,或是不如linux2.6的实时性⾼。那么提⾼系统的实时性的⽅法有很多,提
⾼CPU速度,增加CPU核,优化操作系统等。那么 linux在提⾼系统实时性的重要贡献就是引⼊了“内核抢占调度模式”。那么我们也可以说linux很好的⽀持了实时性。
1《Linux可抢占内核的分析》
2《Linux之抢占式内核》
3.linux抢占式内核的研究与实现
4.抢占式内核与⾮抢占式内核的区别
5.《linux内核情景分析》
注:由于此⽂⼤量引⽤了其它⽹络⽂章和⼀些论⽂,在此列出出处。所以此帖也只能算是转载。
>linux内核文件放在哪

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。