问题

计算机中,假设键盘同时按下两个键,会优先生效哪一个?

回答
在咱们日常用电脑的时候,有时候急了或者不小心,可能会同时按下两个键。这时候你可能会好奇,电脑到底会怎么处理?哪个键会“赢”呢?

这其实是个挺有意思的问题,因为电脑处理“同时发生”的事情,跟咱们直觉可能不太一样。它不是一个简单的“先到先得”,而是涉及到一些底层的东西。

首先,咱们得明白键盘是怎么跟电脑沟通的。

键盘不是直接跟CPU打交道的。它有一个叫做“键盘控制器”(Keyboard Controller)的东西。你按下键盘上的一个键,这个控制器就会捕捉到这个动作,然后生成一个叫做“扫描码”(Scan Code)的信号。这个扫描码就像是每个键的身份证号,每个键都有一个独一无二的数字代码。

接着,这个扫描码会被发送到主板上一个叫做“输入输出控制器”(I/O Controller)或者更现代一些的主板上的“芯片组”(Chipset)里。这些控制器负责把键盘的信号传递给CPU。

当两个键几乎同时被按下时,会发生什么?

关键就在于这个“几乎同时”是怎么发生的。键盘本身是有一定的处理能力的,它会扫描键盘上的按键矩阵。当你按下一个键时,它会在键盘的电路板上形成一个闭合的回路。

如果两个键是真的、在物理上完全同步按下的,那其实是极少发生的情况。更多时候,是你以为同时按了,但实际上可能有一个键比另一个早那么几十毫秒,或者说在键盘控制器检测到的时候,有一个信号稍微先一点点被发送出来。

就像你用录音机录下两个人同时说话,但其实仔细听,总有一个人的声音会先进入麦克风一点点。

所以,会优先生效哪一个?

通常情况下,不是哪个键“赢了”,而是哪个键的扫描码先被键盘控制器处理并发送到电脑系统中。

你可以想象成一个传送带。键盘控制器是传送带的起点,它每扫描一次键盘,就会看看有没有按键动作。如果它扫描到的那一刻,检测到了两个按键动作,它会按照它内部设定的顺序,把先被它捕捉到的那个按键的扫描码先放到待处理队列里。

这个队列就是“先到先得”的机制了。一旦扫描码被放入队列,它就会被一个接一个地发送给电脑。电脑接收到第一个扫描码,就处理第一个按键的事件。等到处理完第一个,再处理第二个。

影响因素有哪些?

1. 键盘本身的扫描速度和设计: 不同的键盘,它的控制器扫描按键的速度可能不一样。有些高端游戏键盘会更快速、更频繁地扫描按键,这样在几乎同时按下时,它更可能区分出哪个是先来的。
2. 物理按压的微小差异: 就算你感觉是同时的,人手的力量和按下速度总会有细微的差别。这个细微差别可能导致某个键的电路接触点比另一个先闭合,从而让键盘控制器先检测到。
3. 电脑处理器的响应速度和中断优先级(虽然这个影响非常小): 电脑收到键盘信号后,会产生一个中断请求(IRQ)。通常,键盘信号会有一个优先级,但这个优先级是在接收到信号之后才起作用的。所以,真正决定性的是扫描码的“发送”顺序。

举个例子:

假设你同时按下了“A”键和“S”键。

键盘控制器在扫描时,可能先检测到“A”键的回路闭合。
它立刻生成“A”键的扫描码,并发送出去。
然后,它又检测到“S”键的回路闭合,生成“S”键的扫描码,发送出去。

电脑接收到“A”的扫描码,就执行“输入 A”。接着接收到“S”的扫描码,就执行“输入 S”。所以你看到的,是先出现“A”,然后出现“S”。

有没有例外情况?

有时候,软件层面会做一些处理,比如防鬼键(Antighosting)和键位翻转(Key rollover)技术。这些技术主要是为了解决当你同时按下三个或以上按键时,某些组合的按键会失效的问题。

防鬼键: 主要是防止按下某些键组合时,系统把一个没按下的键也误判为按下了。
键位翻转(N键翻转,NKRO): 允许你同时按下任意数量的键,并且系统都能准确地识别和记录下来。如果你的键盘支持全键位翻转,那么它就能区分出你同时按下的所有键的顺序,而不是丢掉一些信号。

但是,即使有这些技术,底层的机制依然是“哪个扫描码先被处理”。这些技术只是让键盘控制器能处理更多、更复杂的按键组合,并以更精确的顺序传递信息。

总结一下,不存在哪个键“天生”就优先生效。 而是当你感觉同时按下两个键时,电脑操作系统收到的键盘信号的顺序决定了哪个键的动作会被先处理,然后才是第二个。这个顺序很大程度上取决于键盘控制器内部的扫描和数据发送机制,以及物理上极其微小的按键按下时间差。所以,与其说“优先生效”,不如说“先被电脑系统接收并处理”。

