3

在操作系统中,调度程序在系统调用 api 或硬件中断处理之后调用。

我无法找到并找到如何以及谁调用调度程序???

4

3 回答 3

3

调度程序被调用:

  1. 显式阻塞:互斥量、信号量、等待队列等。
  2. 如果TIF_NEED_RESCHED设置了标志,则在最近的可能情况下:
    • 如果内核是可抢占的:
      • 在系统调用或异常上下文中,在下一个最外面preempt_enable()
      • 在 IRQ 上下文中,从中断处理程序返回到可抢占上下文
    • 如果内核不可抢占:
      • cond_resched()称呼
      • 明确的schedule()调用
      • 从系统调用或异常返回到用户空间
      • 从中断处理程序返回到用户空间
于 2013-07-08T09:53:48.487 回答
2

如果当前线程/进程将要休眠/等待某些事件/资源被释放,调度程序将被调用。

在以工作队列的形式执行下半部分的工作线程的一种情况下,它将在一个while循环中运行并检查工作队列列表是否为空。如果发现为空,它会将自己标记为TASK_INTERRUPTABLE, 调用schedule()然后进入睡眠状态。

如果工作队列列表不为空,则工作线程标记自己RUNNING并执行延迟的下半部分。

因此,通常schedule()由想要休眠的任务调用,从而将 cpu 移交给其他进程/任务。

于 2013-07-09T04:16:32.773 回答
-1

我认为,如果采用循环算法来调度某些进程,则正在根据时间片值对某些计时器进行编程,该时间片值将在该时间片使用中断功能结束后调用调度程序。并且抢占当前正在执行的线程保存其上下文并处理就绪队列找出下一个运行的线程从线程堆栈中恢复其上下文并根据新线程的先前抢占值设置PC值现在新线程开始运行。https://en.wikipedia.org/wiki/Programmable_interval_timer

于 2017-10-02T05:28:43.027 回答