【问题标题】:when schedule() returns?当 schedule() 返回?
【发布时间】:2013-02-26 07:44:24
【问题描述】:

在阻塞 IO 的情况下,比如驱动读取,我们调用 wait_event_interruptible() 并附带一些条件。当条件满足时,将完成读取。 我查看了 wait_event_interruptible() 函数,它检查条件并调用 schedule()。 schedule() 将寻找下一个可运行的进程并进行上下文切换,其他进程将运行。这是否意味着,当该进程再次被唤醒时,当前进程要执行的下一条指令将在 schedule() 函数中?

  1. 如果是,如果多个进程主动调用schedule,那么所有进程在唤醒后都会有下一条指令执行一次,会在schedule()中吗?

  2. 在 ret_from_interrupt 的情况下,调用 schedule()。什么时候回来?因为 iret 在那之后被执行。

【问题讨论】:

    标签: linux linux-kernel kernel scheduling interrupt-handling


    【解决方案1】:

    我认为第一个问题的答案是yes,因为这是实现上下文切换的一种相当典型的方式。以That's how OS161 works 为例。

    如果调度程序是从 ISR 调用的,那么一切都应该相同。调度程序应更改上下文并返回到 ISR,然后 ISR 应使用IRET 返回。如果调度程序选择切换到不同的进程/线程并因此加载其上下文并保存旧的,它将返回到不同的进程/线程。

    【讨论】:

    【解决方案2】:

    关于第 2 点:iret 指令(从中断处理程序返回)被执行,这让你进入ret_from_interrupt。然后 Linux 将控制权交给下一个要运行的任务 (schedule())。编写中断处理程序时最重要的考虑因素之一是,当它们执行时,许多其他活动被禁止(其他较低优先级的中断是主要示例),因此您希望尽快离开那里。这就是为什么大多数中断处理程序只是在返回之前隐藏要完成的工作,然后在其他地方处理这些工作(今天在一些特殊的内核线程中)。

    【讨论】:

    • 感谢您的回复。从代码中我看到 common_interruptdo_IRQ 调用之后跳转到 ret_from_intr 。从 ret_from_intr 我们点击 resume_kernel 并从那里调用 preempt_schedule_irq(),前提是我们早晚点击 restore_all iret 将被执行。我错过了什么吗?
    猜你喜欢
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多