当我的Mac进入睡眠状态时,我的应用会发生什么?

时间:2008-09-22 19:24:22

标签: macos sleep process-management

当Mac OS X进入睡眠状态时,由于关闭笔记本电脑或从Apple菜单中选择“睡眠”,它如何暂停执行过程?

我认为非窗口进程只是在任意执行点暂停。对于Cocoa应用程序也是如此,或者操作系统是否等到控制权返回到运行循环调度程序,然后在“已知”位置进入睡眠状态?是否有任何现代操作系统可以做到这一点,或者它通常是否足够安全,无论它在做什么都可以暂停应用程序?

我很好奇,因为在任何时候允许睡眠都意味着,从应用程序的角度来看,系统时钟可能会突然大幅提升。这是编码时我通常不会考虑的一种可能性。

5 个答案:

答案 0 :(得分:21)

如果CPU实际上正在执行您应用的代码,那么您的应用就会被中断。您的应用程序不断通过任务计划程序获取执行时间,从而决定哪个应用程序获得CPU时间,核心以及持续时间。一旦系统真正进入休眠状态,调度程序就会不再为你的应用程序提供时间,因此它将在那个时刻停止执行,这几乎可以在任何地方发生。但是,内核必须处于干净状态。这意味着如果你只是调用内核(许多libC函数都这样做)并且这个调用不在某个安全点(例如,休眠,等待条件变为真等等)或者可能持有关键内核锁(例如漏斗),内核可以暂停睡眠,直到此调用返回到用户空间或执行达到这样一个安全点,然后最终从任务调度程序中取消您的应用程序。

您可以打开内核端口并注册睡眠/唤醒事件。在这种情况下,当系统想要进入睡眠状态时,您的应用将收到一个事件。你有几种可能性。一个是回复它,系统可能会进展。另一个是暂停睡眠;但是,Apple表示某些事件最多可以暂停30秒,之后系统将继续,无论您的应用是否喜欢。最后,你可以取消它;虽然并非所有事件都可以取消。如果系统已经决定它将进入休眠状态,您只能将其暂停最多30秒或立即允许它,您无法取消它。但是,您也可以收听系统询问应用程序的事件,如果可以立即进入睡眠状态,您可以回复“否”,从而导致睡眠被取消。

“可以睡觉”和“我正在计划睡觉”之间的区别是:如果应用省电设置,即第一个被发送,即用户没有移动鼠标或者在那里配置的时间键入任何内容。在这种情况下,系统只会询问睡眠是否正常。像Apple的DVD播放器这样的应用程序会说“不”,因为很可能用户观看DVD并因此不与计算机交互,仍然没有理由去睡觉。 OTOH,如果用户关闭他的Mac Book,不会询问应用程序,系统肯定会进入睡眠状态并通知应用程序,现在最多有30秒的时间对其做出反应。

唤醒事件也很有趣。例如。如果您的系统醒来,打开的文件可能无法访问(外部驱动器已拔下)或网络套接字不再工作(网络已更改)。因此,您可以在使用它们之前重新初始化某些应用程序部分,并遇到或多或少的错误。

Apple's page regarding catching these events.

答案 1 :(得分:3)

这取决于您的应用。
如果您正在与外部系统交互(想想网络或通过usb / firewire等做某事),那么它可能会受到影响。在OSX上运行的应用程序可以运行一段有限的时间(最长10毫秒),然后由内核中断它,它会从进程队列调度一个新进程以在CPU上运行。这对应用程序是透明的,它“认为”它一直在CPU上运行。因此,除了跳跃的时间之外,向睡眠的过渡也没有什么不同 如果您需要了解转换到睡眠模式,请参阅此技术说明,其中详细说明了如何接收有关状态更改的通知:Registering and unregistering for sleep and wake notifications

答案 2 :(得分:1)

我相信它会暂停所有应用程序。

请记住,无论如何这种情况一直都在发生。由于上下文切换,应用程序不断暂停和恢复。所以,真的,时钟可以在应用程序中的任何2条指令之间跳转,但通常不会以明显/重要的方式。

如果操作系统等待应用程序返回某个主循环,则可能会遇到应用程序导致睡眠挂起的情况。如果他们做了很多工作而没有返回到运行循环调度程序,他们会阻止机器进入睡眠状态。那不是很好。 :)

答案 3 :(得分:0)

如果您设置时间,它似乎也会跳跃到正在运行的程序。没什么特别的。

答案 4 :(得分:0)

查看此维基百科article。 Cavver说网络连接之类的东西可能会超时,因此这些服务可能会被中断。