-->

当我的Mac进入睡眠状态会发生在我的应用?(What happens to my app when

2019-07-30 15:38发布

当Mac OS X的进入睡眠状态,由于关闭一台笔记本电脑,或从苹果菜单中选择“休眠”,它是如何中止正在执行的进程?

我想非窗口过程简单地悬挂在执行的任意点。 是不是也适用于Cocoa程序,或做了OS等到控制返回到运行循环调度,并进入睡眠状态,在“知”的位置? 有没有任何现代的操作系统做到这一点,或者是它通常是足够安全简单地暂停一个应用程序,不管它是做什么?

我很好奇,因为发生允许睡在任何时刻是指,从应用程序的角度来看,系统时钟会突然被一个显著量的飞跃。 这是一个可能性,我在编码通常不考虑。

Answer 1:

您的应用程序被中断它的确切位置,如果CPU实际上是当前正在执行你的应用程序代码的那一刻。 您的应用程序不断被任务调度得到执行时间 ,决定哪些应用程序获得CPU时间,在哪个内核,并能持续多久。 一旦系统真正进入睡眠状态,调度只是给没有时间去您的应用程序不再,因此它会无论它是在那一刻,它可以发生几乎无处不停止执行。 但是,内核必须是干净的状态。 这意味着,如果你只是打了一个电话到内核(许多libc函数做),这调用并不是一些安全点(如睡眠,等待条件要成为真正的,等等),或可能持有关键的内核锁(如漏斗),直到此调用返回到用户空间或执行达到这样的安全点时,它终于从任务计划程序将取消您的应用程序之前,内核可能会暂停睡眠。

你可以打开一个内核端口和注册睡眠/唤醒事件。 在这种情况下,你的应用程序将收到一个事件,当系统想要去睡觉。 您有几种可能性。 一是要回复它,该系统可能进展。 另一种是将暂停睡眠; 然而,苹果公司表示,某些事件能够在30秒暂停,在此之后,系统将只是继续,你的应用程序是否喜欢与否。 最后,你可以取消; 虽然不是所有的事件都可以取消。 如果系统中已经决定了它会进入睡眠状态,只能通过最多30秒暂停本或允许它一次,就无法取消。 但是,你也可以听的事件,其中,系统要求的应用程序,如果可以去睡觉了,有你可以这样回答“没有”,导致睡眠被取消。

之间的差异“是可以接受入睡”和“我刨去睡觉”是:如果应用省电设置第一个被发送,也就是说,如果用户不移动鼠标或打字什么为配置有时间。 在这种情况下,系统只会问,如果睡眠是好的。 像苹果的DVD播放机的应用程序会说“不”,因为很有可能用户观看DVD,因此不会与计算机进行交互,还是没有理由去睡觉。 OTOH,如果用户关闭了他的Mac书,应用也不能问,系统将进入睡眠状态肯定的,只是通知应用程序,有现在30秒,以应对它。

唤醒事件也可以是很有趣的捕捉。 例如,如果你的系统中醒来,打开的文件可能无法访问(外部驱动器被拔出)或网络套接字不会不再工作(网络已经改变)。 所以,你可以使用他们,并运行到那些或多或少的预期错误,然后再重新初始化某些应用程序部分。

苹果公司的网页醒目关于所这些事件。



Answer 2:

这取决于你的应用程序。
如果你是与外部系统进行交互(认为网络或做一些事情通过USB /火线等),那么它可能会受到影响。 OSX上运行的应用获取到有限的时间(最多10毫秒),之后将其从进程队列一个新的进程的CPU上运行的调度内核中断运行。 这是透明的应用程序,它“认为”它运行所有的CPU上的时间。 因此,睡眠的过渡是没有什么不同 - 除了时间向前跳跃。
如果你需要知道,有睡眠模式,请参阅本技术说明中详细介绍了如何接收关于状态变更通知的转变: 注册和注销的睡眠和唤醒的通知



Answer 3:

我认为它只是暂停无论在哪里都成为所有应用。

请记住,反正这一切发生的时间。 应用程序不断地挂起和恢复由于上下文切换。 所以,真正的时钟可以在您的应用程序的任何2个指令之间跳,但通常不会在noticable /显著方式。

如果操作系统等待应用程序返回一些主循环,你可能会遇到其中的应用程序会导致睡眠挂起情况。 如果他们做了很多工作,而不是返回运行循环调度员,他们将防止机器进入休眠状态。 这不会是非常好的。 :)



Answer 4:

如果你设置的时间也显得飞跃到正在运行的程序。 没什么特别的要么。



Answer 5:

看看这个维基百科文章 。 Cavver是正确地指出,之类的东西的网络连接可能会超时,因此这些服务可能会中断。



文章来源: What happens to my app when my Mac goes to sleep?