网友意见

user avatar

从几个层面上来解释一下吧,目前似乎没有太完整的回答。

首先,给一个链接:ti.com/lit/an/slaa514/s

这里有USB键盘的原理图和状态机,能从硬件层面上解释所有的问题。

首先,键盘其实就是一套开关矩阵(key matrix):

按键会接通相关的管脚,产生电信号。如果同时按下多个,就是多个信号。同时,手册上也描述了多个按键的情形,某些组合下,多个按键中的某几个会无法收到信号或者收到错误的信号("Ghost" Key):

所以,不管是按下一个,还是按下多个,对于芯片来说,都是可以处理的。

另外,键盘的键码叫做扫描码(Scan Code),扫描的意思已经很明显了,键盘控制器芯片是从周期性的扫描所有的管脚状态,对于高级的芯片,是一次性能处理多个按键的(比如我发的那个TI的),对于低级的芯片,可能就是一个一个的扫,扫到一个处理一个。所以如果是特别古老的键盘,同时按下几个键,在硬件上仍然是排队处理的。高级的芯片可以一次性获得所有的按键信息。

以TI这个芯片为例,它实际上支持多种模式,具体的扫描方式,手册中也给出了例子:

以上是硬件部分的设计。

再到传输层面上,PS/2和USB,这是两种不同的传输模式。

对于PS/2来说,使用的是键盘中断的方式,报告的是按下和弹起的事件。前面已经解释了,扫描码是从一个一个扫的,所以即使是同时按下,在扫描的过程中也是有先后次序的,按照这个次序报告键盘中断就可以了。

对于USB键盘就没有这种问题,USB键盘的报文格式是HID report,具体可以看这个回答:


HID report里只报告当前按下的按键信息,那么不管是同时按下几个键,都统一放到一个report里即可。所以USB键盘同时按下键位太多的时候,有些按键信息就丢失了。具体原因可以参见:

到了操作系统层面,比如Windows,实际上是针对硬件数据(HID report或者PS/2中断)再次重新解析。对于HID report,操作系统通常情况下就是从头开始读,所以哪个键码在report前面,哪个按键就被优先读取。

我在这个回答里,有描述Windows的处理方式(和调用栈):

复制部分内容出来(注意,调用栈比较老,不代表最新的Windows实现):

       1)硬件中断/硬件端口数据 2)键盘Port驱动(USB or PS/2) //Filter驱动在此 //KeyboardClassServiceCallback也在这一层被调用 3)kbdclass驱动 //处理键盘布局和键盘语言,部分高端的病毒也工作在这里 4)Windows内核边界(zwCreate/zwReadFile) ----------------------(系统调用)---------------------- 5)Windows内核边界(zwCreate/zwReadFile) 6)csrss.exe的win32k!RawInputThread读取,完成scancode和vk的转换 //SetWindowHook工作在这里(全局) //kbd_event工作在这里 7)csrss.exe调用DispatchMessage等函数分发消息(此处开始广播键盘消息) //SetWindowHook工作在这里(进程) //PostMessage和SendMessage在这里 8)各个进程(窗口线程)处理消息     

对于HID report或者PS/2中断信息来说,Windows的kbdclass驱动就会处理(重排),把按键转换成键盘布局指定的键码。Windows应用层是通过csrss.exe的win32k!RawInputThread来以Raw的方式读取按键的,这个时候都是一个一个读的。

这个问题下面有些使用脚本等方式模拟的,实际是在csrss这里实现的,包括Windows的VKEY的定义。

之后,再由csrss广播给各个窗口,这个时候已经是Windows的message格式的东西了。

如果能看得懂,最后放个结论

从根源的位置判断:

a) 对于PS/2类型的键盘,取决于键盘电路上扫描线路的布局,哪个按键的管脚靠前,哪个按键就会被优先扫到并上报;

b) 对于USB类型的键盘,取决于HID report上的次序,在前面的优先被处理,report上的次序可能源于扫描电路的次序,也可能是芯片有特殊控制

c) 操作系统会对键盘驱动获得的按键信息重新处理,实际应用层收到的内容不一定完全等价于总线信号的内容。

user avatar

反对一下其他人的回答。。。

其他人的回答都是说:哪怕你以为是同时,但计算机很快,能分辨出先后

但实际上,计算机说快很快,说慢也能很慢

这里的快慢指的是时钟周期

如果把时钟周期调成0.1Hz,也就是10秒一周期,那计算机应该算我们通常意义的“慢”


在一个时钟周期内,所做的所有操作(A-B-A先不考虑),计算机都认为是“同时”

比如以0为起始,在第2秒的时候的操作和第8秒的时候的操作,对计算机来说是同时;第9秒和第11秒不是同时


