处于较低水平,
i)Chrome如何知道我的鼠标进入了屏幕? ii)我的Iphone上的闹钟如何知道它是在我设置闹钟后7小时的上午9点?
1)从根本上来说,是否有重复的民意调查?
或者是否存在某种内置事件循环(在两种情况下)我们只是将函数注册到......这些函数然后在我们的应用程序中根据需要在正确的上下文中自动调用?
2)这个事件循环是否会暴露所有操作系统?我认为我们需要闭包和函数作为第一类对象。它是否在OS中工作,如iOS,其中Objective C(而不是js或某些函数语言)是核心语言?
答案 0 :(得分:1)
与大多数随时间增长的系统一样,它有点复杂。不同的事情在不同的层面上完成。例如:你记得IRQs?我们今天在更高级别的程序中并不担心它们,但是在十年或两年前你必须确保你的硬件没有使用冲突的IRQ。这些实际上是一个硬件回调设置(仍然是更新的形式(我不能发布足够的链接,但以前的维基百科文章有一个链接到APIC架构),但我多年来没有必须处理它们。)。系统会有一些小例程,而CPU(这是在x86 CPU上)会将该代码的地址分配给“中断请求线”。然后,当该行另一端的硬件发出信号时,CPU将丢弃所有内容并跳转到该位代码。
但是有更复杂的情况,例如问题(i)。鼠标光标进入Chrome窗口时显然没有硬件中断。操作系统会捕获用于鼠标移动的硬件中断,并使用该信息来更新光标位置(当然,有Allegro这样的库可以为您提供硬件游标,并且进一步混淆了查询的水域)。然后操作系统有一个程序列表,要求通知各种鼠标移动事件(以及如何通知每个程序),操作系统会通过该列表并计算应该告知哪些程序。
(ii)实际上更简单,因为最常见的中断之一是计时器。通常,OS仍然充当硬件和程序之间的缓冲区,如(i)。
(1)虽然您经常希望定期执行某些操作,但您的程序通常不需要反复轮询。然而,OS可能以不同的方式做事。例如:我之前提到的那些中断例程必须非常快,以避免中断中断或忽略其他事件。因此,一个常见的策略是让中断例程只是设置一些内存来说明发生的事情,然后让OS循环的正常部分定期轮询这些内存位置。然而,这是系统问题,而不是应用程序问题。
(2)我熟悉的大多数操作系统都提供事件回调API。有些像旧的MS-DOS一样,实际上没有给你太多的API,只是让你分配自己的中断处理程序(对于硬件和软件中断)。大多数现代操作系统通过调度程序公开这个功能。程序将在等待特定事件或一组事件时放弃控制。各种库在自己的内部事件循环中隐藏它。回调函数是处理这些库的内部事件循环的常用方法。我并不完全有资格与Objective C交谈,但由于它是C的严格超集(根据维基百科),它可以像C一样使用回调(我想可能会被认为是糟糕的风格)。
我希望这能为您提供一些您正在寻找的信息。