Linux内核:schedule()函数

时间:2013-12-19 10:32:29

标签: c linux multithreading linux-kernel scheduler

我在论坛上看到了几个关于这个schedule()函数的问题,但我的问题有点不同。我已经看过几个关于它的理论,算法和实现方面的讨论和文献。

不清楚的问题和被问到的问题,是执行方面。当然,深入查看内核的源代码并进行所有必需的调试,跟踪bla bla ...可能会回答这个问题,但重新发明轮子似乎并不明智。

问题/混淆如下:

内核级别的多线程用户程序遍历的路径是什么?

谁安排线程?哪个中断上下文?任何名字? (如果我们在内核级别看到跟踪,没有任何名为“ sched ”的东西,但是有交换器,inits,ksoft * bla bla)Deos它是这样的:

一个进程(用户程序)其子线程全部由内核获取,然后内核将它们作为可执行线程(通过将它们与schedule()和/或其他函数合并,即这个新的可执行线程有一些来自内核的指令可能来自schedule()/其他,嵌入了用户任务指令。这使得它会在情况发生时自动安排)

OR

schedule()总是在某个协处理器上执行,以便在必要时从该协处理器进行观察和操作?这就是为什么,有时当我们看到任何两个线程切换到cpu时,只有交换器在中间和之前和之后执行,即在那个级别没有任何叫做调度程序,对吗?

感谢阅读并抱歉写下我的困惑与之分享。

2 个答案:

答案 0 :(得分:7)

X或Y - 两者都没有。

这些抢占式多线程操作系统内核总体上大致相同。

看看,(非常简单),像这样:

OS内核调度程序/调度程序是一个复杂的大型中断处理程序。操作系统中的中断有两种形式:

来自磁盘,网络,键盘,鼠标等外围设备的硬件中断。这些中断会导致驱动程序运行,并且驱动程序可能会在内核退出时请求从内核运行调度。

软件从线程中断 - 可以改变线程状态的系统调用,例如。线程可能会请求不立即可用的输入,因此在输入可用之前线程不会继续运行。

当发生中断时,内核使用其内部状态数据以及来自中断的请求数据来运行其调度算法,并决定应在可用内核上运行哪些线程。如果它确定运行线程集需要更改,它可以通过使用内核驱动程序来停止运行该线程的核心的硬件中断,从而停止在任何核心上运行的任何线程。

如果没有中断,内核什么都不做。它无法做任何事情,因为它不是从任何地方输入的。它不需要在任何协处理器上执行。它不需要将任何调用“注入”用户代码。

这是一个状态机,中断作为输入,一组运行线程作为输出。

答案 1 :(得分:3)

在Linux内核中,线程只是共享一些资源的进程。换句话说,对于Linux内核,线程只是进程的一个特例。数据结构相同(即task_struct - 请参阅include/linux/sched.h)。

系统定时器是以可编程频率发出中断的硬件定时器。它会定期发出硬件中断。当内核收到这样的中断时,当前进程/线程的执行被中断,系统在内核模式下运行中断服务程序(ISR)。此例程调用调度函数,该函数选择在下一个时隙中应该执行哪个进程(或线程)。然后,例程通过抢占当前正在执行的进程/线程来执行上下文切换。这是多任务的基础,在所有现代通用操作系统中都是如此。