我在论坛上看到了其他几个关于调度()函数的问题,但我的问题有点不同。我见过一些关于它的理论、算法和实现方面的讨论和文献。
不明确的问题是执行方面。当然,深入地查看内核的源代码并进行所有所需的调试,跟踪bla .也许可以回答这个问题,但重新发明轮子似乎是不明智的。
问题/困惑如下:
多线程用户程序在内核级别上遍历的路径是什么?
谁安排的线程?哪个中断上下文?有名字吗?(如果我们在内核级别上看到,没有什么叫做"sched",但是有交换,inits,ksoft* bla),它是这样的:
一个进程(用户程序)其子线程首先由内核接收,然后内核将它们作为可执行线程(通过将它们与schedule()和/或其他函数合并),即这个新的可执行线程具有来自内核的一些指令,可能来自schedule()/others,并嵌入了用户任务指令。如果发生这种情况,就会自动排定)
或
schedule()总是在某个协处理器上执行,以便在必要时从协处理器中观察和执行吗?这就是为什么,有时当我们看到任意两个线程在cpu上切换时,只会在中间和之后执行交换程序,也就是说,在这个级别上没有什么叫做调度器,对吗?
谢谢你的阅读,很抱歉写了我的困惑与分享。
发布于 2013-12-19 11:05:50
X或者Y-也不是。
这些先发制人的多线程操作系统内核总体上都是一样的。
看看它,(很简单),就像这样:
操作系统内核调度器/调度程序是一个大型、复杂的中断处理程序.中断,用操作系统来说有两种味道:
硬件中断从外围设备,如磁盘,网络,键盘,鼠标。这些中断导致驱动程序运行,当驱动程序退出时,驱动程序可能请求从内核运行调度。
软件中断从线程-系统调用,可以改变线程的状态,例如。线程可能请求不可立即使用的输入,因此在输入可用之前线程不会继续运行。
当中断发生时,内核使用其内部状态数据以及来自中断的请求数据来运行其调度算法,并决定哪些线程应该在可用的核心上运行。如果它决定一组正在运行的线程需要更改,它可以通过使用内核间驱动程序来导致运行线程的内核的硬件中断来停止在任何内核上运行的任何线程。
如果没有中断,内核什么也不做。它什么也做不了,因为它不是从任何地方输入的。它不需要在任何协处理器上执行。它不需要向用户代码中“注入”任何调用。
它是一台状态机,以中断作为输入,以一组正在运行的线程作为输出。
https://stackoverflow.com/questions/20679228
复制相似问题