【问题标题】:The use of need_resched flag and schedule() routine within Linux kernel [2.4]在 Linux 内核中使用 need_resched 标志和 schedule() 例程 [2.4]
【发布时间】:2015-06-28 18:36:54
【问题描述】:

根据我的理解,当内核发现当前正在运行的进程应该剥离 CPU 时,它会启用 need_resched 标志。 然后在返回用户空间之前检查该标志,如果启用该标志,则内核启动对 schedule() 的调用。 但是我注意到,在 sys_sched_yield() 例程中,我们不使用 need_resched 标志,而是显式调用 schedule() 例程。 为什么?

【问题讨论】:

  • sys_sched_yield 用于重新调度(实际上是系统调用)。因为它是从用户空间调用的,所以内核可以立即执行调度,而不是设置need_resched标志。
  • 我知道 sys_sched_yield() 是一个系统调用实现。 need_resched 无法从用户模式访问,因此您的第二句话实际上没有意义。
  • 您说的是need_resched can't be accessed from user mode,但希望sys_sched_yield 检查need_resched 标志。为什么?
  • sys_sched_yield 是 sched.c 中的一个方法,它在内核模式下运行。不要混淆系统调用包装函数和内核代码。
  • sys_sched_yield 是 sched.c 中的一个方法,它在内核模式下运行并且它实现了系统调用sched_yield。这里没有混淆。每个系统调用都作为内核代码实现。

标签: linux linux-kernel redhat rhel


【解决方案1】:

here 所述,need_resched 标志用于标记进程在外部:在scheduler_tick() 的中断内或当进程被try_to_wake_up() 的其他进程唤醒时。需要标志,因为进程本身可能还没有准备好重新调度,所以重新调度被推迟到安全静止状态

如果进程自身请求重新调度,通过内核空间中的schedule()调用,或者通过用户空间中的sched_yield()系统调用,内核立即执行请求。假定进程知道它在做什么。在最后一种情况下(在用户空间调用sched_yield()),内核知道在用户空间进行进程时重新调度总是安全的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多