Что происходит с моим приложением, когда мой Mac переходит в спящий режим?

StackOverflow https://stackoverflow.com/questions/116945

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

А если вы установите время, оно также перейдет к запущенным программам.Тоже ничего особенного.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top