Linux kernel Linux中如何调用调度程序

Linux kernel Linux中如何调用调度程序,linux-kernel,scheduler,Linux Kernel,Scheduler,在操作系统中,调度程序在系统调用api或硬件中断处理后调用 我无法获取并找到如何以及谁调用调度程序 将调用调度程序: 使用显式阻塞:互斥、信号量、等待队列等 如果设置了TIF\u NEED\u RESCHED标志,则在最近的可能情况下: 如果内核是可抢占的: 在系统调用或异常上下文中,在下一个最外层preempt\u enable() 在IRQ上下文中,从中断处理程序返回可抢占上下文 如果内核不可抢占: cond\u resched()调用 显式schedule()调用 从系统调用或异常

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


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

将调用调度程序:

  • 使用显式阻塞:互斥、信号量、等待队列等
  • 如果设置了
    TIF\u NEED\u RESCHED
    标志,则在最近的可能情况下:
    • 如果内核是可抢占的:
      • 在系统调用或异常上下文中,在下一个最外层
        preempt\u enable()
      • 在IRQ上下文中,从中断处理程序返回可抢占上下文
    • 如果内核不可抢占:
      • cond\u resched()
        调用
      • 显式
        schedule()
        调用
      • 从系统调用或异常返回到用户空间
      • 从中断处理程序返回到用户空间

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

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

    如果workqueque列表不为空,则工作线程会将自身标记为
    正在运行
    ,并执行延迟的下半部分


    因此,一般来说,
    schedule()
    被一个想要睡眠的任务调用,从而将cpu移交给其他进程/任务。

    我认为在调度某个进程时遵循循环算法的情况下,某些计时器正在根据时间片值进行编程,该时间片值将在该时间片结束后使用中断功能调用调度器。抢占当前正在执行的线程保存其上下文和进程就绪队列确定下一个要运行的线程从线程堆栈恢复其上下文,并根据新线程先前的抢占值设置PC值现在新线程开始运行

    可以重复上一个问题,所以没有区别,这是上下文切换的情况,但我想问的是调度程序是如何调用的,是否有一些内核线程正在监视队列或定期中断以检查正在运行的队列,您能告诉我在内核中哪里可以找到源代码吗tree@Pawan,
    schedule()
    可以在
    kernel/sched/core.c
    中找到。请参阅
    \u schedule()
    之前的注释,以查看调用
    \u schedule()
    的时间。这里还有
    scheduler\u tick()
    函数,这很重要。它在当前调度程序上调用
    task\u tick()
    ,而当前调度程序又设置
    TIF\u NEED\u RESCHED
    标志。在系统调用api和中断处理后调用调度程序时,这可能是正确的位置。