我在论坛上看到了几个关于这个schedule()函数的问题,但是我的问题有点不一样。 我已经看到了几个关于理论,algorithm和实现方面的讨论和文献。
执行方面是不清楚和问题的东西。 当然,深入研究内核的来源,并做所有必要的deBUGging,追踪bla bla …可能会回答这个问题,但重新发明轮盘似乎并不明智。
问题/困惑如下:
内核级别的multithreading用户程序遍历的path是什么?
如何在指定的date/时间运行bat文件?
了解renice
实时使用linux实时调度优先级(SCHED_FIFO和SCHED_RR)?
Python脚本与windows调度程序意外终止
SCHED_FIFO线程在linux中被SCHED_OTHER线程抢占
谁安排线程? 哪个中断上下文? 任何名字? (如果我们在内核层面看到一点痕迹,就没有什么叫做“ sched ”,但是有swappers,inits,ksoft * bla bla)Deos it go是这样的:
一个进程(用户程序)的子线程全部被内核取走,然后内核将它们作为可执行线程(通过将它们与schedule()和/或其他函数合并在一起,也就是说,这个新的可执行线程有一些来自内核可能来自schedule()/ others,与用户任务指令一起embedded,如果情况发生,就会自动进行调度)
要么
schedule()总是在某个协处理器上执行,以便在必要时从该协处理器观察和行动? 这就是为什么,有时当我们看到任何两个线程切换到一个@R_419_6947@时,只有交换器执行中间和之前和之后,也就是说,在那个级别没有什么叫调度器,对吧?
感谢阅读和抱歉写下我的困惑与分享。
哪些任务对应于linux内核调度程序?
Task Scheduler如何结束正在运行的作业?
linux内核 – 我可以locking和解锁Spinlock在不同的function?
寻找与OS调度程序支持的linux线程池API
删除根UID,同时保留CAP_SYS_NICE
X或Y – 都不是。
这些先发制人的多线程 *** 作系统内核在整体上都差不多。
看看,(很简单),像这样:
OS内核调度程序/调度程序是一个庞大而复杂的中断处理程序。 *** 作系统中的中断有两种:
硬件中断来自外围设备,如磁盘,网络,键盘,鼠标。 这些中断会导致驱动程序运行,并且驱动程序可能会在内核退出时请求计划运行。
软件中断来自线程 – 可以改变线程状态的系统调用,例如。 一个线程可能会请求不是立即可用的输入,并且线程在输入可用之前不会运行。
当发生中断时,内核使用其内部状态数据以及来自中断的请求数据运行其调度算法,并确定哪些线程应在可用内核上运行。 如果确定正在运行的线程组需要改变,那么可以通过使用内核驱动程序来停止运行在任何内核上的任何线程,从而导致运行该线程的内核的硬件中断。
如果没有中断,内核什么都不做。 它不能做任何事情,因为它不从任何地方进入。 它不需要在任何协处理器上执行。 它不需要将任何呼叫“注入”用户代码。
这是一个状态机,中断作为输入,一组运行线程作为输出。
在linux内核中,线程只是共享一些资源的进程。 换句话说,对于linux内核来说,线程只是进程的一个特例。 数据结构是相同的(即, task_struct – 请参阅include/linux/sched.h )。
系统定时器是以可编程频率发出中断的硬件定时器。 定期地,它发出一个硬件中断。 当内核收到这样一个中断时,当前进程/线程的执行被中断,系统以内核模式运行中断服务程序(ISR)。 这个例程调用选择哪个进程(或线程)应在下一个时隙执行的调度功能。 然后,例程通过抢占当前正在执行的进程/线程来执行上下文切换 。 这是所有现代通用 *** 作系统中多任务处理的基础。
总结以上是内存溢出为你收集整理的Linux内核:schedule()函数全部内容,希望文章能够帮你解决Linux内核:schedule()函数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)