键盘敲入 A 字母时,操作系统期间发生了什么?
关于8.1 键盘敲入 A 字母时,操作系统期间发生了什么?的总结,前面都介绍了,但是在最后总结操作系统发生了什么的时候,我觉得有点不详细,于是写一写自己的补充和理解,不一定正确。
- 键盘敲击之后,键盘控制器根据敲击的键生成扫描码,写入寄存器。同时通过中断控制器向CPU发出中断请求。CPU接到中断请求后即停止正在执行的程序,保存现场,转入键盘中断服务程序。
- 中断服务程序从寄存器中读出键盘扫描码转换成Ascii码与扫描码一起存入键盘缓冲区。然后即返回原程序运行。
而显示是另外程序的事。有些程序选择只读不显示,比如游戏控制。有的程序不要求输入比如计算一百万位圆周率,键盘输入会一直存缓冲区,缓冲区(一般16个字符)满了就丢弃。有的程序需要即时操作,在读缓冲区之前会先清除缓冲区等你新鲜按键。比如赛车游戏,在开始加载时你瞎按了一些键。如果不清除,等赛车就位就可能先瞎转一气当一个程序需要键盘输入时,即查询键盘缓冲区,如果有按键即读入,如果没有就等待一直到键盘缓冲区中有新的输入。键盘中断与程序读键盘类似生产者与消费者。瓜农(操作系统)听到西瓜熟了的声音(中断)就去把瓜拣了放入仓库。用户(程序)想吃瓜就去仓库,如果有就抱走,如果没有就死等。如果西瓜成熟没有声音,瓜农就只好整天在瓜地转悠(轮询),这样效率很低。
这时候你可能会想,输入缓冲区只有一个,操作系统如何对应知道当前的输入对应哪一个程序?
焦点和活动窗口: 操作系统会跟踪当前的活动窗口,即用户正在与之交互的窗口。这个窗口可能是用户最后点击的窗口,或者是用户通过任务切换等方式设定的。操作系统知道哪个窗口是活动窗口,并因此决定将键盘输入发送到这个窗口。
活动窗口或应用程序会拥有一个事件队列。当键盘输入发生时,操作系统会创建一个键盘事件,并将其放入活动窗口的事件队列中。
应用程序通常在事件循环中不断地检查事件队列。当应用程序发现有新的键盘事件时,它会从事件队列中取出事件并执行相应的处理。这可能包括更新用户界面、执行特定操作或进行其他适当的响应。