klink0v (klink0v) wrote,
klink0v
klink0v

Летит Push-а, нельзя скушать, часть 1

После комментария тов. yalexey к предыдущему псто я чота полез разбираться как реализована технология "Push" в Android-е и какие грабли там закопаны.

Для тех, кто "не в теме". Изначально Push был придуман для того, чтобы экономить заряд аккумулятора телефона. Потому как вторым после экрана потребителем электроэнергии являются радиомодули. Вот, мол, и давайте их выключать на время, пока никакого обмена информацией нет. Только тут есть одна закавыка. Если телефон что-то хочет "сказать первым", то нет проблем: "просыпаемся", устанавливаем сеанс связи, обмениваемся данными, "засыпаем" обратно. А если наоборот, нужно сообщить что-то телефону извне, то тут уже всё сложнее.

Первая часть вопроса заключается в том, что обычно у устройства есть как минимум два линка "в мир": Wi-Fi и GPRS. Причём первый демонстрирует бо́льшую энергоэффективность в случае непрерывной передачи значительных объёмов трафика: да, прожорливый, но зато, сцуко, быстрый. Второй же куда более экономен, если надо надо принимать-отдавать чего-нибудь изредка и по чуть-чуть: в отличие от Wi-Fi он умеет уходить в "дежурный режим" (Idle) и просыпаться по требованию сети сотовой связи, а точнее, так называемого Radio Resource Controller (RRC), размещённого на стороне оператора. В случае c Wi-Fi тоже имеют место быть всякие оккультные технологии типа DTIM и WMM, призванные в том числе и экономить батарейку. Но разброд и шатание среди производителей оборудования, а также тех, кто потом настраивает все эти железки, обычно не позволяют эффективно их применять.

Вторая часть вопроса упирается в некоторые особенности функционирования приложений на мобильных платформах. Так, на "взрослых" стационарных компьютерах оперативной памяти обычно столько, что хоть попой кушай, к ней "до кучи" прилагается "подкачка" (swap), код большинства приложений скомпилирован в не особо прожорливые бинарные файлы, а интерфейс пользователя позволяет эффективно взаимодействовать с человеком и в случае исчерпания системных ресурсов явно спросить у последнего что бы он хотел закрыть, а что оставить. В случае с телефонами и планшетами дела обстоят намного хуже. Оперативной памяти не так много, быдлокод на Java жрёт её как корова веники, пользователь бо́льшую часть времени может вообще не ведать что происходит внутри его устройства, так как включает его экран лишь изредка. Так что в документации для программистов явно указано: операционная система может в любой момент без спроса взять и "убить" ваше приложение, если только оно не находится на экране прямо здесь и сейчас. И любая программа всегда должна быть к этому готова. Некоторые послабления сделаны только для аудиоплееров, VoIP-клиентов и навигаторов, да и то не везде и не всегда.

Так что, допустим, написали вы собственный мессенджер а-ля WhatsApp, Telegram и иже с ними. Установили соединение с сервером и спокойно ждёте входящих сообщений. А Вася Пупкин взял и запустил на телефоне красивую разухабистую игрушку, ей стало не хватать оперативной памяти, так что операционная система, недолго думая, взяла и выгрузила ваш мессенджер. Так что сообщения от Вити Батарейкина ему больше не дойдут. Ни во время игры, ни после её завершения.

Третий аспект заключается в особенности работы GPRS-радиомодуля. Как бе всегда понятно, когда ему нужно "проснуться". Но когда ему следует "заснуть"? Как он может определить, что мы больше не собираемся ничего передавать и стоило бы уйти в дежурный режим, дабы не потреблять драгоценные милливатты? Ответ: никак. Поэтому тупо ввели ряд тайм-аутов. Если в течение какого-то интервала времени через сеть ни прошло ни одного пакета, то передатчик переходит сначала в "полусон" и ждёт ещё сколько-то (милли)секунд. Если в течение этого интервала снова ничего интересного не произошло, тогда уже он "засыпает" глубоко и крепко. И спит пока не разбудят с той (телефон) или другой (оператор связи) стороны.

Теперь представьте себе, что на телефоне одновременно запущено несколько приложений. И они никак не согласовывают друг с другом когда им хочется что-нибудь передать "в мир". Первое "будит" радиомодуль, "общается", "отпускает" его. Тот выполняет все инструкции, выжидает тайм-аут, засыпает. Но тут же что-нибудь захотело "сказать" другое приложение. Беднягу-передатчика снова будят, снова мучают, потом он снова засыпает. Но тут его дёргает третья программа. А затем снова первая. И так по кругу. Вот и выходит, что по результатам исследований AT&T Labs Research, у среднестатистического пользователя смартфона на приём-передачу примерно всего 0,2% трафика (в байтах) тратится порядка 46% заряда аккумулятора. Такие дела.

Чтобы хоть как-то скомпенсировать вышеизложенную несправедливость бытия, как раз и был придуман костыль в виде Push-а. Но и с ним, к сожалению, всё совсем не так хорошо, как хотелось бы. Но об этом я, пожалуй, напишу следующий псто.

Tags: android, ОПСОСы, сети, технологии
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 8 comments