Mac进入睡眠状态后,我的应用程序会如何处理?
当Mac OS X进入睡眠状态时,由于关闭笔记本电脑或者从Apple菜单中选择"睡眠",它如何暂停正在执行的进程?
我想非窗口进程只是在任意执行点被挂起。这对于Cocoa应用程序是否也适用,或者操作系统是否等到控制权返回到运行循环调度程序并在"已知"位置进入睡眠状态?是否有任何现代的OS可以做到这一点,或者无论它在做什么,通常都足以安全地挂起一个应用程序吗?
我很好奇,因为从应用程序的角度看,任何时候都允许睡眠意味着系统时钟可能会突然大幅跳升。我在编码时通常不会考虑这种可能性。
解决方案
我相信它将暂停所有应用程序,无论它们位于何处。
记住,这总是发生。由于上下文切换,应用程序会不断暂停和恢复。因此,实际上,时钟通常可以在应用程序中的任何2条指令之间跳转,尽管通常不会以明显/有意义的方式进行。
如果操作系统等待应用程序返回某个主循环,则可能会遇到应用程序导致睡眠挂起的情况。如果他们正在做很多工作并且不返回运行循环调度程序,则将阻止计算机进入睡眠状态。那不是很好。 :)
而且,如果我们设置了时间,它似乎也会跳到正在运行的程序。也没什么特别的。
这取决于应用程序。
如果我们正在与外部系统进行交互(例如联网或者通过usb / firewire等进行操作),则可能会受到影响。在OSX上运行的应用程序必须运行一段有限的时间(最多10毫秒),然后被内核中断,该内核计划从进程队列中调度新进程以在CPU上运行。这对于应用程序是透明的,它"认为"它始终在CPU上运行。因此,除了向前跳跃的时间以外,过渡到睡眠也没有什么不同。
如果我们需要知道已经过渡到睡眠模式,请参阅此技术说明,其中详细说明了如何接收有关状态更改的通知:注册和注销睡眠和唤醒通知
查阅这篇Wikipedia文章。 Cavver说网络连接可能超时,因此这些服务可能会中断是正确的。
如果CPU当前正在实际执行应用程序代码,则该应用程序将被完全中断。应用程序不断地由任务调度程序获取执行时间,该任务调度程序决定哪个应用程序获得CPU时间,在哪个内核上以及持续多长时间。一旦系统真正进入睡眠状态,调度程序便不再给应用程序更多时间,因此无论何时何地它都将停止执行,这几乎可以在任何地方发生。但是,内核必须处于干净状态。这意味着如果我们刚刚调用了内核(许多libC函数这样做),而该调用不在某个安全点(例如,睡眠,等待条件变为真等),或者可能持有关键的内核锁(例如,程序),内核可能会暂停睡眠,直到此调用返回用户空间或者执行达到安全点为止,然后才最终从任务计划程序中取消应用。
我们可以打开内核端口并注册睡眠/唤醒事件。在这种情况下,系统要进入睡眠状态时,应用将收到一个事件。我们有几种可能性。一种是回复它,以便系统可以继续前进。另一个是暂停睡眠;但是,苹果表示某些事件最多可以暂停30秒,之后,无论应用程序是否喜欢,系统都将继续运行。最后,我们可以取消它;尽管并非所有事件都可以取消。如果系统已经确定它将进入睡眠状态,则我们最多只能将其暂停30秒,或者一次允许它,我们无法取消它。但是,我们也可以听一个事件,系统会询问应用程序,现在可以进入睡眠状态了,在那里我们可以回答"否",从而导致睡眠被取消。
"可以睡了吗"和"我打算睡觉"之间的区别是:如果应用了节能设置,即用户没有移动鼠标或者键入任何内容,则发送第一个消息在那里配置的时间。在这种情况下,系统只会询问睡眠是否正常。苹果DVD播放器之类的应用会说"不",因为用户很可能观看DVD,因此不与计算机交互,仍然没有理由入睡。 OTOH,如果用户关闭Mac Book,不询问应用程序,则系统将确定进入睡眠状态,并仅通知应用程序,这些应用程序现在最多可以响应30秒。
唤醒事件也很有趣。例如。如果系统唤醒,则打开的文件可能无法访问(已拔出外部驱动器),或者网络套接字不再起作用(网络已更改)。因此,我们可以在使用某些应用程序部件之前重新初始化它们,并遇到或者多或者少预期的错误。
Apple有关捕获这些事件的页面。