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

LuR*_*RsT 1 language-agnostic generics operating-system input

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

长话短说:

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

Bil*_*ard 10

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


S.L*_*ott 9

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

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

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

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

你可以购买很多关于OS设计的好书,它们涵盖了设备驱动程序和内核之间的关系.从http://lwn.net/Kernel/LDD3/开始

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


编辑

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


Raf*_*ird 5

通常它是这样的:

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

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

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