我读到Linux内核是抢占式的,这与大多数Unix内核不同。那么,内核抢占到底意味着什么呢?
一些类比或示例将比纯理论解释更好。
抢占式只是多任务处理的一种范例。还有其他类似协作多任务处理。通过比较它们可以更好地理解。
想象一下抢占式多任务的简单视图。我们有两个用户任务,它们都一直在运行,而没有使用任何I /
O或执行内核调用。这两个任务无需执行任何特殊操作即可在多任务操作系统上运行。内核通常基于计时器中断,只是简单地确定是时候暂停一项任务,让另一项任务运行了。有问题的任务完全不知道任何事情发生。
但是,大多数任务偶尔会通过syscall发出内核请求。发生这种情况时,存在相同的用户上下文,但是CPU代表该任务运行内核代码。
较旧的Linux内核永远不会在任务忙于运行内核代码时抢占该任务。(请注意,I /
O操作总是自愿重新安排。我说的是内核代码具有一些CPU密集型操作(例如对列表进行排序)的情况。)
如果系统允许该任务在 运行内核代码时 被抢占 ,
则我们拥有所谓的“抢占式内核”。这样的系统不受系统调用期间可能遇到的不可预测的延迟的影响,因此它可能更适合嵌入式或实时任务。
例如,如果在一个特定的CPU上有两个任务可用,一个任务需要5毫秒才能完成一次系统调用,另一个任务是一个MP3播放器应用程序,需要每2毫秒传送一次音频管道,您可能会听到声音不连续。
反对抢占的论点是,可能在任务上下文中调用的所有内核代码都必须能够在抢占中幸存-
例如,存在许多不良的设备驱动程序代码,如果始终能够完成操作,那可能会更好。允许其他一些任务在该处理器上运行。(如今,使用多处理器系统作为规则而不是例外,所有内核代码都必须是可重入的,因此该参数在今天已经不那么重要了。)此外,如果可以通过改善syscall来改善不良情况来达到相同的目标。延迟,也许抢占是不必要的。
一个妥协方案是CONFIG_PREEMPT_VOLUNTARY,它允许在内核内部的某些点(但不是在所有地方)进行任务切换。如果只有少数地方可能陷入内核代码,这是一种减少延迟并保持复杂度可管理的廉价方法。
问题内容: 用您自己的话解释,抢占是什么,对(linux)内核意味着什么? 拥有抢占式内核有哪些优缺点? 问题答案: 抢占式多任务处理- 在单个处理器上运行多个进程/线程,从而产生一种幻觉,即它们实际上在为每个进程/线程分配了较小的多路复用时间片以在其中运行时同时运行。当一个进程被调度为不执行并等待该进程/线程被“抢占”时,下次运行。 抢占式内核是可以在执行代码中间中断的内核(例如,响应系统调用)
内核抢占点 调度本质上体现了对CPU资源的抢占。对于用户进程而言,由于有中断的产生,可以随时打断用户进程的执行,转到操作系统内部,从而给了操作系统以调度控制权,让操作系统可以根据具体情况(比如用户进程时间片已经用完了)选择其他用户进程执行。这体现了用户进程的可抢占性(preemptive)。但如果把ucore操作系统也看成是一个特殊的内核进程或多个内核线程的集合,那ucore是否也是可抢占的呢?其
问题内容: 从这里 我没有得到它的含义以及为什么使用它。我试图搜索它,但不了解其含义。 问题答案: 它使动态加载的模块可以访问符号(前提是所述模块添加了声明)。
问题内容: 在Linux内核源代码中,我找到了以下功能: 在这里我不明白这意味着什么。 问题答案:
问题内容: Linux内核代码中的EXPORT_SYMBOL_GPL是什么? 下面是一段代码,其中包含EXPORT_SYMBOL_GPL 该宏在内核代码中多次出现。 问题答案: 将某些符号(例如函数)定义为可导出(从内核可加载模块中看到)是宏。如果该符号没有“ EXPORT_SYMBOL”,则将无法从模块访问该符号。 将仅在GPL许可的模块中显示该符号,并且-在具有任何许可的模块中显示该符号。 h
问题内容: 我是ARM平台上的内核模块,并且遇到内核崩溃,导致这三个错误被打印到屏幕上 括号中的值是什么? 是什么意思这听起来像是原子调度,但是内核模块中没有。 问题答案: 括号中的值是(指令故障状态)寄存器。中止的原因有很多,这些原因有特定的原因。内核中有一些表可以处理特定的故障原因,而另一些表则具有处理程序,该处理程序执行a 并中止任务或执行内核。参见:arm / mm / fault.c 。