Linux内核:schedule()函数

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

执行方面,不​​明确的东西和被问到的问题。 当然,深入研究内核的来源并进行所有必要的调试,追踪bla bla ......可能会回答这个问题,但重新发明轮盘似乎并不明智。

问题/困惑如下:

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

谁安排线程? 哪个中断上下文? 任何名字? (如果我们在内核级别看到踪迹,没有什么叫做“sched”,但是有swappers,inits,ksoft * bla bla)Deos它是这样的:

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

要么

schedule()总是在某个协处理器上执行,以便在必要时从该协处理器观察和行动? 这就是为什么,有时当我们看到任何两个线程切换到CPU时,只有交换器在中间和之前和之后执行,也就是说,在那个级别上没有任何称为调度器的东西,对吧?

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


X或Y - 都不是。

这些先发制人的多线程操作系统内核在整体上都差不多。

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

OS内核调度程序/调度程序是一个庞大而复杂的中断处理程序。 OS中的中断有两种形式:

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

软件中断来自线程 - 可以改变线程状态的系统调用,例如。 一个线程可能会请求不是立即可用的输入,并且只有输入可用时线程才会运行。

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

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

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


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

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

链接地址: http://www.djcxy.com/p/84845.html

上一篇: Linux kernel: schedule() function

下一篇: how to make kernel threads preemptive?