-1

在低水平,

  1. Chrome 如何知道我的鼠标进入了屏幕?
  2. 我的 Iphone 上的闹钟如何知道设置闹钟后 7 小时是上午 9:00?

  1. 从根本上说是否有重复的民意调查?

或者是否有某种内置的事件循环(在这两种情况下),我们只需将函数注册到......然后在我们的应用程序中根据需要在正确的上下文中自动调用这些函数?

  1. 这个事件循环是所有操作系统都暴露的吗?我认为我们需要闭包和函数作为一流的对象。它在以 Objective-C(而不是 js 或某种函数式语言)为核心语言的 iOS 等操作系统中如何工作?
4

1 回答 1

1

与随着时间的推移而增长的大多数系统一样,它有些复杂。在不同的层次上做不同的事情。例如:你还记得IRQ 吗?今天在我们的更高级别的程序中,我们不太担心它们,但是一两年前,您必须确保您的硬件没有使用冲突的 IRQ。这些实际上是一个硬件回调设置(仍然是更新的形式(我无法发布足够的链接,但之前的维基百科文章有一个指向 APIC 架构的链接),但我多年来不必处理它们。)。系统将有一些小例程,CPU(这是在 x86 CPU 上)将该代码的地址分配给“中断请求行”。然后,当该行另一端的硬件发出信号时,CPU 将丢弃所有内容并跳转到那段代码。

但是还有更复杂的情况,例如问题(i)。鼠标光标进入 Chrome 窗口显然没有硬件中断。发生的情况是操作系统捕获鼠标移动的硬件中断并使用该信息来更新光标位置(当然有像Allegro这样的库可以为您提供硬件光标,并进一步混淆查询的水域)。然后,操作系统有一个程序列表,这些程序已请求通知(以及如何通知每个程序)有关各种鼠标移动事件,操作系统会遍历该列表并计算应告知哪些程序。

(ii) 实际上更简单,因为最常见的中断之一是定时器。通常,操作系统仍然充当硬件和程序之间的缓冲区,如 (i) 中所示。

(1) 虽然您经常希望定期执行某项操作,但您的程序通常不需要重复轮询。然而,操作系统可能会做不同的事情。例如:我之前提到的那些中断例程必须非常快,以避免中断被中断或忽略其他事件。所以一种常见的策略是让中断例程只设置一些内存来说明发生了什么事,然后让操作系统循环的正常部分定期轮询这些内存位置。然而,这是一个系统问题,而不是应用程序问题。

(2) 我熟悉的大多数操作系统都提供事件回调 API。有些,像旧的 MS-DOS,真的没有给你太多的 API,只是让你分配你自己的中断处理程序,(对于硬件和软件中断。)大多数现代操作系统通过调度程序公开这个功能。程序将在等待特定事件或一组事件时放弃控制。各种库将其隐藏在自己的内部事件循环中。回调函数是处理这些库的内部事件循环的常用方法。我不完全有资格与 Objective C 交谈,但由于它是 C 的严格超集(根据 Wikipedia),它可以以与 C 相同的方式使用回调(尽管我想可能被认为是不好的风格)。

我希望这能给你一些你正在寻找的信息。

于 2013-07-08T05:35:17.363 回答