Language agnostic 软件事件如何在内部工作?

Language agnostic 软件事件如何在内部工作?,language-agnostic,computer-science,performance,events,Language Agnostic,Computer Science,Performance,Events,我是一名计算机科学专业的学生,在计算机程序运行时,我已经学习了许多关于“引擎盖下”发生的事情的基本概念。但是最近我意识到我不理解软件事件是如何高效工作的 在硬件中,这很简单:组件发送一个中断请求,而不是处理器“忙着等待”看是否发生了什么事情 但这在例如鼠标悬停事件中是如何工作的呢?我的猜测如下:如果鼠标发送信号(“移动”),操作系统计算其新位置p,然后检查屏幕上正在绘制的程序,告诉程序位置p,然后程序本身检查p处的对象,检查是否有任何事件处理程序与所述对象相关联,最后触发它们 对我来说,这听起来

我是一名计算机科学专业的学生,在计算机程序运行时,我已经学习了许多关于“引擎盖下”发生的事情的基本概念。但是最近我意识到我不理解软件事件是如何高效工作的

在硬件中,这很简单:组件发送一个中断请求,而不是处理器“忙着等待”看是否发生了什么事情

但这在例如鼠标悬停事件中是如何工作的呢?我的猜测如下:如果鼠标发送信号(“移动”),操作系统计算其新位置p,然后检查屏幕上正在绘制的程序,告诉程序位置p,然后程序本身检查p处的对象,检查是否有任何事件处理程序与所述对象相关联,最后触发它们

对我来说,这听起来非常低效,因为一个小小的鼠标移动就相当于大量的cpu上下文切换(我知道这是相对昂贵的)。还有几十个后台应用程序可能也想做自己的事情

我的直觉哪里让我失望了?我意识到,即使是“慢”的500MHz处理器每秒也会执行5亿次操作,但对于这样一个简单的事件来说,这似乎太多了


提前谢谢

你根据什么标准判断它太多了?这是尽可能多的工作。鼠标事件发生在毫秒范围内。将其发送到处理程序代码所需的工作可能以微秒为单位。这不是一个问题。

根据什么标准,你认为这太多了?这是尽可能多的工作。鼠标事件发生在毫秒范围内。将其发送到处理程序代码所需的工作可能以微秒为单位。这不是问题。

我的理解如下:

每个应用程序/窗口都有一个由操作系统中断填充的事件循环。 鼠标移动将进入其中。 据我所知,所有窗口都有一个单独的队列/进程(从3.1开始在windows中)

每个窗口都有控件。 窗口将向控件弹出此事件。 控件将确定事件是否适合他

因此,不必“计算”鼠标光标下绘制的项目。
窗口,然后控件将确定事件是否针对他们。

我的理解如下:

每个应用程序/窗口都有一个由操作系统中断填充的事件循环。 鼠标移动将进入其中。 据我所知,所有窗口都有一个单独的队列/进程(从3.1开始在windows中)

每个窗口都有控件。 窗口将向控件弹出此事件。 控件将确定事件是否适合他

因此,不必“计算”鼠标光标下绘制的项目。
打开窗口,然后控件将确定事件是否针对他们。

考虑网络数据包之类的事件,因为它们通常由类似的机制处理。现在想想,你的鼠标每秒最多发送几百个数据包,每个数据包大约有6个字节。与现代机器的带宽能力相比,这算不了什么


事实上,您可以制作一个响应性GUI,其中每一次鼠标移动都会在大约20年前构建的硬件上发送一个网络数据包(86字节,包括标题):X11,Linux和大多数其他Unix的基本GUI机制,可以做到这一点,并且在80年代末和90年代初经常以这种方式使用。当我第一次使用GUI时,它就是这样,虽然按照目前的标准,它不是很好,但考虑到它在20 MHz的机器上运行,它确实是可用的。

想想网络数据包之类的事件,因为它们通常由类似的机制处理。现在想想,你的鼠标每秒最多发送几百个数据包,每个数据包大约有6个字节。与现代机器的带宽能力相比,这算不了什么


事实上,您可以制作一个响应性GUI,其中每一次鼠标移动都会在大约20年前构建的硬件上发送一个网络数据包(86字节,包括标题):X11,Linux和大多数其他Unix的基本GUI机制,可以做到这一点,并且在80年代末和90年代初经常以这种方式使用。当我第一次使用GUI时,它就是这样,虽然按照目前的标准,它不是很好,但考虑到它在20 MHz的机器上运行,它确实是可用的。

你说得很对-尽管鼠标事件以固定的速率发生(例如linux上的USB鼠标默认每秒给你125次事件-这真的不多),,操作系统或应用程序可能会进一步合并时间或位置接近的鼠标事件,然后再将其发送处理

你说得很对-尽管鼠标事件以固定速率发生(例如,linux上的USB鼠标默认每秒给你125次事件,这其实并不多),,操作系统或应用程序可能会进一步合并时间或位置接近的鼠标事件,然后再将其发送处理

我认为他正是要求对工作量进行一些“量化”,以了解工作量是否过大。(显然不是,因为它确实起作用,但当你有一些数字要看时会更好)我想他正是在要求对工作量进行一些“量化”,以了解工作量是否太大。(显然不是,因为它确实起作用,但当你有一些数字要看时会更好)小心“低效”之类的概念,因为效率总是相对的,当处理器的运行速度比我们快6到9个数量级时,关于什么是高效的直觉是不可信的。从数量的角度来看,这有助于。。。。顺便说一句,即使是处理器中的中断请求,在微码级也仍然是通过忙等待来完成的。在微码状态机中有一个点,它查询中断请求行,以查看是否应该启动中断序列。请小心