Site icon AppTractor

Как Android управляет маленькой памятью: Kswapd и LMK

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

В этой статье мы рассмотрим, как Android распределяет память и реагирует на ситуации с нехваткой памяти.

Платформа Android работает на основе принципа, что свободная память — это зря потраченная память.

Учитывая это правило, ОС Android всегда старается выделить всю доступную память.

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

В любом случае, память нужна системе, и Android OS использует ее эффективно. Но что делать, если вся память занята? Как открыть больше приложений? Не волнуйтесь! Android справляется и с этим!

Он использует две важные концепции: Kswapd и LMK (Low Memory Killer). Но сначала давайте разберемся в основах.

Типы памяти

Устройства Android содержат три различных типа памяти: RAM, zRAM и хранилище.

  1. RAM, оперативная память: самая быстрая, но ограниченная память.
  2. zRAM: раздел оперативной памяти, используемый для пространства подкачки. Все сжимается при помещении в zRAM, а затем распаковывается при копировании из zRAM.
  3. Хранилище: содержит все постоянные данные.

Страницы

Оперативная память разбита на страницы. Обычно каждая страница занимает 4 КБ памяти.

Страница (часть оперативной памяти) может считаться либо «используемой», либо «неиспользуемой» (свободной).

Используемая страница может быть использована либо известным нам процессом (допустим, мы знаем, что процесс A использует страницу номер 154), либо каким-то анонимным процессом (мы не знаем, кто использует страницу).

Страница, используемая известным процессом, называется «кэш».

Кэш может быть «чистым» или «грязным».

Но что делать, если эти страницы почти все использованы? Android придется как-то справляться с ними.

Управление памятью

В Android есть два основных механизма для решения проблем с нехваткой памяти: демон подкачки ядра и убийца при низкой памяти.

Как вы, наверное, знаете, Android работает на ядре Linux, и это ядро Linux поддерживает низкий и высокий пороги свободной памяти.

Kswapd: демон подкачки ядра

kswapd возвращает чистые страницы, удаляя их.

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

LMK: убийца низкой памяти

Если kswapdc не мог освободить достаточно памяти, необходимой системе, ядро начинает убивать процессы, чтобы освободить больше памяти, используя lmk (low-memory killer).

Чтобы решить, какой процесс убить, LMK использует показатель «нехватки памяти» под названием oom_adj_score для определения приоритета запущенных процессов.

Высокие оценки для закрытия — вверху, низкие — внизу.

Чтобы убить приложение, ядро должно знать конкретные страницы, которые используются процессом, это называется «след памяти».

Также могут существовать общие страницы памяти, верно? Я уже объяснял это выше.

При определении объема памяти, используемой приложением, система должна учитывать общие страницы.

Есть три способа определения:

  1. Резидентный (Resident Set Size, RSS): Все страницы: Shared + Non-Shared.
  2. Пропорциональный (Proportional Set Size, PSS): Не разделенные страницы + равномерное распределение разделяемых страниц (например, если три процесса совместно используют 3 МБ, каждый процесс получает 1 МБ в PSS) (используется именно этот способ).
  3. Уникальный (Unique Set Size, USS): Только не разделенные страницы.

PSS — это то, что используется ОС. Вычисление PSS занимает много времени, поскольку системе необходимо определить, какие страницы и сколько процессов их совместно используют.

После этого в памяти обязательно появится свободное место для запуска нового приложения.

Ищете видеообъяснение? Посмотрите это:

Источник

Exit mobile version