4.3 进程调度_抢占和上下文切换

    上下文切换,也就是从一个可执行进程切换到另一个可执行进程。

    内核提供了一个need_resched标志来表明是否需要重新执行一次调度。再返回用户空间以及从中断返回的时候,内核也会检查need_resched标志。每个进程都包含一个need_resched标志,这是因为访问进程描述符内的数值要比访问一个全局变量快。

 

4.3.1 用户抢占

    内核即将返回用户空间的时候,如果need_resched标志被设置,会导致schedule()被调用,此时就会发生用户抢占。在内核返回用户空间的时候,它知道自己是安全的,因为既然它可以继续去执行当前进程,那么它当然可以再去选择一个新的进程去执行。所以,内核无论是在从中断处理程序还是在系统调用后返回,都会检查need_resched标志。如果它被设置了,那么,内核会选择一个其他进程投入运行。

    简而言之,用户抢占在以下情况时产生:

  • 从系统调用返回用户空间。
  • 从中断处理程序返回用户空间。

 

4.3.2 内核抢占

    只要没有持有锁,内核就可以进行抢占。锁是非抢占区域的标志。

    如果内核中的进程被阻塞了,或它显式地调用了schedule(),内核抢占也会显式地发生。这种形式的内核抢占从来都是受支持的,因为根本无需额外的逻辑来保证内核可以安全地被抢占。如果代码显式的调用了schedule(),那么它应该清楚自己是可以安全地被抢占的。

    内核抢占会发生在:

  • 当从中断处理程序正在执行,且返回内核空间之前。
  • 当内核代码再一次具有可抢占性的时候。
  • 如果内核中的任务显式的调用schedule()。
  • 如果内核中的任务阻塞(这同样也会导致调用schedule())。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值