- 论坛徽章:
- 9
|
回复 1# wLiu2007
场景0:是没有中断发生时的一个正常流程;
系统调用的时候是一个调度点,可能会返回其他进程。
场景2:系统调用返回用户空间时,有一次调度机会,所以能够切换到B,虽然在中断返回时也有一次调度机会,因为这个时候A还需要继续在内核空间执行,且不支持内核抢占,所以这个时候不能切换到B;
“也有一次调度机会”, 如果是不支持内核抢占,就不会有这个机会了,调度的代码都由条件宏括起来的。- #ifdef CONFIG_PREEMPT
- ENTRY(resume_kernel)
- DISABLE_INTERRUPTS(CLBR_ANY)
- cmpl $0,TI_preempt_count(%ebp) # non-zero preempt_count ?
- jnz restore_all
- need_resched:
- movl TI_flags(%ebp), %ecx # need_resched set ?
- testb $_TIF_NEED_RESCHED, %cl
- jz restore_all
- testl $X86_EFLAGS_IF,PT_EFLAGS(%esp) # interrupts off (exception path) ?
- jz restore_all
- call preempt_schedule_irq
- jmp need_resched
- END(resume_kernel)
- #endif
复制代码 场景3:中断返回有一次调度机会,因支持内核抢占,直接切换到B
在内核地以持抢占时,抢占点,不仅仅中断返回, 就像你个面的preempt_enable也是一个。
另外,可以调度不一定会发生调度,是否真正调度另外一个进程起来由调度器决定。
BTW:LS是GG还是MM?
|
|