抢占式内核与非抢占式内核的区别联系
2012-02-20 10:09
267 查看
抢占式内核在中断处理中,当检测到有高优先级任务就绪时,
就会切换到高优先级任务里,而不是等到退出中断后,再进行任务调度。
非抢占式内核在中断处理中,是不会切换到其他任务的,即使时间片已到
linux0.11内核属于非抢占内核,如果一个进程在内核中执行,除非它主动让出,没有人会让它退出的
linux2.6内核属于抢占内核,如果进程在内核中执行,这时,发生时钟中断,判断时间片到,就会调度其他程序执行,所以说linux2.6并不是一个实时系统
实时系统,一旦高优先级的进程就绪,不管正在内核执行的时间片是否用完,立刻抢占执行。
Linux抢占式内核就是由Robert Love修改实现的。在他的书中有如下描述:
-----------
User Preemption
User preemption occurs when the kernel is about to return to user-space, need_resched is set, and therefore, the scheduler is invoked. If the kernel is returning to user-space, it knows it is in a safe quiescent state. In other words, if it is safe to continue
executing the current task, it is also safe to pick a new task to execute. Consequently, whenever the kernel is preparing to return to user-space either on return from an interrupt or after a system call, the value of need_resched is checked. If it is set,
the scheduler is invoked to select a new (more fit) process to execute. Both the return paths for return from interrupt and return from system call are architecture dependent and typically implemented in assembly in entry.S (which, aside from kernel entry
code, also contains kernel exit code).
In short, user preemption can occur
When returning to user-space from a system call
When returning to user-space from an interrupt handler
Kernel Preemption
The Linux kernel, unlike most other Unix variants and many other operating systems, is a fully preemptive kernel. In non-preemptive kernels, kernel code runs until completion. That is, the scheduler is not capable of rescheduling a task while it is in the kernelkernel
code is scheduled cooperatively, not preemptively. Kernel code runs until it finishes (returns to user-space) or explicitly blocks. In the 2.6 kernel, however, the Linux kernel became preemptive: It is now possible to preempt a task at any point, so long as
the kernel is in a state in which it is safe to reschedule.
So when is it safe to reschedule? The kernel is capable of preempting a task running in the kernel so long as it does not hold a lock. That is, locks are used as markers of regions of non-preemptibility. Because the kernel is SMP-safe, if a lock is not held,
the current code is reentrant and capable of being preempted.
The first change in supporting kernel preemption was the addition of a preemption counter, preempt_count, to each process's thread_info. This counter begins at zero and increments once for each lock that is acquired and decrements once for each lock that is
released. When the counter is zero, the kernel is preemptible. Upon return from interrupt, if returning to kernel-space, the kernel checks the values of need_resched and preempt_count. If need_resched is set and preempt_count is zero, then a more important
task is runnable and it is safe to preempt. Thus, the scheduler is invoked. If preempt_count is nonzero, a lock is held and it is unsafe to reschedule. In that case, the interrupt returns as usual to the currently executing task. When all the locks that the
current task is holding are released, preempt_count returns to zero. At that time, the unlock code checks whether need_resched is set. If so, the scheduler is invoked. Enabling and disabling kernel preemption is sometimes required in kernel code and is discussed
in Chapter 9.
Kernel preemption can also occur explicitly, when a task in the kernel blocks or explicitly calls schedule(). This form of kernel preemption has always been supported because no additional logic is required to ensure that the kernel is in a state that is safe
to preempt. It is assumed that the code that explicitly calls schedule() knows it is safe to reschedule.
Kernel preemption can occur
When an interrupt handler exits, before returning to kernel-space
When kernel code becomes preemptible again
If a task in the kernel explicitly calls schedule()
If a task in the kernel blocks (which results in a call to schedule())
就会切换到高优先级任务里,而不是等到退出中断后,再进行任务调度。
非抢占式内核在中断处理中,是不会切换到其他任务的,即使时间片已到
linux0.11内核属于非抢占内核,如果一个进程在内核中执行,除非它主动让出,没有人会让它退出的
linux2.6内核属于抢占内核,如果进程在内核中执行,这时,发生时钟中断,判断时间片到,就会调度其他程序执行,所以说linux2.6并不是一个实时系统
实时系统,一旦高优先级的进程就绪,不管正在内核执行的时间片是否用完,立刻抢占执行。
Linux抢占式内核就是由Robert Love修改实现的。在他的书中有如下描述:
-----------
User Preemption
User preemption occurs when the kernel is about to return to user-space, need_resched is set, and therefore, the scheduler is invoked. If the kernel is returning to user-space, it knows it is in a safe quiescent state. In other words, if it is safe to continue
executing the current task, it is also safe to pick a new task to execute. Consequently, whenever the kernel is preparing to return to user-space either on return from an interrupt or after a system call, the value of need_resched is checked. If it is set,
the scheduler is invoked to select a new (more fit) process to execute. Both the return paths for return from interrupt and return from system call are architecture dependent and typically implemented in assembly in entry.S (which, aside from kernel entry
code, also contains kernel exit code).
In short, user preemption can occur
When returning to user-space from a system call
When returning to user-space from an interrupt handler
Kernel Preemption
The Linux kernel, unlike most other Unix variants and many other operating systems, is a fully preemptive kernel. In non-preemptive kernels, kernel code runs until completion. That is, the scheduler is not capable of rescheduling a task while it is in the kernelkernel
code is scheduled cooperatively, not preemptively. Kernel code runs until it finishes (returns to user-space) or explicitly blocks. In the 2.6 kernel, however, the Linux kernel became preemptive: It is now possible to preempt a task at any point, so long as
the kernel is in a state in which it is safe to reschedule.
So when is it safe to reschedule? The kernel is capable of preempting a task running in the kernel so long as it does not hold a lock. That is, locks are used as markers of regions of non-preemptibility. Because the kernel is SMP-safe, if a lock is not held,
the current code is reentrant and capable of being preempted.
The first change in supporting kernel preemption was the addition of a preemption counter, preempt_count, to each process's thread_info. This counter begins at zero and increments once for each lock that is acquired and decrements once for each lock that is
released. When the counter is zero, the kernel is preemptible. Upon return from interrupt, if returning to kernel-space, the kernel checks the values of need_resched and preempt_count. If need_resched is set and preempt_count is zero, then a more important
task is runnable and it is safe to preempt. Thus, the scheduler is invoked. If preempt_count is nonzero, a lock is held and it is unsafe to reschedule. In that case, the interrupt returns as usual to the currently executing task. When all the locks that the
current task is holding are released, preempt_count returns to zero. At that time, the unlock code checks whether need_resched is set. If so, the scheduler is invoked. Enabling and disabling kernel preemption is sometimes required in kernel code and is discussed
in Chapter 9.
Kernel preemption can also occur explicitly, when a task in the kernel blocks or explicitly calls schedule(). This form of kernel preemption has always been supported because no additional logic is required to ensure that the kernel is in a state that is safe
to preempt. It is assumed that the code that explicitly calls schedule() knows it is safe to reschedule.
Kernel preemption can occur
When an interrupt handler exits, before returning to kernel-space
When kernel code becomes preemptible again
If a task in the kernel explicitly calls schedule()
If a task in the kernel blocks (which results in a call to schedule())
相关文章推荐
- 抢占式内核与非抢占式内核的区别联系
- 抢占式内核与非抢占式内核中的自旋锁(spinlock)的区别
- 抢占式内核与非抢占式内核的区别
- linux系统下抢占式内核与非抢占式内核的区别
- 抢占式内核与非抢占式内核的区别
- 抢占式内核与非抢占式内核的区别
- 抢占式内核和非抢占式内核的区别
- 抢占式内核与非抢占式内核
- 抢占式内核与非抢占式内核
- 抢占式和非抢占式内核
- linux系统的内核进程/用户进程和轻量级进程区别与联系
- 抢占式内核与非抢占式内核
- 应用层对i2c通用驱动接口与eeprom的i2 4000 c驱动接口从应用层到内核层调用区别和联系
- 抢占式内核与非抢占式内核中的自旋锁(spinlock)的差别
- 抢占式内核和非抢占式内核
- 内核缓冲区和滑动窗口之间的区别联系
- 抢占式任务调度和非抢占式(轮询任务调度)的区别,以及任务调度算法的用途。
- 抢占式内核与非抢占式内核
- JDK,JRE,JVM区别与联系
- Filter与Servlet的区别和联系