回到原题

“同时”按下两个键,比如第2秒按了a,第8秒按了b,同一时钟周期,哪个先生效?

不知道

“先后”按下两个键,比如第9秒按了a,第11秒按了b,不同时钟周期,哪个先生效?

a吗?也不知道


为嘛?

现在键盘按键的识别,很多是通过矩阵逐行扫描的方式工作的

比如一个键盘4行4列

会先看第0行哪些键按了,然后再扫第1行第2行第3行,再回到第0行

也就是说需要4个时钟周期,才能扫描完整个键盘

假如你同时(第2秒第8秒)按了两个键,这两个键又在同一行,被同时扫描到

对键盘来说,这一次扫描识别了两个键被按下,我会把这两个键的信息给cpu,至于把a放前面还是把b放前面,完全看写键盘芯片控制程序的程序员的处理方式

那先后按ab呢(第9秒按a,第11秒按b),假如a在第1行,b在第三行,此时扫描到了第2行,一个键也没有,下一个时钟周期扫第三行,那对键盘来说,是b先按了,然后下一轮发现a被按了

如果当时扫描在第0行,那下一个时钟周期,会先发现a被按下了,所以,哪怕你先按了a再按了b,都不能保证a先被生效

类似的话题

  • 回答
    在咱们日常用电脑的时候,有时候急了或者不小心,可能会同时按下两个键。这时候你可能会好奇,电脑到底会怎么处理?哪个键会“赢”呢?这其实是个挺有意思的问题,因为电脑处理“同时发生”的事情,跟咱们直觉可能不太一样。它不是一个简单的“先到先得”,而是涉及到一些底层的东西。首先,咱们得明白键盘是怎么跟电脑沟通.............
  • 回答
    你这个问题问得很有意思,涉及到C语言中一个基础但又有点“魔性”的特性:布尔值(Boolean Value)的表示方式。在咱们日常生活中,很多事情都是非黑即白的,比如“对”和“错”,“有”和“无”。计算机世界里也需要这种简单的二元判断。但问题来了,计算机本身只懂0和1,这两个数字如何承载“真”和“假”.............
  • 回答
    老实说,这个问题我反复琢磨过好几次了。毕竟,当年那个分数,摆在我面前的就是这么一个硬邦邦的选择:一个985的“天坑”专业,和一个211的计算机。当时年纪小,又是第一次经历这么重要的志愿填报,脑子里的想法跟现在比起来,简直是天壤之别。如果让我再选一次,并且情况还是这么个情况,我大概率会选择211的计算.............
  • 回答
    如果说广武君的计策在井陉之战中被采纳,那么韩信所面临的局面,将是另一番截然不同的景象。首先,我们要明白广武君的计策核心在于“避敌锋芒,伺机而动”。他并非主张正面硬碰硬,而是看到了赵军数量上的优势,以及井陉地势的复杂性,认为强攻只会让汉军陷入泥沼。因此,他的计策更倾向于一种迂回、智取的策略。假如韩信采.............
  • 回答
    东北大学秦皇岛分校(以下简称秦皇岛分校)计算机系赵同学的保研事件,确实在网络上引起了不小的波澜,特别是关于他“疑似假冒总校计算机系第一名”的说法,更是将整个事件推到了风口浪尖。要详细地看待这个问题,我们需要从几个层面去剖析,尽量还原事情的真相,并分析其背后的原因和影响。事件的起源与发酵:事情的开端,.............
  • 回答
    这个问题问得非常好,它涉及到计算机内部处理文本的底层原理和不同编码的优劣势。简单来说,计算机不是“不直接使用 UTF8 进行存储”,而是更准确地说,计算机在内部更倾向于使用一种统一的、能够表示所有字符的抽象表示,然后根据需要将其转换为不同的字节序列表示(编码),而 UTF8 就是最常用的一种字节序列.............
  • 回答
    在计算机内存管理中,堆(heap)和栈(stack)是两个至关重要的区域,它们的地址增长方向有着显著的不同:堆的地址是从低向高增长,而栈的地址则是从高向低增长。这种设计并非偶然,而是出于对效率、灵活性和安全性的综合考量。首先,让我们理解一下堆和栈各自的特点。栈(Stack):栈是一种非常高效的内存管.............
  • 回答
    在计算机领域,“utility”这个词,虽然字面意思是“效用”或“用途”,但它在中文里的翻译却是一个需要细细体会的概念,不能简单地一词对应。它所指代的,更多的是那些服务于特定目的,帮助用户完成更高效、更便捷操作的工具或者程序。你可以这样理解:当你的电脑出现了一些小问题,比如需要清理磁盘空间、卸载顽固.............
  • 回答
    汉字作为我们中华民族几千年文明的载体,其在计算机中的呈现方式,是一门既深奥又充满智慧的学问。简单说来,计算机只能理解0和1,那么如何将承载着丰富含义的汉字,转化为这些冷冰冰的二进制数字呢?这背后涉及一系列精妙的编码和渲染技术。一、 汉字编码:让计算机“认识”汉字编码,就好比给每个汉字一个独一无二的身.............
  • 回答
    计算机视觉中的目标跟踪是一个至关重要的研究领域,旨在在视频序列中持续地定位和识别一个或多个目标。随着深度学习的兴起,目标跟踪算法取得了显著的进展。以下是一些计算机视觉中经典的目标跟踪算法,我将尽量详细地介绍它们的核心思想、特点和发展历程: 早期经典算法(基于手工特征和滤波)在深度学习普及之前,目标跟.............
  • 回答
    在计算机图形学这个广阔的领域里,物理模拟和渲染无疑是两个非常核心且影响深远的方向。要判断它们是“距离较远”还是“互相交织”,答案是后者,而且是深度交织,互相依存,甚至在许多情况下可以说是同一个人身上不可分割的两个重要部分。理解这一点,我们需要先分别拆解这两个概念,然后看看它们是如何碰撞并融合在一起的.............
  • 回答
    计算机视觉中的视频理解(Video Understanding)领域,是一块非常活跃且充满挑战的研究疆域。它不仅仅是识别视频中的物体,而是要理解视频中发生的事件、动作、物体间的关系、以及随时间变化的动态过程。这项技术在智能监控、自动驾驶、体育分析、人机交互、医疗诊断等众多领域有着巨大的应用潜力。要深.............
  • 回答
    在各个学科领域中,"Hello World!"作为基础示例具有象征性,它不仅是编程入门的起点,也代表了该领域中最具代表性的初始模型或概念。以下从多个领域出发,详细阐述其"Hello World!"形式及其意义: 1. 计算机科学 经典示例:C语言的`printf("Hello, World! ");.............
  • 回答
    在中国中小学计算机课堂中,推广 Linux 系统而不用 Windows,这绝对是一个值得深入探讨的问题,而且,答案是:可能性是存在的,但挑战也相当巨大。要详细解读这一点,我们需要从几个层面去分析。一、 推广 Linux 的潜在优势与吸引力首先,为什么会有人想要在中小学阶段推广 Linux?这背后肯定.............
  • 回答
    要说为什么计算机没有成为中高考的必考科目,这背后其实是一系列复杂考量交织的结果,绝非简单的“不重要”就能概括。首先,我们需要认识到,中高考作为一种基础教育的选拔性考试,它的核心目标是考察学生在核心基础知识和能力上的掌握程度。虽然计算机科学在当今社会的重要性毋庸置疑,但与语文、数学、外语这些学科相比,.............
  • 回答
    计算机语言中的运算符设计,尤其是“=赋值”、“==等于”、“===严格等于”这类区分,以及变量命名中的“a”、“aa”、“aaa”这种模式,其实都透露出一种对清晰性、精确性和可维护性的追求,虽然它们在不同层面展现了这种思考。先说运算符。为什么会有“=赋值”和“==等于”甚至是“===严格等于”的区别.............
  • 回答
    在我们日常生活中,时间的概念是连续而平滑的,但当涉及到计算机内部对时间的处理时,有时候会遇到一些令人意外的细节。拿“上午11:59”和“上午12:01”这两个时间点来说,它们之间看似只有短短两分钟的间隔,但如果深入到计算机的标准时间表示方式,这中间其实隐藏着一个重要的“门槛”——中午12点整。在许多.............
  • 回答
    好的,我们来聊聊计算机视觉领域里,Transformer 和 Nonlocal Attention 之间的本质区别,尽量说得细致一些,去掉那些 AI 痕迹。想象一下,我们看一张照片,比如一张风景照。我们的眼睛是如何理解这张照片的呢?我们不仅仅是看某个像素点,而是会将不同的部分联系起来。比如,我们看到.............
  • 回答
    是的,计算机在德州扑克比赛中不仅可以战胜人类,而且在某些特定情况下,已经能够以压倒性的优势战胜最顶尖的人类玩家。这并非易事,而是多年来人工智能(AI)研究,特别是博弈论和机器学习领域深入探索的成果。为了详细说明这一点,我们可以从以下几个方面来解读:1. 德州扑克本身的复杂性德州扑克之所以成为AI研究.............
  • 回答
    这个问题很有意思,因为它触及到了计算机编程在“理科”和“文科”光谱中的位置。我个人认为,计算机编程更偏向于理科,但它又包含着许多与文科思维息息相关的元素,使得它成为一个非常独特的学科。 如果非要说“偏文”,那也只是一种比喻,用来形容它其中那些非纯粹逻辑的部分。我们先从编程的“理科”属性说起,这部分是.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有