«И вот я выбрал Installer.app, и начал грузить обновления сорцов, и тут мне каааак приспичит почитать башорг! А выйти-то никак система не реагирует сразу на нажатие кнопки Home. Прошлый век какой-то! Уж могли бы сделать систему многозадачной!» © Форум iPhones.ru
Я, конечно, не смог остаться равнодушным, и решил немножко рассказать, что и как на самом деле.
Для начала небольшая справка. Как известно, в телефоне ограниченный объём оперативной памяти, доступной приложениям. Несмотря на то, что система OS X, и имеет общие корни с Mac OS X, понятие виртуальной памяти (это когда при нехватке памяти выделяется часть диска под оперативную память) в ней отключено. Соответственно телефон имеет доступ только к реальной физической оперативке. А её чуть меньше 100 мегабайт на всё про всё.
Все программы с графическим интерфейсом в iPhone (ну и, конечно, в iPod touch) запускаются из SpringBoard. Это та самая программа, которая показывает иконки приложений и lock screen. Она же следит за объёмом свободной памяти и, при необходимости, принимает меры.
Что же происходит при нажатии на кнопку Home (круглая кнопка внизу, возвращающая в SpringBoard)? Текущему процессу предлагают уйти в «suspended mode» и, если оно хочет, оно может просто «уступить» место другому приложению, оставаясь загруженным в память только интерфейс его будет спрятан. В стандартной поставке таких приложений всего три Phone (MobilePhone), iPod (MobileMusicPlayer) и Safari (MobileSafari). Рассмотрим их поподробнее.
Phone всегда принудительно висит в памяти оно и понятно ведь, чтобы позвонить, вам не захочется каждый раз ждать загрузки приложения (а стартует оно довольно медленно, так как подгружает списки контактов, историю звонков и т.д.). Поэтому при старте SpringBoard она запускает в фоновом режиме и Phone.app это можно заметить, если сразу после перезагрузки или перезапуска SpringBoard попробовать войти в Телефон оно покажется не моментально, а через 1-2 секунды, когда программа догрузится.
iPod (внутреннее название MobileMusicPlayer) висит в памяти только во время воспроизведения музыки. Однажды запустившись, оно продолжает быть запущенным до тех пор, пока её по каким-то причинам не завершит SpringBoard (об этом ниже).
А вот с Safari ситуация интереснее. При выходе из него Safari смотрит, есть ли у вас открытые или загружающиеся страницы. Если их нет, то программа завершается полностью, и при следующем нажатии на иконку запустится «начисто» (это легко определить, если после старта программы вы видите окошко с Bookmarks). Если же открытые страницы есть, Safari переходит в suspended режим, где и ждёт дальнейшего развития событий.
Я уже упоминал о том, что SpringBoard следит за объёмом свободной памяти. Поскольку, например, Safari кушает последнюю большими ложками, может случится так, что оперативная память будет подходить к концу. В таких случаях SpringBoard поступает так, как и положено хорошему хозяину в доме смотрит, какие из приложений работают в suspended mode, и, буде таковые найдутся, посылает им команду на «самоубийство». Программа, получив такую инструкцию, должна сохранить своё состояние и освободить помещение. Если она не хочет или не может это сделать за определенное время (порядка 5 секунд), она убивается принудительно. Таким образом, в системе существует эффективный механизм контроля за распределением памяти.
Именно поэтому большинство программ выгружаются полностью при нажатии на кнопку Home во-первых, время запуска достаточно небольшое, а во-вторых, совершенно незачем занимать собой драгоценную память, если тобой в данный момент никто не пользуется. Есть исключения например, Apollo, которая висит в памяти постоянно, дабы оставаться онлайн. Но и к ней применяются те же меры, что и для всех остальных программ если системе покажется, что свободной памяти маловато, процесс Apollo, мирно сидящий на заднем плане, будет безжалостно убит.
Такая вот непростая жизнь у приложений внутри iPhone когда всё хорошо, они водят хороводы вокруг ёлки (SpringBoard), когда всё становится чуть напряжней, ёлка ненавязчиво падает на самого незаметного из них чтобы Дед Мороз, если ему вдруг захочется появиться на этом празднике жизни, не был удивлён тем, что хоровод бродит еле-еле, спотыкаясь и падая.
Не будем расстраивать дедушку, да?
Слава Карпенко (RiP Dev)

40 комментариев
Форум →