内核抢占和调度机会,不知道理解的对不对,请指点
今天在看抢占的内容,根据自己理解的东西,构造了一个场景,请大侠men帮忙看一下我的理解是否正确,谢谢场景0:是没有中断发生时的一个正常流程;
场景1:中断返回的时候有一次调度机会,会检查resched标志和preempt_count, 所以中断返回后切换到进程B;
场景2:系统调用返回用户空间时,有一次调度机会,所以能够切换到B,虽然在中断返回时也有一次调度机会,因为这个时候A还需要继续在内核空间执行,且不支持内核抢占,所以这个时候不能切换到B;
场景3:中断返回有一次调度机会,因支持内核抢占,直接切换到B
场景4:中断返回有一次调度机会,虽然支持内核抢占,但A处于临界区,preempt_count!=0,所以A继续执行,等A退出临界区执行preempt_enable时检查发现resched不为0,重新调度,所以切换到B,等B执行完,A继续执行系统调用;
试着回答一下,权当讨论
场景0:是没有中断发生时的一个正常流程;
感觉系统调用返回的时候有可能被其他进程抢占,我不确定是否有系统调用能导致其他高优先级的进程切换成ready态
场景1:中断返回的时候有一次调度机会,会检查resched标志和preempt_count, 所以中断返回后切换到进程B;
同意
场景2:系统调用返回用户空间时,有一次调度机会,所以能够切换到B,虽然在中断返回时也有一次调度机会,因为这个时候A还需要继续在内核空间执行,且不支持内核抢占,所以这个时候不能切换到B;
同意,个人但是是否被抢占和A进程是否处于内核态没有关系
场景3:中断返回有一次调度机会,因支持内核抢占,直接切换到B
同意
场景4:中断返回有一次调度机会,虽然支持内核抢占,但A处于临界区,preempt_count!=0,所以A继续执行,等A退出临界区执行preempt_enable时检查发现resched不为0,重新调度,所以切换到B,等B执行完,A继续执行系统调用;
同意
看似差不多就这个意思。。。。 回复 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?
了解,谢谢各位! 回复 5# wLiu2007
没有回答问题,不礼貌{:2_174:} 。
回复 6# Tinnal
让Tinnal 兄失望了,本人是GG{:3_204:}
为了避免误会,我已经将头像改了,呵呵
感谢Tinnal兄回帖呀,Thanks
本帖最后由 Tinnal 于 2014-08-13 22:46 编辑
回复 7# wLiu2007
知道就行,头像还挺养眼的,就别换了吧。做技术的,女生真少呀!
追加:
把头像换回来吧。
页:
[1]