我最近开始阅读 Linux内核开发作者Robert Love ,我爱 -ing it! 请阅读本书的以下摘录,以便更好地理解我的问题:
一个数字标识中断和内核使用 此数字用于执行特定的中断处理程序以处理和响应中断。 例如,在您键入时,键盘控制器会发出中断以让系统进入 知道键盘缓冲区中有新数据。内核记录了传入中断的中断号,并执行了正确的中断处理程序。中断 处理程序处理键盘数据,让键盘控制器知道它已准备就绪 更多数据......
现在我在我的机器上进行了双重启动,有时(实际上很多)当我在Windows上输入内容时,我发现自己正在进行操作,我称之为夜间爬虫模式。这是我在打字的时候,我在屏幕上看不到任何内容,稍后整个文本出现在一个闪存中,可能缓冲区只是吐出一切。
现在我没有在Linux上看到这种情况。是因为Linux中存在 interrupt-context 并且在Windows中没有它?
顺便说一下,我还不确定Windows中是否有中断上下文,谷歌没有给我任何相关的结果。答案 0 :(得分:0)
所有操作系统都有一个中断上下文,它是CPU架构的一个特性/约束 - 基本上,这就是“与计算机硬件一样的工作方式”。然而,不同的操作系统(以及该操作系统中的驱动程序)在返回之前对中断的工作和工作量做出了不同的选择。这可能与您的Windows体验有关,也可能与您的体验无关。将按键翻译成屏幕输出有一个很多代码,中断处理只是一小部分。
答案 1 :(得分:0)
一个数字标识中断,内核使用该数字执行特定的中断处理程序来处理和响应中断。例如,当您键入时,键盘控制器发出中断,让系统知道键盘缓冲区中有新数据。内核记录传入中断的中断号并执行正确的中断处理程序。中断处理程序处理键盘数据并让键盘控制器知道它已准备好接收更多数据
这是一个很糟糕的描述。现在用USB键盘可能会有所不同,但这似乎讨论了旧的PS / 2连接会发生什么,主板上的“8042”兼容芯片组在IRQ线路上向CPU发出信号,然后执行任何代码在存储在中断表中的位置9的地址处(传统上是从物理存储器中的地址0开始的指针数组,但是从存储器中可以更改地址,并且上次我使用这些东西时PC仍然具有<1MB RAM并使用了不同的内存布局模式。)
调度过程与内核无关......这就是硬件的工作方式。 (键盘控制器可能会被要求不生成中断,允许操作系统/驱动程序软件定期“轮询”它以查看是否有新的事件数据可用,但真的使用它真的很疯狂。/ p>
但是,中断表中的代码地址会将指向内核或键盘驱动程序,内核/驱动程序代码将从键盘控制器的I / O端口读取键盘事件数据。对于这些硬件中断处理程序,主要目标是从设备获取数据并尽快将其存储到缓冲区 - 以确保从中断返回到正在发生的任何处理,并且因为键盘控制器只能处理一次一个事件 - 需要在下一个事件之前将其读入缓冲区。
然后由操作系统/驱动程序向应用程序软件提供某种输入可用性信号,或等待应用程序软件尝试读取更多键盘输入,但它可以“只要你准备就绪” “时尚。无论哪种方式,一旦应用程序有时间阅读并开始响应输入,事情就会发生意味着需要花费意外的长时间:可能是额外的击键触发了一些需要很长时间才能运行的复杂重新分类算法或者说击键导致程序执行已经换成磁盘的代码(检查维基百科中的“虚拟内存”),在这种情况下,只有在硬盘已经将部分程序读入内存之后才能执行该程序可以继续运行。有成千上万个这样的边缘情况涉及窗口移动,图形裁剪算法等,这可能导致键盘处理代码需要很长时间才能完成,如果发生其他击键同时它们将被键盘驱动程序读入缓冲区,然后在缓慢/阻塞处理完成后仅由应用程序“感知”。很可能接下来在缓冲区中所有键击之后的处理完成得更快:例如,如果程序的一部分从磁盘交换,则该部分可能已准备好处理剩余的击键。
为什么Linux在这方面比Windows更好?主要是因为操作系统,驱动程序和应用程序倾向于“更精简和更精简”......不那么臃肿的软件(如C ++ vs C#.NET),内存浪费更少,交换和延迟更少。