如果有一种方法可以让操作系统不需要无限制地循环等待来自键盘(或其他输入设备)的输入以及是否有任何使用该操作系统的操作系统。我不敢相信我们确实需要浪费骑车只是为了等待输入,为什么一旦按下输入就不能做什么而不是让机器等待动作。
长话短说:
当前如何处理键盘输入 - 轮询还是中断?
答案 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)
通常它是这样的:
因此,在任何阶段都没有轮询(主动等待)。
编辑:据我所知,Linux内核有时会切换到设备的轮询,否则会中断它们(想想快速网卡接收大量数据包)。在这些条件下,它节省了CPU时间而不是浪费它 - 操作系统通过一次轮询获得大量数据,而不是许多具有许多中断的小块。当轮询不再获取任何数据时,操作系统将切换回等待闯入模式。
答案 3 :(得分:2)
您可以使用非阻塞功能检查键盘输入,如果没有任何内容,则使用sleep(1)或类似构造协同产生。
您没有需要来浪费您已安排的CPU。
完全有可能阻塞键盘功能本身可能产生,操作系统只有在输入后才会恢复该线程。
答案 4 :(得分:0)
我见过轮询的唯一一次是处理原始DirectX输入设备(因为它们不属于典型的H / W架构范围)。您必须轮询这些设备(可能是鼠标,键盘,游戏杆,游戏手柄等......)以获得当前状态。正如其他人所说,典型的键盘是通过中断处理的。
答案 5 :(得分:0)
USB设备无法生成中断,因此操作系统每秒多次轮询。游戏玩家有时希望增加此轮询频率以获得响应更快的鼠标。
游戏通常使用轮询来处理输入,但在操作系统向其发送输入之前,其他应用程序更有可能睡眠。
答案 6 :(得分:0)