linux抢占式内核的描述

User Preemption

User preemptionoccurs 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 touser-space, it knows it is in a safe quiescent state. In other words, if it issafe to continue executing the current task, it is also safe to pick a new taskto execute. Consequently, whenever the kernel is preparing to return touser-space either on return from an interrupt or after a system call, the valueof need_resched is checked. If it is set, the scheduler is invoked to select anew (more fit) process to execute. Both the return paths for return frominterrupt and return from system call are architecture dependent and typicallyimplemented in assembly in entry.S (which, aside from kernel entry code, alsocontains kernel exit code).

In short, userpreemption can occur

When returning touser-space from a system call

When returning touser-space from an interrupt handler

 

Kernel Preemption

The Linux kernel,unlike most other Unix variants and many other operating systems, is a fullypreemptive kernel. In non-preemptive kernels, kernel code runs untilcompletion. That is, the scheduler is not capable of rescheduling a task whileit is in the kernelkernel code is scheduled cooperatively, not preemptively.Kernel code runs until it finishes (returns to user-space) or explicitlyblocks. In the 2.6 kernel, however, the Linux kernel became preemptive: It isnow possible to preempt a task at any point, so long as the kernel is in astate in which it is safe to reschedule.

So when is it safeto reschedule? The kernel is capable of preempting a task running in the kernelso long as it does not hold a lock. That is, locks are used as markers ofregions of non-preemptibility. Because the kernel is SMP-safe, if a lock is notheld, the current code is reentrant and capable of being preempted.

The first change insupporting kernel preemption was the addition of a preemption counter,preempt_count, to each process's thread_info. This counter begins at zero andincrements once for each lock that is acquired and decrements once for eachlock that is released. When the counter is zero, the kernel is preemptible.Upon return from interrupt, if returning to kernel-space, the kernel checks thevalues of need_resched and preempt_count. If need_resched is set andpreempt_count is zero, then a more important task is runnable and it is safe topreempt. Thus, the scheduler is invoked. If preempt_count is nonzero, a lock isheld and it is unsafe to reschedule. In that case, the interrupt returns asusual to the currently executing task. When all the locks that the current taskis holding are released, preempt_count returns to zero. At that time, theunlock code checks whether need_resched is set. If so, the scheduler isinvoked. Enabling and disabling kernel preemption is sometimes required inkernel code and is discussed in Chapter 9.

Kernel preemptioncan also occur explicitly, when a task in the kernel blocks or explicitly callsschedule(). This form of kernel preemption has always been supported because noadditional logic is required to ensure that the kernel is in a state that issafe to preempt. It is assumed that the code that explicitly calls schedule()knows it is safe to reschedule.

Kernel preemptioncan occur

When an interrupthandler exits, before returning to kernel-space

When kernel codebecomes preemptible again

If a task in thekernel explicitly calls schedule()

If a task in thekernel blocks (which results in a call to schedule())


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值