Многозадачность в iOS и мифы о ней

2 января (вот же людям не отдыхается) Фрейзер Спейрс (Fraser Speirs) опубликовал интересную заметку о том, как работает многозадачность в операционной системе iOS и разрушил один из популярных мифов среди пользователей iPhone и iPad об “ускорении” работы устройства. Заметка очень полезная, написана простым языком и должна быть понятна всем, поэтому я переведу ее у себя в блоге целиком.
—————–
Есть некий неправильный “совет” для iOS, на который я постоянно натыкаюсь. Что хуже, я слышу его даже от источников, которым можно было бы доверять. Я даже как-то слышал его из уст сотрудника “гений-бара” в Apple Store.
Вот этот совет — и помните, что он не соответствует действительности:

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

Нет. Нет. Нет. Нет. Нет. Нет. Нет. Нет. Определенные нюансы тут, конечно, есть, но любой, кто дает этот совет, определенно не в курсе ситуации и точно уж не знает об этих нюансах.

Постараюсь сказать максимально понятно: панель многозадачности в iOS не содержит “списка запущенных приложений”. Он содержит “список недавно использованных приложений”. Пользователю не надо управлять фоновыми процессами в iOS.
[ad#intext-inside]
За исключением некоторых случаев, которые я объясню ниже, приложения, которые показываются в панели многозадачности, не работают в данный момент. Когда вы нажимаете на кнопку Home, iOS командует приложению выйти. Практически во всех ситуациях, приложение выходит, оно прекращает использовать ресурсы процессора (а, значит, и батарею), а память, которую оно использовало, со временем освобождается, если надо.
Теперь чуть более технически: у iOS приложений есть пять состояний исполнения. Вот они:

  • Нерабочее — работа приложения была прекращена или оно не было запущено
  • Неактивное — приложение в активном режиме, но не получает событий (например, пользователь заблокировал экран с приложением в рабочем состоянии)
  • Активное — нормальное состояние приложения в режиме использования
  • Фоновое — приложение больше не находится на экране, но по-прежнему исполняет код
  • Приостановленное — приложение по-прежнему находится в памяти, но не исполняет код
  • Активное и неактивное для данной темы неинтересны. Большинство путается в ситуациях, когда приложение переходит из активного в Фоновое, потом в Приостановленное, а потом в Нерабочее.
  • Когда вы нажимаете кнопку Home, приложение переходит из Активного в Фоновое. Большинство приложений затем переходят из Фонового в Приостановленное в течение пары секунд.
    Первый технический нюанс заключается в том, что Приостановленное приложение остается в памяти устройства. Это сделано для того, чтобы оно могло продолжить работу быстрее, если вы к нему вернетесь Оно не использует процессор и батарею.
    Вы можете предположить, что если приложение находится в памяти, вам нужно его как-то удалить оттуда для освобождения памяти. Вам не нужно этого делать, потому что iOS делает это за вас. Если у вас есть Приостановленное приложение и вы запускаете приложение, требовательное к количеству памяти, например, большую игру, iOS начнет удалять Приостановленные приложения и перемещать их в Нерабочее состояние. То есть они полностью будут выгружены из памяти и будут запущены с нуля, когда вы в следующий раз нажмете на их иконку.
    Что путает некоторых людей: все вышеперечисленное никак не влияет на то, что вы видите в панели многозадачности. Панель многозадачности всегда показывает список недавно использованных приложений, невзирая на то, в каком состоянии они находятся. Вы можете также заметить, что приложение, которое Активно в данный момент, не показывается в панели многозадачности.
    Фоновые задачи
    Когда приложение отправляется в Фоновое состояние, оно обычно переходит в Приостановленное состояние через несколько секунд. Приложение может запросить расширение этого периода, заявив, что оно запускает “фоновую задачу”.
    Хороший пример — это приложение, которое загружает большой файл из интернета, например Instacast, моя любимая программа для подкастов. Когда Instacast активна, она может начать загружать новые подкасты. Если я затем нажму на кнопку Home на iPhone, Instacast получит 5 секунд на работу в Фоновом состоянии и затем перейдет в Приостановленное состояние. В этом случае прервется загрузка моих подкастов, которая занимает 5 минут и больше.
    iOS позволяет Instacast заявить, что загрузка — это “фоновая задача”. Это позволяет Instacast получить дополнительный период фоновой работы после нажатия кнопки Home, чтозы завершить загрузку подкастов. Приложение может запросить дополнительное фоновое время, но это время не бесконечно. Приложение получает около 10 минут работы в Фоновом режиме и затем насильно приостанавливается системой. Опять же, по этому поводу вам не стоит беспокоиться.
    Бесконечные Фоновые Процессы
    Все приложения получают 5 секунд работы в фоновом режиме. Некоторые приложения могут запросить расширение этого времени до 10 минут. Есть небольшой набор приложений, которым нужно работать в фоновом режиме постоянно, и iOS разрешает это.
    Есть 5 типов приложений, которым разрешено работать без ограничений в Фоновом состоянии в iOS 5:

  • Приложения, которые проигрывают аудио, находясь в Фоновом состоянии. Хороший пример — тот же Instacast, который воспроизводит подкаст.
  • Приложения, которые отмечают ваше местоположение в Фоновом состоянии. Например, вам нужны голосовые напоминания от навигации TomTom, даже если другое приложение Активно.
  • Приложения, которые “слушают” входящие звонки через VoIP. Если вы используете Skype на iOS, вы можете получить входящий звонок Skype, когда приложение находится в Фоновом состоянии.
  • Приложения Nesstand, которые загружают новый контент.
  • Приложения, которые получают постоянные обновления от внешних аксессуаров, находясь в Фоновом состоянии.
  • Все хорошо написанные приложения в вышеупомянутых категориях должны переходить в Приостановленное состояние, когда они прекращают выполнять свою текущую задачу. Когда Instacast заканчивает проигрывать подкаст, она должна перейти в Приостановленное состояние. Есть некоторые встроенные приложения, которые также постоянно работают в фоновом режиме в iOS — наиболее часто используемым, наверно, является Mail.
    До тех пор, пока эти приложения работают в Фоновом состоянии, они будут потреблять память, ресурсы процессора и батареи. В целом, однако, вы должны знать, что вы используете такие приложения. Разработчик должен уведомить вас, какой вид Фоновой задачи будет исполняться и часть проверки в App Store заключается в том, чтобы проверить, чтобы эти технологии использовались разумно.
    Я говорил раньше, что “пользователю не надо вручную управлять Фоновыми задачами в iOS”. Единственное исключение — это ситуация, когда подобное приложение с работой в фоне начинает безумствовать и не выключается соответствующим образом. Это, однако, является исключительной ситуацией и не относится к нормальной задаче пользователя iOS.
    [ad#intext-inside]
    Резюме
    Давайте я закончу, резюмировав тут все вышесказанное:
    1. Если кто-то говорит вам, что все приложения в панели многозадачности работают, используя память или потребляя энергию батарейки, они неправы.
    2. Когда вы нажимаете кнопку Home, приложение переходит из Активного в Фоновое, а затем быстро — в Приостановленное состояние, когда оно не использует процессор и не потребляет энергию.
    3. Приложение может запросить дополнительные 10 минут работы в фоне, чтобы закончить большую задачу до перехода в Приостановленное состояние.
    4. Если памяти становится мало, iOS автоматически переместит Приостановленные приложения в Нерабочее состояние, и освободит занимаемую ими память.
    5. Пять видов приложений — аудио, GPS, VoIP, Newsstand и приложения для работы аксессуаров — и некоторые встроенные приложения вроде Mail могут работать бесконечно в фоновом режиме, пока не закончат свои задачи.
    Проще говоря: вам не нужно управлять фоновыми задачами в iOS. Система сама управляет практически всеми ситуациями за вас и хорошо написанные аудио, GPS, VoIP, Nesstand и аксессуарные приложения тоже разберутся сами.
    Оригинал

    44 thoughts on “Многозадачность в iOS и мифы о ней

    1. Очень полезно знать, мучить шизофрения перестала) и приятно что сделано разумно.

    2. Аха, щаз… Именно поэтому, если я не выгружаю Need for speed – Hot Pursuit, батарейки не хватает даже на день.
      И хотя автор в общемто прав, всегда есть человеческий фактор в лице безалаберного девелопера и недосмотревшего инспектора пропустившего в стор продукт жизнедеятельности безалаберного девелопера.

      • программы работающие с аксессуарами это типа Nike+, обычная блутух сеть к этому не относится

      • Если заблокировался экран при работающем приложении – оно остается работать.
        Кроме того, посмотрите а не юзает ли оно геолокацию? 

    3. Как по мне, так чем меньше пользователь знает, тем лучше. Я бы вообще голову не забивал этими проблемами. Тем кто не знает про это ничего – все равно. А тем кто парится по этой проблеме, тому и это объяснение будет недостаточным и неубедительным. Первый коммент от Maxim Pushkarev тому доказательство.

      • Доказательство тут не причем. Не надо считать меня параноиком который чистит, чистит, чистит задачи на своем телефоне. Но при этом так сложилось, что некоторые таки приходится убивать иначе батарейка не доживет до вечера. И это просто результат практических наблюдений.

    4. реальность отоичается от теории. если к примеру запустить скайп, а потом поиграть в пару-тройку игрушек, тотвернувшись вы обнаружите, что скайп разлогинился и вы уже какое-то время не в сети. Если же закрывать каждую игру перед запуском следующей, то этого не произойдет. Я понимаю, что тут вина криворуких программеров из скайпа, но “других писателей у меня для вас нет”.

      • читаю книгу вижу фигу, без обид
        “4. Если памяти становится мало, iOS автоматически переместит Приостановленные приложения в Нерабочее состояние, и освободит занимаемую ими память.”
        описываемый в статье механизм не теории а суровая практика, и разработчику при всем желании обойти это трудно

        • Угу. Толька фига немногов другую сторону: voip приложение, которое должно жить вечно, падает при нехватке памяти и разлогинивается. Стон на эту тему на эпловых и скайповых форумах идет со времен выхоа пятой версии, апдейтов море результата ноль.

          • С выходом 5-го скайпа было гораздо громче стона, а уж после покупки Майкрософтом (не сам факт покупки, а два падения) вызвали нечто большее чем стон 🙂 Зато сейчас на Windows Skype самый кошерный получается, даже рекламу показывает и даже сообщает, что на счету еще есть деньги, но если не позвоните до такого-то, то мы их анулируем 🙂

    5. Один мой знакомый, после перехода на 4 версию, недели три ходил и не мог понять, почему так тормозит его телефон. Когда я открыл ему глаза :), у него в фоне было более 30 приложений и 3GS тормозил просто ужас как. Это я все к тому, что не так уже и хорошо iOS вырубает приложения.
      На 4S такого беспорядка я не допускаю и раз в 2 дня выключаю все приложения в фоне и раз в неделю перегружаюсь.

      • Посоветуйте ему войти в меню “диагностика и использование” и посмотреть сколько раз в день у него появляется запись типа LowMemory или Crash. У меня после выхда 5-ки на iPad2 приложения стали вылетать пачками именно по low memory. В некоторых случаях они вообще переставали запускаться до перезагрузки. Решение с форумов эппл: выключить по максимуму icloud. Я оставил почту/календари/закладки/findmyiphone, отключил копирование в облако и вылеты прекратились.

    6. скайп – ужасное приложение на iOS. Он в фоновом состоянии безумно “выжирает” батарейку, при этом постоянно теряя соединение в фоне при подключении через сотовую сеть. Кроме того ещё и может показывать, что ты залогинен, но твои контакты в сети тебя не видят.

    7. Ребят, появилась идея проверить статейку на себе. Как раз щас бата жрется за ночь (7 часов) на 10%. Грешу на твики сидии (проша 5.0.1, i4), понаставил их кучу . Хочу проверить уровень разряда баты отдельно при установке каждого твика. Для чистоты эксперимента можно уйти в авиарежим (у меня ифон – не основной тел, мне это будет очень легко сделать). Засекать период – ночь (7-8 часов).
      Ну и по сабжу статьи – проверить на “криворукость” разрабов установленных у меня приложений.
      Если интересно – присоединяйтесь. Можно потом будет даж на этом сайте попросить сделать темку про это с нашими результатами.

      • Ни слова о Safari, убийство которого всегда освобождается освобождением 20-100 Мб оперативки

      • мне кажется, в ситуации с джейлом это может оказаться неприменимо — мало ли какой там у вас твик стоит с джейлом

        • все верно. про джейл – я лишь сказал задумку, которая появилась у меня пару дней назад. Теститься проги должны на чистом теле, без джейла. Я вообще сделаю рестор, настрою как новое тело и буду тестить работу прог (т.к. у меня тело – неосновной тел, мне это сделать легче, без потери мобильности)

    8. Автор статьи конечно же прав, однако практика отличается от теории, особенно это хорошо чувствуется на первом iPad у которого крайне мало оперативки, с установленной iOS 5.

    9. =====================
      Постараюсь сказать максимально понятно: панель многозадачности в iOS не содержит “списка запущенных приложений”. Он содержит “список недавно использованных приложений”. Пользователю не надо управлять фоновыми процессами в iOS.
      =====================
      Это полная фигня.  Для простого пользователя: панель многозадачности в iOS как раз содержит список именно “запущенных” приложений. А в каком там они состоянии: “еще чуток пожру память” или “почти ничего не жру” или “жру, но если чо – отдам” – пользователею фиолетово. Если программы нет в списке – то очевидно, что она не запущена.
      Не хотите проблем – выгружайте программы из списка.

      • Нет. в этом списке будет даже ТОЛЬКО ЧТО упавшее приложение. которое никак не может быть запущено

        • Ни нет, а да. Менеджер “запущенных” приложений надо думать бесплатно работает? 🙂
          С точки зрения разработчика я щаз могу в такие дебри вдариться, но с точки зрения потребителя – только один вариант: если программы нет в списке – то очевидно, что она не запущена.  Все.

          • с технической точки зрения статья написана корректно, насколько я понимаю устройство iOS. к юзабилити “переключателя” есть вопросы, конечно, но технически все верно

            • Технически – все верно, ну да тем кому надо – это все давно известно (api изучить не долго). Но статья вредная во всех смыслах – слишком много исключений, состояний – это все запутывает еще больше. Про это вообще не надо писать, пользователи ничего не поймут из такой статьи.
              А вот кнопка – “убить все” нужна (без джейлбрейка) ибо, что iOS, что Android не в состоянии  интеллектуально разрулить процессы. Открывая новую вкладку в iCab’е после запущенного Navigon/Navitel  мне нужно точно значть, что он не вывлится с low memory. И таких “рабочих” ситуаций полно, мне не надо ждать пока система все очистит, мне нужна вся память здесь и сейчас.

            • Пользователи обычно гораздо умнее чем о них думают девелоперы 🙂
              Интересно, есть ли какой-нибудь аналог purge чтобы inactive memory сразу высвобождало? 

            • Да брось. Пользователи тупые, как пробки. Им эту статью вообще нельзя показывать 🙂 Пользователей, способных понять разницу между “Фоновое” и “Приостановленное” вообще единицы.

            • Тупым пользователям не нужен функционал смартфона.

            • В приложении SYS activity Manager http://itunes.apple.com/ru/app/sys-activity-manager-for-memory/id440654325?mt=8 есть кнопка “очистка памяти”. Думаю, она просто зажирает кучу памяти ненадолго, заставляя систему всё выгрузить. Пару раз попробовал, больше не пользовался.
              Полезнее в нём список процессов и активных приложений. Глядя на него можно понять, что надо выгружать. Еще я иногда использую звуковое оповещение о  завершении зарядки батареи.

      • Если вы перезагрузите телефон, все приложения у вас будут также показываться. 
        Они будут запущены? НЕТ. Они просто будут ПОКАЗЫВАТЬСЯ. Это видно при запуске даже первой программы в списке. Она именно запускается. 
        И это очень удобно, что их видно, потому что иногда сложно вспомнить чем занимался.
        Однако не оставляйте программы включенными под экраном блокировки. Вот это точно будет кушать батарею.

    10. >Есть 5 типов приложений, которым разрешено работать 
      >без ограничений в Фоновом состоянии в iOS 5.
      >До тех пор, пока эти приложения работают в Фоновом состоянии, 
      >они будут потреблять память, ресурсы процессора и батареи.
      Ну зачем же так пугать пользователей? Это не так. VoIP приложения как все уходят в suspend, а вовсе не жрут ресурсы бесконечно. Проверено на практике. Просто система перехватывает управление сокетом помеченным для уведомления о входящем соединении. И разбудит приложение при наличии в этом сокете активности.
      Newsstand приложения судя по документации работают по тому же принципу:
      When you use the Newsstand Kit framework to initiate a download, the system handles the download process for your app. The system continues to download the file even if your app is suspended or terminated. When the download operation is complete, the system transfers the file to your app sandbox and notifies your app. If the app is not running, this notification wakes it up and gives it a chance to process the newly downloaded file. If there are errors during the download process, your app is similarly woken up to handle them.

    11. В дополнении к заметке, Фрейзер Спейрс выложил видео демонстрацию работы iOS с мульти задачностью в деталях — http://speirs.org/blog/2012/1/6/ios-multitasking-in-detail.html

    12. Хм. Вот у меня есть приложение, XDjvu Lite. Оно требует при работе много свободной памяти, а ежели ее недостатоно, то оно предупреждает об этом, и у него есть индикатор – сколько используется этой самой памяти и сколько свободно. Так вот, если у меня куча приложений в фоне – то ему этого недостаточно, и iOS ничего не отрубает, перезапуск приложения не помогает. Однако если закрыть все фоновые приложения, индикатор показывает гораздо больше свободной памяти, никаких предупреждений и читалка не тормозит.

      • Есть много приложений гораздо более требовательных к памяти, чем читалка DjVu, но у них такой проблемы не возникает. Это даёт основание предположить, что в данном случае именно так приложение написано, разработчик доверяет проверять наличие памяти программе, а не операционке.

      • В статье идет речь про использование CPU, а не оперативной памяти. Запущенные приложения, переведенные в suspended в лучшем случае (если позаботился разработчик) будут потреблять меньше памяти, но всю используемую в состоянии active, безусловно, не освободят.

    13. Иными словами сделано через дупу, что закономерно, если вспомнить что делалось в спешке, когда настольную ОС натягивали на телефон.

    14. Алекс, у меня на jb-телефоне есть функция показа свободной памяти в строке состояния. Так вот, если все апликации выгрузить, размер свободной памяти увеличивается. Если написанное вами правда, что же показывает данная функция? Я понимаю, что про jb-телефон точно ничего сказать невозможно, но все же — хоть догадки какие.

    15. Здравствуйте .А у меня на iphone 3gs такая проблема возникает порой.Вот работает у меня плеер,когда он работает я включаю камеру на запись,плеер приостанавливает работу свою и через пару секунд телефон выключается .Это так должно быть или с телефоном проблема???

    Leave a Reply