windows有中断上下文吗



我最近开始阅读Robert Love的《Linux内核开发》,我非常喜欢它!请阅读以下摘录,以更好地理解我的问题:

一个数字标识中断,内核使用这个数字用于执行特定的中断处理程序来处理和响应中断。例如,当您键入时,键盘控制器会发出一个中断,让系统知道键盘缓冲区中有新数据。内核记录传入中断的中断号,并执行正确的中断处理程序。中断处理程序处理键盘数据,并让键盘控制器知道它已准备好更多数据。。。

现在我的机器上有双启动,有时(事实上,很多)当我在窗口上键入东西时,我发现自己是在我称之为夜间爬行的模式下进行的。这是在我打字的时候,我在屏幕上什么都看不到,过了一段时间,整个文本都会在一瞬间出现,可能缓冲区会把所有东西都吐出来。

现在我在Linux上看不到这种情况。是因为Linux中存在中断上下文,而windows中没有它吗?

顺便说一句,我仍然不确定windows中是否有中断上下文,谷歌没有给我任何相关的结果。

所有操作系统都有一个中断上下文,这是CPU架构的一个特性/约束——基本上,这就是计算机硬件的"工作方式"。不过,不同的操作系统(以及该操作系统中的驱动程序)在返回之前,会对中断中的工作内容和工作量做出不同的选择。这可能与你的windows体验有关,也可能不是。将按键转换为屏幕输出需要大量的代码,而中断处理只是其中的一小部分。

一个数字标识中断,内核使用这个数字来执行特定的中断处理程序来处理和响应中断。例如,当您键入时,键盘控制器会发出一个中断,让系统知道键盘缓冲区中有新数据。内核记录传入中断的中断号,并执行正确的中断处理程序。中断处理程序处理键盘数据,并让键盘控制器知道它已准备好接收更多数据

这是一个相当糟糕的描述。现在USB键盘的情况可能有所不同,但这似乎是在讨论旧的PS/2连接会发生什么,在旧的PS+2连接中,主板上的"8042"兼容芯片组通过IRQ线路向CPU发送信号,然后它执行存储在中断表中位置9的地址处的任何代码(传统上,物理内存中从地址0开始的指针数组,尽管从内存中你可以更改地址,上次我玩这些东西时,PC仍然有<1MB RAM,并使用不同的内存布局模式)。

这个调度过程与内核无关。。。这就是硬件的工作方式。(键盘控制器可能会被要求不要生成中断,这样操作系统/驱动程序软件就可以定期"轮询"它,看看是否有新的事件数据可用,但如果真的这样做,那就太疯狂了)。

尽管如此,中断表中的代码地址将指向内核或键盘驱动程序,内核/驱动程序代码将从键盘控制器的I/O端口读取键盘事件数据。对于这些硬件中断处理程序,一个主要目标是从设备中获取数据,并尽快将其存储到缓冲区中,这既是为了确保从中断返回到正在发生的任何处理,也是因为键盘控制器一次只能处理一个事件,所以需要在下一个事件发生前将数据读取到缓冲区。

然后由操作系统/驱动程序向应用程序软件提供某种输入可用性信号,或者等待应用程序软件尝试读取更多键盘输入,但它可以"随时准备"。无论哪种方式,一旦应用程序有时间读取并开始响应输入,就会发生一些事情,这意味着它需要出乎意料的长时间:可能是额外的按键触发了一些复杂的重新分页算法,需要很长时间才能运行,或者按键导致程序执行的代码被换到了磁盘上(请查看维基百科中的"虚拟内存"),在这种情况下,只有在硬盘将程序的一部分读取到内存中之后,程序才能继续运行。有成千上万的这种边缘情况涉及窗口移动、图形剪切算法等,这可能是键盘处理代码需要很长时间才能完成的原因,如果同时发生了其他按键,键盘驱动程序会将其读取到缓冲区中,那么只有在缓慢/阻塞处理完成后,应用程序才会"感知"到这些按键。很可能是缓冲区中所有按键的处理完成得更快:例如,如果程序的一部分是从磁盘交换的,那么该部分可能已经准备好处理剩余的按键了。

为什么Linux在这方面会比Windows做得更好?主要是因为操作系统、驱动程序和应用程序往往"更精简、更吝啬"。。。更少的臃肿软件(如C++与C#.NET),更少的内存浪费,因此更少的交换和延迟。

最新更新