Для начала немного теории. Что такое оперативная память и для чего она нужна в смартфоне? Если говорить простым языком, то это память, в которой хранятся все запущенные приложения, их данные, и сама операционная система!
Естественно, чем больше у вашего девайса оперативной памяти, тем комфортнее и приятнее с ним взаимодействовать.
Большинство пользователей iPhone даже не знают сколько оперативной памяти у них в смартфоне. Это обусловлено тем, что пользователей устраивает работа многозадачности в их смартфонах, они просто пользуются и получают удовольствие от плавности и скорости работы. Так как же Apple все же удается хорошо работать с 4 ГБ оперативной памяти?
Может быть дело в системе? На самом деле чудес не бывает, Android и iOS требуется примерно одинаково-большое количество ОЗУ. К примеру, пару лет назад, один зарубежный канал Android Authority провёл детальное сравнение. Автор взял два смартфона на iOS — это iPhone 7 и на Android — Nexus 5х, с одинаковым количеством оперативки – 2 ГБ. iPhone 7 c момента запуска имеет МЕНЬШЕ свободной оперативной памяти чем смартфон на Android: около 750 МБ против 1,2 ГБ у Nexus. Но это до того момента пока вы не запустите какое-либо из ваших приложений.
Мы повторили тест на iPhone 11 и Pixel 3 с Pixel 4. Теперь получается, что цифры сопоставимы: в iPhone задействовано около 2 ГБ оперативки, а Pixel использует около 2,4 ГБ.
Окей, может быть дело в том, что приложения на Android занимают больше места в оперативке? Ведь Apple любит разработчиков, а они отвечают им взаимностью. Но тоже нет: во многих случаях размер занимаемого места в оперативной памяти на iOS и Android примерно равны, но в некоторых случаях приложения на iOS занимают почти в 1.5-2 раза меньше оперативной памяти! Скорее всего это связано с более оптимизированным исполняемым кодом приложения, ведь языки написания приложений очень разные
При подсчетах, Android-приложения в совокупности занимают всего на 6% больше места в оперативной памяти.
Но это только начало, как говорят многие пользователи яблочной продукции «Оптимизация Решает!», как оказалось, в этом есть доля правды!
Оба аппарата работают с приложениями молниеносно, с андроидом все понятно, у него все хранится в ОЗУ, но как справляется iPhone с его жалкими 4 гигабайтами? Вся магия кроется как раз в работе iOS с оперативной памятью. Базово и iPhone, и Android имеют примерно одинаковый планировщик работы с памятью. Если в момент запуска нового приложения, у смартфона попросту нет свободной оперативной памяти, он выкинет одно из ранее запущенных и откроет то, которое тебе нужно в данный момент!
В мире компьютеров операционная система Windows имеет файл подкачки (pagefile.sys), еще его называют СВАП. Это такое пространство на вашем жестком диске, куда система переносит неиспользуемые данные из оперативной памяти. Чтобы не хранить их в ОЗУ, давно запущенные приложения попросту переносятся на жесткий диск, тем самым освобождая место для еще одной вкладки Chrome. ПК-бояре понимают о чем я.
На смартфонах все немного сложнее, многие смартфоны до сих пор имеют не самые быстрые флеш-накопители в постоянной памяти. К этому прибавляем то, что флеш-память имеет сравнительно небольшой ресурс чтения и записи, поэтому производители смартфонов прибегли к иной реализации!
Представим такую ситуацию, у нас 4Гб оперативной памяти, открыто 5 приложений, память вся уже заполнена, как же запустить еще одно приложение и при этом не закрывать одно из пяти, то есть которые уже открыты. Всё дело в том что и у iOS, и у Android тоже есть так называемый Сжатый СВАП – с помощью сжатия, которое похоже на то, что делает архиватор. Приложение сжимается внутри оперативной памяти, система выбирает самые массивные приложения, будь то одна большая или две мелких игры, происходит сжатие, тем самым освобождается до 50% больше места, и теперь можно запустить еще одно приложение.
Такая схема работает и на iPhone, и на Android, но Apple пошли куда дальше. Они придумали как делить пространство на отдельные страницы — блоки размером 16 КБ, которые вмещают в себя любую информацию. Такую страницу можно пометить как грязную (dirty) или чистую (clean). Чистая — память, которая больше не используется (то есть никакие объекты больше не ссылаются на неё и её можно спокойно выгрузить). В дальнейшем она может быть загружена с диска («page out»), такая память содержит фреймворки, исполняемый код и файлы только для чтения.
К примеру, в таких страницах могут быть данные текстур игры, которые не используются приложением даже после повторного запуска из фонового режима, также в иных приложениях это могут быть разные AR-тикеры, маски и прочие блоки кода, которые не использует приложение пока пользователь повторно не запустит программу из фона.
Грязная — память, которая ещё используется в приложении, выгрузить её невозможно поэтому при переходе приложения в фон, чистая просто выгружается, а грязная сжимается по двум методам сжатия:
- Сжатие буфера — использует одношаговый метод сжатия файлов, этот метод используется для сжатия мелких файлов до 8 МБ.
- Сжатие потока — использует несколько шагов для сжатия файлов, в том числе и повторное сжатие ранее сжатых файлов, что делает его идеальным для сжатия больших файлов.
Допустим у нас есть приложение Instagram, оно занимает 300 МБ в оперативной памяти, первым этапом будет очистка чистой памяти, которая была в запасе у приложения и больше не понадобится. Размер в ОЗУ уменьшается примерно до 170 МБ. Далее операционная система прибегнет к одному из двух методов сжатия грязной памяти. Благодаря продуманному алгоритму сжатия, грязная память из 170 мегабайт сжимается до внушительно маленького размера — менее 10 МБ!
В свою очередь, производители смартфонов на базе Android вышли из ситуации более простым решением, увеличить размер оперативной памяти чтобы меньше использовать сжатый свап.
Итак, время теста. Мы взяли устройства разных поколений — iPhone 11 и Pixel 3 — зато оба с 4 Гб. Посмотрим, что произойдет.
Pixel держит в памяти три игры. Начал выгружать их из памяти при запуске четвёртой.
iPhone полноценно держит шесть игр. Начал потихоньку выгружать на седьмой, но не все. Все начали вылетать только на восьмой игре.
И здесь мы подходим к кульминации вопроса, нужно понять за счет чего iPhone так быстро производит сжатие данных в оперативной памяти? А дело все вот в чем. Чтобы быстро провернуть данную операцию потребуется мощный процессор с высокой производительностью Больших Ядер!
Если мы посмотрим на скриншоты из бенчмарка GeekBench 5, то увидим превосходство А13 Bionic перед Snapdragon 865 в 1.5 раза, а ведь А14 Bionic еще даже не вышел! Именно производительность на один поток данных всегда было главным козырем процессоров от компании Apple! Большой проблемой Android-смартфонов является то, что они все построены на очень разном железе, производители вынуждены оптимизировать систему для более слабых девайсов, у которых попросту нету столь внушительной мощности процессора или быстрой памяти. Хотя подвижки со стороны компании Qualcomm уже есть.
Так еще с презентации Snapdragon 855 было замечено, что компания сделала упор на одно высокопроизводительное ядро (prime core), которое имеет повышенную частоту и размер кэш-памяти, но этого все равно пока мало чтобы догнать чипы Apple.
Думаю теперь многим стало понятно, почему iPhone не нужно столь большое количество оперативной памяти. Размер — не главное, лучше вложить больше денег в софтверную часть, и правильно распределять ресурсы своего железа за счет умных алгоритмов сжатия файлов в оперативке.
wolfparanoya
Как на пользователя влияет то, что на Андроиде 4 игры загружены, а на Айфоне 8?
mrguardian
Как на пользователя влияет многозадачность ОС? Кажется на этот вопрос ответили с тех пор как умерла ДОС?
wolfparanoya
И как она влияет на пользователя смартфона? В андроиде даже режим разделения экрана есть. Юзеркейсов с ним мало.
mrguardian
Вы сейчас серьезно? Переключиться между браузером, гугл доками и приложением звонка, чтобы скопировать данные и позвонить, а потом вернуться к работе с того места, где закончил это разве не очевидные юзкейсы? Да, в примере указаны как пример игры — но это просто для бенчей. Хотя в открытых паре игр тоже ничего плохого не вижу.
wolfparanoya
Только для этого не нужна многозадачность.
Mishootk
6...
wolfparanoya
И все пять пунктов одновременно не забьют 4Гб памяти на андроиде, не говоря о 8Гб.
Может вы тогда ответите как на пользователя повлияет, что он может 4 играми или 8 забить всю память?
Там внизу про браузер пишут. Про браузер верю, но у меня не получилось воспроизвести описанное, чтобы браузер перезагружать страницы начал из-за памяти 4Гб, 7ой андроид.
VolCh
Хабр пва, гугл-карты и скайп у меня в 4 Гб не влазят — выгружаются
vlad_egrv
еще как забьют, почитайте как гугловский LMK работает, я на старых андроидах с 4 гб озу постоянно черный домашний экран ловил, это оно и есть если что
kalininmr
ДОС, грубо говоря, тоже многозадачная.
просто без планировщика
maxzhurkin
ВАЗ-2101, грубо говоря, тоже Tesla, просто без автопилота и с классическим ДВС
zetroot
Технически — так и есть. Обе решают задачу перевозки водителя и 3-4 пассажиров по дорогам общего пользования. Остальное — нюансы.
maxzhurkin
Тот комментарий, на который я ответил, является оффтопиком в меньшей степени, но вы по какой-то причине ответили именно на мой
fedorro
Вместо игр можно взять любые приложения. Гораздо приятнее просто переключаться между ними чем каждый раз ждать пока они прогрузятся. К тому же во многих приложениях после повторной загрузки не всё остается в том же виде как было: страницы смещаются, веб-контент перезагружается, и.т.д. Кроме того это становится ещё более заметно с течением времени когда на на айфоне загружены всего 2 игры, а андроид каждый раз выгружает приложения чтобы новое загрузить.
Но Андроидофон хоть с 8Гб памяти выходит дешевле Айфонов =)
0xd34df00d
Фиг знает, на практике мой андроидопланшет с 4 гигами спокойно держит в памяти с десяток вкладок хабра, а айпад начинает грустить и выгружать их уже на четвертой-пятой.
iproger
Какой у вас айпад?
У меня что прошлый pro 2018, что теперешний pro 2020 держат десятки вкладок и приложений. У первого 4гб, у второго 6гб.
0xd34df00d
Купленная в 2018-м году 10-дюймовая модель, вроде как не про. Андроидопланшет куплен на год раньше.
iproger
Давно пользовался, насколько помню, там 3гб. Между 3 и 4 разница гораздо больше чем 1гб, как ни странно.
0xd34df00d
Ну, да. А хвалебная статья, которую мы обсуждаем, пытается доказать, что это всё неважно, и Apple хитрыми решениями позволяет меньшим достичь большего.
iproger
Так и есть, были же сравнения на утубе. Получается эффективнее чем на Андроиде, но ценой не только оптимизаций, а и более мощного железа.
0xd34df00d
Я не знаю, чего там эффективнее, но только вот знаю, что устройства сходного ценового диапазона и позиционирования ведут себя совсем не похоже.
MrRitm
Вот кстати для меня загадка десятилетия!
Все время пользовался смартами на андройде (huawei, htc, gigabyte, motorolla) и сейчас honor — все всегда было и есть отлично. Был очень короткий промежуток времени с iphone 5s, но не могу сказать, чтобы вот прям на столько большая разница, чтобы за нее переплачивать в разы. Т.е. поймите правильно, если у тебя собралась вся экосистема от Apple, то да, преимущества неоспоримы. Не надо танцевать с бубном вокруг каждого устройства. Но просто телефон без всего остального (по моему личному ощущению) не стоит того.
Покупали планшеты маме (стандартные задачи пенсионера: скайп с внуками, ОК, ВК, FB, погода, минимум серфига по заинтересовавшей теме). Были планшеты с 2, 3, 4 гигами памяти (texet, lenovo, еще какой-то...). Неделя максимум и новый планшет начинает тупить вне зависимости от количества оперативки. Переключение между приложениями может затянуться на несколько минут (!). У папы ipad 2 уже который год — без нареканий. Купили маме ipad — проблемы решились. КАК?!
Т.е. почему на телефонах все работает быстро и плавно (я то явно активнее устройство использую), а на планшетах — нет?
youROCK
Насколько я понимаю, на айфоне и на айпаде мало оперативной памяти не потому, что Apple жалко, а потому что оперативная память, в отличие от остальных компонентов системы, потребляет постоянное количество энергии, вне зависимости от того, используется она сейчас или нет (в моём понимании, это происходит, поскольку ей нужно держать все ячейки под напряжением, чтобы данные не сбрасывались). Соответственно, меньший объем ОЗУ позволяет либо иметь больший срок службы от батареи, либо делать батарею меньше :).
Сейчас вроде андроиды и айфоны в среднем живут плюс-минус одинаково, но долгое время это было не так, и я подозреваю, что сравнительно небольшой объем ОЗУ был одной из причин.
fedorro
На самом деле все компоненты потребляют энергию вне зависимости от того используются или нет. Но даже если так — думаю что на сжатие\распаковку памяти требуется не меньше энергии, которую съест при этом ЦП.
Sap_ru
Совершенно нет. Потребление может отличаться на порядки. Собственно, современные микросхемы если ничего не делают, то ничего и не потребляют.
Alexeyslav
На миллиардах транзисторов «ничего не потребляют» выливается во внушительные цифры. И чем тоньше техпроцесс тем выше это фоновое потребление т.к. транзисторы становятся тоньше утечки растут. Но RAM это вопрос немного другой — основа ячеек это конденсаторы которые держат заряд 5-30 сек. И чем тоньше техпроцесс, тем меньше ячейки и меньше держат. Следовательно и надо чаще обновлять, но к счастью этот процесс автоматизирован и потребляет не так много энергии, а вот активная работа с памятью — потребляет и память даже греется.
netch80
> это конденсаторы которые держат заряд 5-30 сек
Вы не ошиблись порядком? Обычно приводят цифры в десятки миллисекунд.
> но к счастью этот процесс автоматизирован и потребляет не так много энергии
Механика освежения строки без доступа к ней и доступа на чтение-запись совпадает: строка полностью вычитывается в обычные SRAM триггеры и потом записывается из них обратно. И память греется даже без обращений к ней.
Больший нагрев при доступе это уже результат в основном усиления сигналов для передачи по шинам — да, существенно, но не 100% нагрева и даже не 90.
Alexeyslav
эти тайминги для старых технологий, на новых возможно меньше. с триггерами не согласен — процессы считывания/перезаписи сильно снизили бы пропускную способность памяти, обновление происходит отдельной линией. и правда потребляет немного. Просто память в реальной системе никогда не простаивает, потому и греется.
VerdOrr
Но, используемая в качестве ОЗУ, динамическая память требует регулярной регенерации и для нее утверждение «потребляет постоянное количество энергии, вне зависимости от того, используется она сейчас или нет» почти верно.
asmolenskiy
Это зависит от контроллера.
Если рефрешить не всю память — будь то Auto-Refresh или Burst-Refresh, а только те страницы, которые давно не записывались, можно очень хорошо оптимизировать энергопотребление.
Но я ни разу не встречал таких замороченных реализаций контроллеров памяти.
qw1
Это какая-то очень замороченная микро-оптимизация.
Согласно википедии, ячейки надо перезаписывать каждые 8-64 мс.
Сколько мегабайт процессор сам перезапишет на 64 мс? Особенно, если устройство ничего не делает, а лежит в кармане и все программы крутятся в каких-то коротких внутренних циклах. Мегабайт 16 (от всего объёма 4-8GB)? Экономия на рефреше менее 1%, а логика отслеживания куда когда была последняя запись, скушает больше энергии, т.к. её надо приставить к каждой строке памяти.
asmolenskiy
Это делается не программно.
У DDR есть команда — Refresh. Контроллер памяти выставляет ее на чип памяти, и он обновляет содержимое. Я давно не работал прям с интерфейсом DDR, но ЕМНИП — там базово два режима — короткий Auto Refresh — который надо просто давать с определенными интервалами таким образом чтобы обновился весь чип за требуемое время (тут используется внутренний счетчик чипа DDR). И длинный Burst Refresh — это когда чип уходит в полное обновление надолго. У современных DDR появились режими RAS only Refresh — это когда можно задавать Row для обновления (видимо как раз c целью делать то, о чем я выше написал). И еще какие-то — не помню, забыл.
Если интересно — можете скачать даташит на либой DDR чип того же Micron. Там все это описано.
В общем — это не задача процессора, это вопрос имплементация контроллера памяти в SOC процессора. Процессор никаких данных при этом никуда не переписывает. Все контроллеры, что я до сих видел — просто использовали Auto Refresh. Но в принципе не так уж сложно накодить на HDL логику которая будет запоминать в какие страницы записаны данные и рефрешить только их.
qw1
asmolenskiy
Нельзя рефрешить отдельно взятый адрес. Рефреш осуществляется страницами. То есть независимо от того — были ли обращения по записи (за исключением случая полной записи страницы) в конкретную страницу или нет — ее надо рефрешить с определенными интервалами. То есть контроллер может отслеживать обращения по записи и просто заполнять список используемых страниц. Инвалидация же этого списка уже будет лежать на ПО.
qw1
А, сделать что-то типа TRIM, когда софт говорит контроллеру, что эта страница больше не используется.
asmolenskiy
это я и имел в виду под инвалидацией
qw1
Тут, в отличие от файловой системы, каждая программа работает со страницами напрямую. Нет единой точки, куда можно воткнуть TRIM и станет хорошо.
asmolenskiy
Это конечно не мой профиль — но я оч сомневаюсь что хоть в какой-то ОС софт работает с физической памятью напрямую.
Alexeyslav
RAS only Refresh это как раз старенький, можно сказать базовый режим работы, но немного неэффективный — он требует выделения циклов обращения к памяти именно для рефреша, что снижает пропускную способность памяти. В старых системах это небыло проблемой — пока процессор исполняет инструкцию шина свободна и можно дернуть память на обновление, но начиная с пентиума с введением конвеера команд это уже не работает — процесор может обращаться в память без перерывов и достаточно долго… за это время есть риск что незадействованные строки прокиснут.
sim2q
Не помню точно, но в очень и очень старых чипах регенерация уже была по обращению к какой то одной координате (внутри чипы организованы совсем не так как с наружи по 8,16,32 итд, а сильно более «квадратно»). Так что там перебираются далеко не все адреса
Alexeyslav
В старых чипах, рефреш осуществялся по дерганию ножки RAS без последующей команды CAS. ПРичем на шине адреса должна быть установлен адрес строки которую надо рефрешнуть. Для модуля 128К достаточно было перебирать 6 бит адреса… Более того рефреш происходил просто при обращении к строке, если обращение к памяти было более менее распределено по строкам то можно было ничего не обновлять… эксперименты показали что такие чипы держат состояние 20-30 сек.
sim2q
и кажется это происходило автоматически при выводе на экран…
ps синклерист спалился:)
AllexIn
Что мешает не подключать вторую половину оперативки, если она не используется и на ней нет данных? У RAM вроде нет сколь либо значительной задержки при подаче питания, она сразу в рабочее состояние включается.
balamutang
Какой смысл? Она будет пустая только первое время после включения, потом там будут болтаться свернутые приложения. А если свернутые постоянно выгружать то зачем вообще столько оперативки, можно купить смарт с меньшим объемом озу
S-trace
После ухода в сон оценить его прогнозируемую длительность и через некоторое время (если прогноз оправдался и сон действительно достаточно долгий) очистить по максимуму и опустевший чип отключить. Типа как Doze в Android, но ещё и с очисткой/пережатием памяти.
qw1
Операционные системы написаны так, что стараются занять всю память.
Если памяти очень много, будет расти дисковый кеш. Каждый сектор, когда-либо прочитанный с диска, останется в памяти.
И вторая проблема — дефрагментация. От «виртуального адреса» в приложении до физического местоположения в памяти — 2-3 уровня трансляций. Две соседние ячейки массива (попавшие на границу страницы) могут физически находиться в разных чипах. Если делать такой «дефрагментатор», переносящий по возможности данные в один чип и выключающий второй за ненадобностью, он будет просто кошмаром в реализации, потому что должен контролировать сразу много уровней трансляции памяти.
sumanai
Но ведь Apple с этим вполне справляется, и отключает ненужные банки памяти в ноутбуках. Они даже этим мотивировали то, что сидели на DDR при наличии DDR4, мол, 4 с этой фичей пока не было.
qw1
А есть ссылки на источник? Как-то неправдоподобно выглядит завязка управления питанием на версию протокола доступа.
sumanai
Там не версия, а целая подверсия LPDDR:
qw1
Это заявление производителя чипов памяти, что есть такая возможность. Если бы эта возможность использовалась в мак-буках, Apple бы об этом кричала в маркетинговых материалах. А в приведённой статье ничего такого не вижу. Делаю вывод, что фича не используется.
Viknet
"Маркетинговые материалы" Apple предназначены для обычных людей, а не для гиков. Они даже модель процессора не пишут в технических характеристиках, не то что какие-то специфичные технологии экономии энергии в оперативной памяти.
Но именно из-за отсутствия поддержки LPDDR4 в последних на тот момент мощных мобильных чипах Intel, они пару поколений ноутбуков выпускали на LPDDR3.
qw1
Apple могла зависеть от других фич PMM, не консолидации памяти.
Piskov
Эпл на сегодня крупнейший в мире закупщик оперативы (9% всего рынка):
www.electronicsweekly.com/uncategorised/appe-biggest-buyer-silicon-2020-02
Ну т.е. им физически может быть невозможным докинуть лишний гиг-два оперативы, сохранив тот же объем выпуска девайсов.