Что происходит с моим приложением, когда мой Mac засыпает? - PullRequest
15 голосов
/ 22 сентября 2008

Когда Mac OS X переходит в режим сна, из-за закрытия ноутбука или выбора «Sleep» в меню Apple, как он приостанавливает выполнение процесса?

Я полагаю, что неоконные процессы просто приостановлены в произвольной точке выполнения. Это также верно для приложений Какао, или ОС ждет, пока управление вернется к диспетчеру цикла выполнения и перейдет в спящий режим в «известном» месте? Делает ли это какая-либо современная ОС, или это обычно достаточно безопасно, чтобы просто приостановить приложение, независимо от того, что оно делает?

Мне любопытно, потому что разрешение сна в любой момент означает, что с точки зрения приложения системные часы могут внезапно выскочить на значительную величину. Эту возможность я обычно не рассматриваю при кодировании.

Ответы [ 5 ]

21 голосов
/ 23 сентября 2008

Ваше приложение прерывается точно в тот момент, когда процессор фактически выполняет код вашего приложения. Ваше приложение постоянно получает время выполнения с помощью планировщика задач, который решает, какое приложение получает процессорное время, на каком ядре и как долго. Когда система действительно переходит в спящий режим, планировщик просто больше не дает времени вашему приложению, таким образом, он останавливает выполнение, где бы он ни находился в данный момент, что может происходить практически везде. Однако ядро ​​должно быть в чистом состоянии. Это означает, что если вы только что сделали вызов в ядро ​​(многие функции libC делают), и этот вызов не находится в какой-то безопасной точке (например, в спящем режиме, в ожидании выполнения условия и т. Д.) Или возможно удерживает критические блокировки ядра (например, воронки), ядро ​​может приостановить спящий режим до тех пор, пока этот вызов не вернется обратно в пространство пользователя или выполнение не достигнет такой безопасной точки, прежде чем оно окончательно отменит ваше приложение из планировщика задач.

Вы можете открыть порт ядра и зарегистрироваться для событий сна / пробуждения. В этом случае ваше приложение получит событие, когда система захочет перейти в спящий режим. У вас есть несколько возможностей. Один - ответить на это, что система может прогрессировать. Еще один - приостановить сон; однако Apple заявляет, что некоторые события могут быть приостановлены не более чем на 30 секунд, после чего система просто продолжит работу, независимо от того, нравится ваше приложение или нет. И, наконец, вы можете отменить его; хотя не все события могут быть отменены. Если система уже решила, что перейдет в спящий режим, вы можете приостановить ее не более чем на 30 секунд или разрешить сразу, вы не можете отменить ее. Однако вы также можете прослушать событие, когда система запрашивает приложения, можно ли сейчас идти спать, и там вы можете ответить «нет», что приведет к отмене сна.

Разница между "Можно ли спать" и "Я собираюсь идти спать" заключается в следующем: первая отправляется, если применяются настройки энергосбережения, то есть если пользователь не двигал мышь или набрал что-нибудь за время, настроенное там. В этом случае система просто спросит, нормальный ли сон. Приложение, такое как Apple DVD Player, скажет «нет», потому что, скорее всего, пользователь смотрит DVD и, таким образом, не взаимодействует с компьютером, тем не менее, нет причин идти спать. OTOH, если пользователь закрывает свою Mac Book, приложения не запрашиваются, система обязательно перейдет в спящий режим и просто сообщит приложениям, у которых теперь есть до 30 секунд, чтобы среагировать на это.

События пробуждения также могут быть довольно интересными. Например. если ваша система активируется, открытые файлы могут быть недоступны (внешний диск отключен) или сетевые сокеты больше не будут работать (сеть изменилась). Таким образом, вы можете повторно инициировать определенные части приложения перед их использованием и столкнуться с ошибками, более или менее ожидаемыми.

Страница Apple, посвященная ловле этих событий.

3 голосов
/ 23 сентября 2008

Это зависит от вашего приложения.
Если вы взаимодействуете с внешними системами (например, работаете в сети или делаете что-то через USB / FireWire и т. Д.), Это может быть затронуто. Приложение, работающее в OSX, запускается в течение ограниченного времени (не более 10 мс), после чего оно прерывается ядром, которое планирует запуск нового процесса из очереди процессов на ЦП. Это прозрачно для приложения, которое «думает», что оно все время работает на процессоре. Таким образом, переход ко сну ничем не отличается - если не считать забегания вперед.
Если вам необходимо знать, что произошел переход в спящий режим, обратитесь к этой технической заметке, в которой подробно описано, как получать уведомления об изменении состояния: Регистрация и отмена регистрации для уведомлений о сне и пробуждении

1 голос
/ 22 сентября 2008

Я верю, что это просто приостановит все приложения, где бы они ни находились.

Помните, это все равно происходит постоянно. Приложения постоянно приостанавливаются и возобновляются из-за переключения контекста. Так что на самом деле часы могут переключаться между любыми двумя инструкциями в вашем приложении, хотя обычно это не заметно / заметно.

Если ОС ждала, пока приложение вернется в какой-либо основной цикл, вы можете столкнуться с ситуациями, когда приложения вызывают зависание спящего режима. Если они выполняют большую работу и не возвращаются к диспетчеру цикла выполнения, они не позволят машине перейти в спящий режим. Это было бы не очень хорошо. :)

0 голосов
/ 23 сентября 2008

Ознакомьтесь с этой Википедией Статья . Cavver правильно утверждает, что такие вещи, как сетевые подключения, могут истечь, и, таким образом, эти службы могут быть прерваны.

0 голосов
/ 22 сентября 2008

И если вы установите время, оно, похоже, снова перейдет к работающим программам. Ничего особенного тоже нет.

...