CPU浪费等待键盘输入? (通用)

时间:2009-05-07 14:26:30

标签: language-agnostic input operating-system generics

如果有一种方法可以让操作系统不需要无限制地循环等待来自键盘(或其他输入设备)的输入以及是否有任何使用该操作系统的操作系统。我不敢相信我们确实需要浪费骑车只是为了等待输入,为什么一旦按下输入就不能做什么而不是让机器等待动作。

长话短说:

当前如何处理键盘输入 - 轮询还是中断?

7 个答案:

答案 0 :(得分:10)

大多数现代程序都没有像你描述的那样在循环中输入。您可以使用event handling或中断来避免浪费周期。

答案 1 :(得分:9)

所有基于Linux的操作系统上所有设备的所有设备输入都是中断驱动的。不使用繁忙的等待(主动轮询)数据。

Windows也可能都是中断驱动的。 (Windows的DOS遗留物隐藏在其中 - 轮询可能仍然在那里发生。)

所有Linux都以相同的方式工作。内核等待中断,将中断排队并检查调度程序以处理下一个最高优先级的中断。进程调度始终优先于中断调度。

键盘中断由缓冲信息的驱动程序处理。窗口管理器(例如Gnome)从缓冲区中提取东西以创建键盘中断流。

你可以购买很多关于操作系统设计的好书,这些书涵盖了设备驱动程序和内核之间的关系。从http://lwn.net/Kernel/LDD3/

开始

时钟中断BTW是进程调度的发生方式。如果没有任何设备活动,时钟将定期中断,强制内核查看调度,可能会更改正在执行的进程。使用大量CPU的进程优先级降低。大部分I / O花费大量时间等待I / O完成的过程,因此优先级提高。


修改

此外,有时 - DMA设备绕过内核中断处理以进行块传输字节。中断启动传输,但设备存在于总线上并访问存储器目录。视频显示,磁盘(以及以前的网络设备)可能是DMA。然而,键盘的体积非常小,以至于DMA不是一种有用的优化方式。

答案 2 :(得分:5)

通常它是这样的:

  • 进程(应用程序)执行(阻塞)系统调用,意思是“让我按键”
  • 操作系统将进程置于“等待IO”状态,将其从CPU中取出
  • ......时间过去了,其他过程愉快地运行,磁盘旋转,灯闪烁......
  • 用户按键,生成中断
  • 操作系统获取中断,读取按键,检查是否有任何进程等待此特定设备(键盘)输入
  • 找到等待进程,将其移至“runnable”状态
  • 只要有空闲CPU,进程就会获得它并在系统调用
  • 后恢复执行

因此,在任何阶段都没有轮询(主动等待)。

编辑:据我所知,Linux内核有时会切换到设备的轮询,否则会中断它们(想想快速网卡接收大量数据包)。在这些条件下,它节省了CPU时间而不是浪费它 - 操作系统通过一次轮询获得大量数据,而不是许多具有许多中断的小块。当轮询不再获取任何数据时,操作系统将切换回等待闯入模式。

答案 3 :(得分:2)

您可以使用非阻塞功能检查键盘输入,如果没有任何内容,则使用sleep(1)或类似构造协同产生。

您没有需要来浪费您已安排的CPU。

完全有可能阻塞键盘功能本身可能产生,操作系统只有在输入后才会恢复该线程。

答案 4 :(得分:0)

我见过轮询的唯一一次是处理原始DirectX输入设备(因为它们不属于典型的H / W架构范围)。您必须轮询这些设备(可能是鼠标,键盘,游戏杆,游戏手柄等......)以获得当前状态。正如其他人所说,典型的键盘是通过中断处理的。

答案 5 :(得分:0)

USB设备无法生成中断,因此操作系统每秒多次轮询。游戏玩家有时希望增加此轮询频率以获得响应更快的鼠标。

游戏通常使用轮询来处理输入,但在操作系统向其发送输入之前,其他应用程序更有可能睡眠。

答案 6 :(得分:0)

Nop,它没有,键盘输入由DMA处理,这是一个真正的后台任务,处理器没有意识到。