如何在Linux中调用Scheduler

时间:2013-07-08 09:02:19

标签: linux-kernel scheduler

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

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

3 个答案:

答案 0 :(得分:3)

调用调度程序:

  1. 使用显式阻止:互斥,信号量,等待等等。
  2. 如果设置了TIF_NEED_RESCHED标志,则在最近的情况下:
    • 如果内核是可抢占的:
      • 在系统调用或异常上下文中,在下一个最后preempt_enable()
      • 在IRQ上下文中,
      • 从中断处理程序返回到可抢占上下文
    • 如果内核不可抢占:
      • cond_resched()致电
      • 明确schedule()来电
      • 从系统调用或异常返回到用户空间
      • 从中断处理程序返回到用户空间

答案 1 :(得分:1)

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

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

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

所以一般来说,schedule()由一个想睡觉的任务调用,从而将cpu交给其他进程/任务。

答案 2 :(得分:-1)

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