现在的位置: 首页 > 综合 > 正文

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

2013年10月07日 ⁄ 综合 ⁄ 共 698字 ⁄ 字号 评论关闭

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

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

 

4.3.1 用户抢占

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

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

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

 

4.3.2 内核抢占

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

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

    内核抢占会发生在:

  • 当从中断处理程序正在执行,且返回内核空间之前。
  • 当内核代码再一次具有可抢占性的时候。
  • 如果内核中的任务显式的调用schedule()。
  • 如果内核中的任务阻塞(这同样也会导致调用schedule())。

抱歉!评论已关闭.