当我的 Mac 进入睡眠状态时,我的应用程序会发生啥?

Posted

技术标签:

【中文标题】当我的 Mac 进入睡眠状态时,我的应用程序会发生啥?【英文标题】:What happens to my app when my Mac goes to sleep?当我的 Mac 进入睡眠状态时,我的应用程序会发生什么? 【发布时间】:2010-09-12 03:07:07 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

我相信它只会暂停所有应用程序,无论它们发生在哪里。

请记住,这种情况总是会发生。由于上下文切换,应用程序会不断暂停和恢复。因此,实际上,时钟可能会在您的应用程序中的任何 2 条指令之间跳跃,尽管通常不会以明显/显着的方式。

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

【讨论】:

但操作系统要求应用程序自行挂起,如果在指定时间内没有,则强制它挂起,这并非史无前例。所以好公民可以打扫卫生,坏公民不可以捣乱。【参考方案2】:

如果您设置时间,它似乎也会向前运行程序。也没什么特别的。

【讨论】:

【参考方案3】:

这取决于您的应用。 如果您正在与外部系统交互(考虑联网或通过 USB/火线等进行操作),那么它可能会受到影响。在 OSX 上运行的应用程序会运行有限的时间(最长 10 毫秒),之后它会被内核中断,内核会从进程队列中安排一个新进程在 CPU 上运行。这对于应用程序来说是透明的,它“认为”它一直在 CPU 上运行。因此 , 进入 睡眠 的 过渡 没有 什么 不同 -- 除了 时间 向前 跳跃 . 如果您需要注意已转换到睡眠模式,请参阅此技术说明,其中详细说明了如何接收有关状态更改的通知:Registering and unregistering for sleep and wake notifications

【讨论】:

【参考方案4】:

查看此***article。 Cavver 正确地指出网络连接可能会超时,因此这些服务可能会中断。

【讨论】:

【参考方案5】:

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

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

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

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

Apple's page regarding catching these events.

【讨论】:

以上是关于当我的 Mac 进入睡眠状态时,我的应用程序会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

当设备进入睡眠状态时服务会发生啥

当我的程序运行时,防止 Windows 进入睡眠状态?

有没有办法阻止我的 Razer 笔记本电脑随机进入睡眠模式? [关闭]

如何使用 Swift 以编程方式让 Mac 进入睡眠状态

当 iPhone/Android 进入睡眠状态时,JavaScript 执行(settimeout 等)会发生啥?

ios空闲时间或使设备进入睡眠状态