17

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

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

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

4

5 回答 5

22

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

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

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

Wake-up events can also be quite interesting to catch. E.g. if your system wakes up, open files might be inaccessible (an external drive has been unplugged) or network sockets won't work any longer (network has changed). So you may re-init certain app parts before using them and running into errors that are more or less expected.

Apple's page regarding catching these events.

于 2008-09-23T18:24:36.677 回答
3

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

于 2008-09-23T11:25:48.930 回答
1

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

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

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

于 2008-09-22T19:30:21.193 回答
0

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

于 2008-09-22T19:34:28.780 回答
0

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

于 2008-09-23T13:37:16.510 回答