当 Mac OS X 进入睡眠状态时,由于关闭笔记本电脑或从 Apple 菜单中选择“睡眠”,它如何暂停正在执行的进程?
我认为非窗口进程只是在任意执行点挂起。对于 Cocoa 应用程序来说也是如此,还是操作系统会等到控制权返回到运行循环调度程序并在“已知”位置进入睡眠状态?现代操作系统是否会这样做,或者通常是否足够安全,可以简单地暂停应用程序,无论它在做什么?
我很好奇,因为从应用程序的角度来看,允许随时发生睡眠意味着系统时钟可能会突然大幅向前跳跃。这是我在编码时通常不会考虑的可能性。
如果 CPU 当前实际上正在执行应用程序的代码,那么您的应用程序就会在此时被中断。您的应用程序不断获得执行时间处理时间由任务调度程序决定哪个应用程序获得 CPU 时间、在哪个核心上以及多长时间。一旦系统really进入睡眠状态,调度程序不再给您的应用程序任何时间,因此无论它在哪一刻,它都会停止执行,这几乎在任何地方都可能发生。但是,内核必须处于干净状态。这意味着如果您刚刚对内核进行了调用(许多 libC 函数都是如此),并且该调用未处于某个安全点(例如休眠、等待条件变为真等)或可能持有关键内核锁(例如漏斗),内核可能会暂停睡眠,直到此调用返回到用户空间或执行达到这样的安全点,然后才最终从任务调度程序中取消您的应用程序。
您可以打开内核端口并注册睡眠/唤醒事件。在这种情况下,当系统想要进入睡眠状态时,您的应用程序将收到一个事件。你有几种可能性。一是回复它,系统才能进步。另一种是暂停睡眠;然而,Apple 表示某些事件最多可以暂停 30 秒,之后系统将继续运行,无论您的应用程序是否喜欢。最后,您可以取消它;但并非所有活动都可以取消。如果系统已经决定进入睡眠状态,您只能暂停最多 30 秒或立即允许,无法取消。但是,您也可以监听一个事件,系统会询问应用程序是否可以立即睡觉,然后您可以回答“不”,从而取消睡眠。
“可以睡觉了吗”和“我打算去睡觉”之间的区别是:如果应用了省电设置,即,如果用户没有移动鼠标或键入任何内容,则发送第一个消息那里配置的时间。在这种情况下,系统只会询问睡眠是否可以。像苹果 DVD 播放器这样的应用程序会说“不”,因为用户很可能观看 DVD,因此不会与计算机交互,仍然没有理由去睡觉。 OTOH,如果用户关闭他的 Mac Book,不会询问应用程序,系统肯定会进入睡眠状态,只是通知应用程序,现在应用程序有最多 30 秒的时间对此做出反应。
唤醒事件也很有趣。例如。如果您的系统唤醒,打开的文件可能无法访问(外部驱动器已拔出)或网络套接字将不再工作(网络已更改)。因此,您可能会在使用某些应用程序部件之前重新初始化它们,并遇到或多或少预期的错误。
Apple 关于捕获这些事件的页面。 http://developer.apple.com/qa/qa2004/qa1340.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)