Работа с ядрами android

Основы безопасности операционной системы Android. Уровень ядра

Вступление

Самой распространенной операционной системой для смартфонов на сегодняшний день является Android. Но не только этот факт подогревает интерес к ней. Открытость, возможность что-то настроить, подкрутить, и, естественно, сломать тоже в немалой степени способствуют увеличению популярности этой платформы. Я попробую поделиться опытом, как устроена эта операционная система, а так же рассмотреть систему безопасности. Всем, кому интересно, добро пожаловать! В этой статье я рассмотрю безопасность на уровне ядра.

Disclaimer

Термины я буду стараться писать на английком языке, так как боюсь ошибиться в их переводе. Если кто-то знает, как их красиво перевести на русский язык, напишите мне, и я дам перевод этих терминов. Желательно, чтобы у вас под рукой находились исходный код Android (хотя я и буду стараться давать ссылки на файлы в Интернете), потому что я иногда буду давать ссылки на файлы, где находится та или иная функциональность. Как загрузить исходный код, можно почитать здесь или вот в этой статье на Хабре.

Список статей

Стек Android

Ну никуда не деться от этой картинки. Я нашел её на просторах Интернета и нужна она для того, чтобы понять из чего состоит Android. Итак, в стеке Android выделяют четыре уровня (снизу-вверх):

  1. Linux kernel (Ядро Linux)
  2. Native Libraries
  3. Application Framework
  4. Applications (Приложения)

Linux kernel. Как неудивительно это звучит, но изначально, Android Inc. — это стартап. Как и во всех стартапах, в этой компании стояла задача максимально использовать уже существующие решения. Поэтому в качестве ядра этой платформы был выбран Linux из-за его открытости и наличия необходимой функциональности. В Android ядро Linux управляет памятью, процессами, а так же используется в качестве hardware abstraction layer (HAL). Насколько мне известно, в Linux драйвера либо встроены в ядро, либо разработаны в виде загружаемых модулей ядра. Так как в Android загрузка модулей ядра по умолчанию отключена, а если встраивать все драйвера, то ядро очень сильно разрастется, то было принято решение создать промежуточный слой (proxy) между ядром и драйверами, который и назвали HAL. Таким образом, HAL — это просто набор интерфейсов, имплементация которых реализована в драйверах. С другой стороны в ядро были добавлены некоторые системы, которые характерны только для Android систем. На данный момент, они пока не включены в основную ветку ядра Linux, поэтому просто скачать ядро Linux и заменить им ядро Android не получится. Среди них следует выделить, Binder (обеспечивает межпроцессное взаимодействие IPC/RPC), Asynchronous SHared MEMory — Ashmem (драйвер разделяемой памяти), Wakelocks (механизм, который позволяет предотвращать затемнение экрана и/или отключение процессора), Low Memory Killer, Alarm, Logger и т.д.

Native Libraries. К этому слою относятся различные нативные библиотеки, которые необходимы для работы Android. Они так же позаимствованы у open-source сообщества. Среди них мы можем найти SQLite, WebKit и т.д.

Android Framework. К этому слою относится то, с чем мы обычно взаимодействуем, когда пишем наши приложения для Android (PowerManager, ActivityManager, NotificationManager и т.д.).

Applications. Приложения бывают двух типов: те, что поставляются вместе с образом системы (системные) и приложения, которые мы загружаем из маркета или других источников. В первом случае, в устройстве приложения находятся в «/system/app» директории, во втором случае в «/data/app».

Безопасность на уровне ядра

Давайте рассмотрим процесс установки приложения на Android устройство. Существует несколько способов установить приложение на устройство (в общем случае):

  1. Используя приложение PackageInstaller
  2. Используя приложение Android Market
  3. Используя комманду adb install

На рисунке, например, приложение ex1.apk устанавливается с помощью PackageInstaller (используется в случае, если вам, например, по почте прислали приложение и вы хотите его установить с устройства), ex2.apk устанавливается с помощью Android Market (Google Play), и приложение ex3.apk устанавливается с помощью комманды adb install ex3.apk (обычно эта комманда используется разработчиками приложений для установки приложения с компьютера).

Во время установки, Android каждому приложению по умолчанию присваивает уникальные user ID (UID) и group ID (GID), таким образом каждому приложению в этой операционной системе соответсвует свой пользователь. Имя пользователя обычно имеет формат app_x, а идентификаторы пользователя вычисляется по формуле (Process.FIRST_APPLICATION_UID + x), Process.FIRST_APPLICATION_UID равен 10000. Эти идентификаторы приложения не изменяются. Список установленных приложений хранится в файле «/data/system/packages.list» и если у вас рутованый телефон, или вы работаете с эмулятором, то вы можете просмотреть этот файл, используя следующую комманду:

У каждого приложения есть своя домашняя директория, например /data/data/

— имя Android пакета, например com.ex.ex1 Имя Android пакета задается в свойстве package в файле AndroidManifest.xml Эта папка — Internal storage (внутреннее хранилище), директория, где приложение хранит все свои приватные данные, и к которому разработчики приложений получают доступ используя функции Context.getFilesDir() или Context.getDir() У этой папки права доступа определены как drwxr-x—x, т.е. только владелец и пользователи входящие в группу владельцев имеют полный доступ к этой папке. А так как каждое приложение определено как уникальный пользователь, то это означает, что приложения, по умолчанию, не имеют доступа к информации друг друга. Хотя при создании файла во внутреннем хранилище можно явно задать, что этот файл будет MODE_WORLD_READABLE и/или MODE_WORLD_WRITABLE

Кроме того, на уровне ядра уникальные UID и GID каждого приложения используются для разделения доступа к ресурсам системы (память и процессорное время). Таким образом, на уровне ядра для каждого приложения создается своя собственная песочница (Application Sandbox).

С другой стороны, разработчик приложения может указать, что некоторые ЕГО приложения должны иметь один и тот же UID. В AndroidManifest.xml файле для этого есть специальное свойство sharedUserId В этом случае, эти приложения будут иметь доступ к ресурсам друг-друга, но только если они подписаны одним и тем же ключом разработчика.

Некоторые permission (разрешения) так же работают на уровне ядра. Давайте, например, рассмотрим наиболее используемое разрешение android.permission.INTERNET Если приложение запрашивает это разрешение, то Android во время установки дополнительно включает это приложение в специальную группу «inet». Так же работают и некоторые другие разрешения. Список соответствия между этими разрешениями и соответствующими группами можно найти в файле frameworks/base/data/etc/platform.xml:

Список соответствия между именами этих групп и значениями (GID) задан в явном виде в файле system/core/include/private/android_filesystem_config.h в массиве структур android_ids[]:

Таким образом, если приложение пытается подключиться к Интернету, ядро проверяет, находится ли это приложение в группе с идентификатором AID_INET. Если нет, то приложению запрещается доступ. Код этой проверки очень тривиальный:

Заключение

Это моя первая статья на Хабре, так что не судите строго. Если сообществу интересно, то я продолжу в следующих статьях описывать внутренности Android. Я понимаю, что много не знаю, да и времени всегда не хватает, но я постараюсь поделиться тем, что уже пропустил через себя. Надеюсь, что узнаю что-то новое из комментариев! Если кому-то интересна какая-то определенная тема, то пишите в комментариях, постараюсь в будущих статьях учесть ваши пожелания.

Источник

Как задействовать все ядра на андроиде

Независимо от того, насколько быстро работают наши телефоны, мы всегда желаем, чтобы они были чуточку быстрее. К счастью, Android позволяет вам сделать это. Этот процесс называется «разгон» — он означает, что главный процессор будет работать немного быстрее, чем обычно. Разогнать процессор очень легко, и это позволит вам получить дополнительные 30 процентов к его мощности. Ниже приводятся советы, как сделать разгон вашего Android-телефона, чтобы он стал реально мощным телефоном.

Как разогнать Android

Перед началом прочтите это

Прежде всего, мы хотим дать вам стандартное предупреждение. Разгон главного процессора вашего телефона связан с определёнными рисками. Увеличение тактовой частоты процессора вызовет большее количество тепла и повышенный расход энергии. Конечно, не стоит полагать, что ваш телефон будет напоминать устройство, засунутое в огонь, или ваш аккумулятор будет испорчен, но выделение избыточного тепла может вызвать нестабильность и повлиять на время работы аккумулятора.

Основной момент – запастись временем. Не пытайтесь увеличить частоту процессора сразу на 30 процентов. Делайте это не спеша, и после каждого увеличения оценивайте стабильность системы. Если Android работает без нареканий, а уровень выделяемого телефоном тепла и время работы аккумулятора приемлемы, и плюс, нет зависаний или странного поведения, то вы можете продолжить увеличивать тактовую частоту процессора. Если же дела пошли как-то странно, вернитесь к последней стабильной тактовой частоте.

Получение нужного ядра для разгона

Вы довольны результатами? Давайте продолжим. Единственное, что вам нужно для настройки параметров главного процессора вашего Android-телефона – это так называемое ядро ОС, поддерживающее более высокую тактовую частоту. Отметим, что разгон процессора является основным элементом в моддинг-сообществе, так что недостатка в хороших ядрах точно не будет. Итак, вам нужно просто выбрать правильное ядро для вашей конкретной модели телефона.

Потратьте немного времени на поиск нужного ядра для вашего устройства

Прежде всего, выясните номер модели вашего телефона. Для этого нужно зайти в раздел «Настройки», далее в «О телефоне» и посмотреть, что там сказано. Также, вероятно, вы захотите записать данные о версии Android, установленной на вашем телефоне. Важный нюанс: для разгона главного процессора ваш телефон должен иметь root-права!

Читайте также:  Как удалить синтезатор речи андроид

Само собой, что этот процесс не будет покрываться гарантией, поэтому вы будете действовать на свой страх и риск. Кроме всего прочего, вам также надо будет установить в телефон пользовательский режим восстановления (также известный под именем «кастом рекавери»). Подробнее об этом смотрите ниже.

Вам необходимо установить пользовательский режим восстановления, например, TWRP или CWM

Замена ядра и разгон процессора занимают не так много времени, однако стоит потратить какое-то время на поиск нужного ядра. Некоторые сайты, например, XDA Developers, можно считать прекрасной площадкой для старта. Есть четыре аспекта, на которые вы обращаете внимание в ядре: 1) чтобы это ядро поддерживало разгон процессора; 2) чтобы оно было совместимо с вашей моделью телефона; 3) чтобы оно работало в вашей версии Android; 4) чтобы оно имело положительные отзывы.

Чем большую популярность будет иметь ядро, тем легче будет получить помощь от сообщества в случае необходимости или же найти какие-либо предложенные параметры (если вы предпочитаете получать знания от усилий других людей, а не тратить на знания свои). В целом, чем больше отзывов будет о ядре, тем более информированное решение вы сможете принять.

Разгон ПО для вашего ядра

Некоторые ядра имеют соответствующее программное обеспечение, которое было разработано специально для того, чтобы помочь вам получить максимум пользы от ядра. В подобное ПО может входить обычный слайдер для разгона, регулятор настроек главного процессора, опции для уменьшения напряжения и т. д. Если у ядра, которое вы используете, имеется дополнительное приложение, то можете задействовать его. Если же нет, то тогда поищите в Play Store приложение для общего разгона (или менеджер для главного процессора) с хорошим рейтингом и положительными отзывами.

Некоторые пользовательские ядра имеют программное обеспечение, с помощью которого вы легко можете изменить тактовую частоту главного процессора

После того, как у вас появилось ядро для вашей конкретной модели телефона, и вы убедились, что оно совместимо с вашей версией Android и поддерживает разгон процессора, можно двигаться дальше. Для этого практического занятия мы будем делать разгон рутованного Nexus 6 со стоковой версией Android 6.0 Marshmallow, используя ядро ElementalX.

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

Мы устанавливаем ядро ElementalX на наш стоковый Nexus 6

Как разогнать ваш Android-телефон

Ваш телефон должен иметь root-права для установки пользовательского ядра. Также вам необходимо установить пользовательский режим восстановления (ввиду того, что у вас не получится установить ядра с помощью стокового режима восстановления). Если для этого вам нужна помощь, воспользуйтесь нашим руководством как установить пользовательский режим восстановления. Несмотря на то, что руководство в этой ссылке рассчитано для Nexus 5, однако процесс используется один и тот же.

  1. Убедитесь, что у вас имеется резервная копия ваших данных. Вы можете сделать такую копию с помощью кастомного рекавери, с помощью любого приложения или ПК-базовых решений.

Сначала загрузите ядро на ваш Android

  1. После того, как вы выбрали подходящее ядро, скачайте его (а также любое ПО, которое сопутствует ему) на ваш Android (скачивание можно делать в папку «Загрузки»). Также вы можете скачать ядро на ваш компьютер и затем скопировать ZIP-файл в корневой каталог вашего телефона (если есть такое желание), но это несложное сделать на вашем телефоне и через рекавери.

Нажмите на иконку «Установить»

  1. Теперь вы можете вводить ваш «кастом рекавери». Мы используем тип TWRP.
  2. Нажмите на иконку «Установить» (или на «установить ZIP» в CWM) и перейдите в папку, где находится сохранённый zip-файл ядра.

Найдите ядро, которое вы загрузили раньше

  1. Установите zip-файл ядра и дождитесь появления сообщения о том, что установка прошла успешно. Некоторые ядра (например, Elemental X в нашем случае) будут запускаться через серию диалоговых окон, наподобие приложения Install Wizard на вашем компьютере.

Отметим, что существуют и такие ядра, которые позволяют вам назначить тактовую частоту главного процессора уже во время установки. Позже вы сможете вносить, где надо, изменения посредством установленного приложения-менеджера для главного процессора. Прочитайте нижеуказанные инструкции, как это сделать.

Очистите ваш кэш

  1. Пройдите в подраздел «Расширенные настройки» в режиме восстановления и нажмите на иконку «Исправить права доступа к файлам и разделам».

Изменение частоты главного процессора

Если вы не изменяли настройки главного процессора во время установки вашего пользовательского ядра, то теперь вы можете запустить менеджер процессора (или приложение для ядра). Если у вас нет уже установленного совместимого с вашим ядром ПО, вам нужно будет найти соответствующее приложение в Play Store.

В принципе, есть множество подобных приложений, и работают они прекрасно, но мы используем бесплатное приложение Kernel Adiutor. Вам придётся предоставить приложению для ядра разрешение на использование root-прав, а также, вероятно, придётся установить приложение BusyBox (которому тоже будут нужны root-права).

Как вы можете видеть, мы установили пользовательское ядро

Найдите настройки, отвечающие за контроль тактовой частоты главного процессора. В зависимости от того, какое приложение вы используете, вы можете выбрать максимальную частоту процессора из выпадающего меню, либо воспользоваться слайдером. Помните, что пользоваться им нужно не спеша. Используйте каждый уровень тактовой частоты на некоторое время, чтобы посмотреть, как он влияет на стабильность, время работы аккумулятора и уровень выделяемого тепла. Для начала увеличьте тактовую частоту на 10 процентов по сравнению с вашей текущей частотой и в дальнейшем повышайте её понемногу.

Выберите максимальную тактовую частоту главного процессора и наслаждайтесь приростом его мощности

Не удивляйтесь, если частота вашего главного процессора не достигнет нового параметра слишком быстро. Что вы делаете, когда проводите разгон процессора? Меняете его максимальную тактовую частоту. Так что процессор сможет достигнуть большей производительности в том случае, когда это будет необходимо.

Кстати, вы также можете изменять минимальную частоту, хотя это создаёт ненужную нагрузку на процессор и аккумулятор вашего телефона. Но, в конце концов, нет никакой необходимости чрезмерно разгонять процессор для, скажем, чтения писем.

Если вы сталкиваетесь с какой-либо нестабильностью с вашими новыми параметрами, просто вверитесь назад и немного уменьшите тактовую частоту процессора, а затем посмотрите, как пойдут дела.

Как вы можете видеть, наш Nexus 6 теперь работает на 20 процентов мощнее, чем обычно

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

Расскажите нам о том, чего вы добились, и насколько лучше стал ваш разогнанный Android теперь.

вкл. 21 Март 2015 . Опубликовано в Android — Общее

Режимы процессора (ядра) на Андроид и планировщик I/0. Многие кто получил root права, начинают всячески модернизировать Android, а также разгонять процессор смартфона или планшета. Для того чтобы правильно его разгонять необходимо знать режимы Android ядра и планировщик I/0.

Чем регулировать производительность Android?

Регулировать тактовую частоту изменять режимы Android ядра и планировщик I/0 можно стандартными средствами в прошивках CyanogenMod, в приложение SetCpu, Tasker, Antutu CPU, Tegrak OverClock и другие. Прежде всего вам будут необходимо получить root права.

Режимы Android ядра

Если говорить правильно о режимах Android ядра то правильно будет называть —алгоритмы управления частотой процессора или kernel CPU governor. Не все режимы которые здесь перечислены могут быть в вашем Android устройстве. Android работает на ядре Linux .

Какие бывают CPU governor

1: OnDemand
2: OndemandX
3: Performance
4: Powersave
5: Conservative
6: Userspace
7: Min Max
8: Interactive
9: InteractiveX
10: Smartass
11: SmartassV2
12: Scary
13: Lagfree
14: Smoothass
15: Brazilianwax
16: SavagedZen
17: Lazy
18: Lionheart
19: LionheartX
20: Intellidemand
21: Hotplug
22: Wheatley
23: Lulzactive
24: AbyssPlug
25. BadAss
26. Ktoonservative
27. AssWax
28. Sleepy
29. Hyper
30. SmartassH3
31. Smartmax

Подробно о каждом режиме

OnDemand — «нейтральный» режим работы ядра, используется по умолчанию во многих Android устройствах. В данном режиме сбалансирована производительность и потребление энергии, но к сожалению нет режима энергосбережения.

OndemandX — улучшенная версия ядра ondemand, с добавлением профиля для сна и пробуждения. Качество его работы во многом зависит от планировщика I/0.

Performance — «производительный» режим ядра, как вы поняли по названию. В данном говернере (режиме) процессор работает практически всегда на максимальной частоте или максимальной. Включается когда устройство на зарядке. Для повседневного использования не подходит, так быстро садит батарею.

Powersave — «энергосберегающий» режим ядра. В отличие от Performance очень медленно и поднимает частоту ядра, точней практически не поднимает и работает на самой минимальной частоте. Использовать данный режим возможно только при выключенном экране, для сохранения энергии. Для повседневного использования не подходит, так как Android становиться не отзывчивым или зависает.

Conservative — «энергосберегающий» режим ядра. В 2 раза медленней ondemand поднимает тактовую частоту процессора. При одинаковых частотах в 2 раза уступает производительности ondemand. Без нагрузки устанавливает минимальную частоту процессора. Рекомендуется использовать также когда выключен или включается экран.

Userspace — «нейтральный» режим работы ядра. Настраивает сам пользователь. Встречается очень редко.

Читайте также:  Сравнение iphone se 2020 с андроидами

Min Max — «нейтральный» режим работы ядра. Модифицированный режим ядра Conservative, но в отличие его более производительный. Использует или максимальную или минимальную частоту ядра, промежуточных нет!

Interactive — «производительный» режим ядра. Модифицированный режим ядра ondemand, который быстрее изменяет частоту ядра, но в отличие от ondemand, разрешается проводить больше времени на максимальной частоте. Поэтому менее энергоэффективный.

InteractiveX — «производительный» режим ядра. Как видно из названия модифицированный режим ядра Interactive. Более энергосберегающий.

Smartass — «производительный» режим ядра. Модифицированный режим ядра InteractiveX. Очень популярен у пользователей Android.

SmartassV2 — «производительный» и «энергосберегающий» режим ядра. Модифицированный режим ядра Smartass, точней вторая его версия. Многие называют его идеальным. Возможно оно так есть.

Scary — «производительный» и «энергосберегающий» режим ядра. Модифицированный режим с включениями Smartass и Conservative медленно подымает и медленно опускает частоту процессора, но все же работает чаще на минимальных частотах.

Lagfree — «энергосберегающий» режим ядра. Был создан как альтернатива ondemand. Более экономичный, но в необходимых ситуациях быстро поднимает максимальную частоту. Не рекомендуется использовать в тяжелых играх и просмотре видео.

Smoothass — разрабатывался как альтернатива Smartass. Более производительный, вследствие чего менее энергоэффективный.

Brazilianwax — разрабатывался как альтернатива SmartassV2. Более производительный, вследствие чего менее энергоэффективный.

SavagedZen — «энергосберегающий», разрабатывался как альтернатива Smartass. Более энергоэффективный, вследствие чего менее производительный.

Lazy — режим ondemand с более быстрым поднятием частоты.

Lionheart — «производительный» режим ядра. Похож на Performance, но с более быстрым поднятие частоты.

LionheartX — улучшенный вариант Lionheart с включениями Smartass.

Intellidemand — интеллектуальный вариант OnDemand. Схож с Interactive. Активно подымает частоту в требовательных задачах и плавно в менее требовательных.

Hotplug — очередной вариант OnDemand. Отключает ядра процессора в простое

Wheatley — очередной вариант OnDemand.

Lulzactive — смесь Interactive и Smartass. Увеличивает частоту на шаг при загруженности системы более чем 60%. Уменьшает на шаг если меньше 60%.

AbyssPlug

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

Ktoonservative — усовершенствованный вариант Conservative.

AssWax — вариант Interactive.

Sleepy — очередной вариант по достижению производительности и автономности.

Hyper — очередной вариант основной OndemandX

SmartassH3 — предназначен для экономии батареи

Smartmax — представляет собой сочетание между OnDemand и Smartass2 По умолчанию настроен это для экономии заряда батареи.

Какие бывают планировщики I/0

Планировщики I/0 — Планировщики ввода/вывода выполняют две основные операции: слияние и сортировка. Слияние представляет собой процесс принятия двух или нескольких смежных запросов ввода/вывода и объединения их в один запрос. (взято из opennet.ru).

Если сказать в двух словах то это, способы обращения к памяти.

1: Noop
2: Anticipatory
3: CFQ
4: Deadline
5: VR
6: Simple или SIO
7: BFQ

Подробно о каждом планировщике I/0

Noop — самый безопасный и простой планировщик, так как только объединяет запросы но не сортирует.

Anticipatory — выдает запросы тогда, когда предыдущий был обработан, после чего ожидает некоторое время следующий запрос, если его нет, переходит к другому запросу.

CFQ — объединяет задачи в цели и по кругу их обходит. Сбалансированный и производительный вариант для Android.

Deadline — хранит отсортированную очередь на запись, новые запросы сортируются и перемещаются в конец очереди. По своим возможностям превосходит CFQ.

VR — с элементами Deadline. Самый не стабильный планировщик, но все же самый производительный.

SIO — выполняет сначала быстрые запросы, после более емкие. Стабильный, простой и производительный.

BFQ — производительный, но все же хуже чем VR и SIO

Режимы Android ядра и планировщик I/0 стоит использовать

Планировщики — SIO, VR или Noop

Режимы ядра

По сбережению энергии — InteractiveX, Smartass, SavagedZen (conservativ и powersave не учитывались так как для работы они не годятся)

По производительности — SmartassV2, Lionheart, MinMax

Уже с десяток лет в наших компьютерах стоят многоядерные процессоры, и в настоящее время это норма. Вначале ядер стало два, потом четыре, а сегодня компании вроде Intel и AMD предлагают high-end процессоры для настольных компьютеров с 6 или 8 ядрами. Та же история и с процессорами в смартфонах. Двухъядерные энергоэффективные процессоры от ARM появились около 5 лет назад, а вслед за ними и 4, 6 и 8-ядерные процессоры на архитектуре ARM. Между тем, есть разница между 6- и 8-ядерными настольными процессорами от Intel и AMD и 6- и 8-ядерными процессорами, основанными на архитектуре ARM. У большинства относящихся ко второй категории процессоров с больше чем 4 ядрами используются как минимум две различных конструкции ядра.

С некоторыми исключениями, в целом, восьмиядерный ARM процессор использует систему, известную как Heterogeneous Multi-Processing (HMP), в которой «гетерогенность» означает неравноценность ядер. В современном 64-битном процессоре это значит, что кластер с ядрами Cortex-A57 или Cortex-A72 используется в сочетании с кластером ядер Cortex-A53. A72 – высокопроизводительное ядро, в то время как у A53 большая энергоэффективность. Такое сочетание известно как big.LITTLE, поскольку здесь «большие» ядра (Cortex-A72) объединены с «маленькими» Cortex-A53. Это сильно отличается от 6- и 8-ядерных процессоров для ПК от Intel и AMD, поскольку проблема энергопотребления в этом случае не так актуальна, как на мобильном устройстве.

Когда многоядерные процессоры впервые попали на ПК, возникло много вопросов касательно преимуществ двухъядерного процессора перед одноядерным. Двухъядерный 1.6ГГц процессор «лучше» одноядерного 3.2ГГц процессора или нет? А что Windows? Сможет ли она максимально реализовать потенциал двухъядерного процессора? А игры? Они правда идут лучше с двухъядерным процессором? И надо ли при написании приложений делать это особым образом, чтобы они могли использовать дополнительные ядра? И так далее.

О мультипроцессорной обработке

Эти вопросы вполне закономерны, и, конечно, такие же вопросы возникают по поводу многоядерных процессоров в смартфонах. Перед тем, как посмотреть на «взаимоотношения» многоядерных процессоров в смартфонах и Android приложений, давайте немного рассмотрим многоядерную технологию в целом.

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

Не углубляясь в частности, существует технология, известная как вытесняющая многозадачность, которая позволяет разделять доступное процессорное время между несколькими задачами. «Кусочек» процессорного времени отводится одной задаче, «кусочек» другой и так далее. В основе операционных систем, таких как Linux, Windows, OS X и Android, лежит та часть технологии, что известна как планировщик и определяет, какому процессу достанется следующий «кусочек» процессорного времени.

Планировщики могут писаться по-разному, на сервере планировщик может быть заточен под то, чтобы давать приоритет задачам ввода-вывода вроде записи на диск или считывания из сети, в то время как в настольной версии он будет уделять больше внимания отзывчивости графического интерфейса.

Когда ядер больше одного, планировщик может отвести для одного процесса кусочек времени процессору 0, в то время как другой процесс получает кусочек времени процессора 1. Так планировщик и двухъядерный процессор позволяют двум задачам выполняться одновременно. Чем больше ядер, тем больше процессов могут выполняться одновременно.

Вы уже заметили, что планировщику хорошо удается разделять ресурсы процессора между различными задачами вроде того же вычисления простых чисел, запуска рабочего стола, использования браузера. Однако один процесс, такой как вычисление простых чисел, может быть разделен между несколькими ядрами. Или нет?

Некоторые задачи последовательны сами по себе. Чтобы испечь пирог, вам нужно разбить яйца, добавить муку, замесить тесто и так далее. Нельзя поставить пирог в духовку, пока не готово тесто. Так что даже если у вас на кухне два повара, сэкономить время на одной из задач не выйдет. Есть нерушимый порядок и последовательность действий. Можно решать несколько задач сразу и поручить одному повару пирог, а другому нарезку салата, но задачи с предопределенным порядком действий не выиграют ни от двухъядерного, ни даже от 12-ядерного процессора.

Не все задачи таковы, как описано выше. Многие операции, которые выполняет компьютер, можно разделить на несколько самостоятельных задач. Чтобы это произошло, основной процесс должен создать другой процесс и отдать ему на откуп часть работы. К примеру, если, используя алгоритм для вычисления простых чисел, вы не используете предыдущие результаты, не пользуетесь Решетом Эратосфена, можно разделить работу на две части. Один процесс вычисляет первые 50 млн чисел и второй – вторые 50 млн. Четырехъядерный процессор позволяет поделить работу на 4 части, и так далее.

Но для того, чтобы все это работало, программу надо написать особым образом. Другими словами, она должна быть разработана так, чтобы делить нагрузку на меньшие части, а не делать ее целиком. Для этого есть различные технологии программирования, и вы наверняка слышали слова вроде «однопоточный» или «многопоточный». Эти слова означают программы, которые написаны для выполнения одной задачи (однопоточная, все вместе) или программы с индивидуальными задачами (потоками), которым может быть отдельно назначено свое процессорное время. Подводя краткий итог, однопоточная программа ничего не выиграет от запуска на многоядерном процессоре, а вот многопоточная – напротив.

Итак, мы почти добрались до сути, и прежде чем перейти к Android, нужно еще одно. От того, как написана ОС, зависит то, что некоторые выполняемые программы могут быть изначально многопоточными. Часто отдельные части ОС сами по себе представляют собой независимые задачи, и когда ваша программа осуществляет ввод и вывод информации или выводит что-то на экран, это может быть отдельным процессом в системе. Использование того, что называется non-blocking calls может внести многопоточность в программу, не создавая потоков специально.

Читайте также:  Как сохранить прошивку андроида

Это важный аспект для Android. Одна из задач системного уровня в архитектуре Android – SurfaceFlinger. Это основа процесса вывода графической информации на дисплей в Android. Это отдельная задача, которой должно быть выделено процессорное время. Что означает, что определенные графические операции для выполнения предполагают запуск нового процесса.

Android

Из-за процессов вроде SurfaceFlinger Android выигрывает от многоядерных процессоров без нужды в специальных многопоточных по сути приложениях. И поскольку множество вещей происходит в фоне, вроде синхронизации и виджетов, Android выигрывает от многоядерности и как единое целое. Эта ОС ожидаемо обладает способностью создавать многопоточные приложения. Чтобы узнать больше, посмотрите в раздел Процессы и Потоки в документации Android. Есть также многопоточные примеры от Google, а также имеется интересная статья от Qualcomm о программировании Android приложений для многоядерных процессоров .

Однако остается актуальным вопрос, является ли большинство Android приложений однопоточным и использует ли, таким образом, только одно ядро. Вопрос важный, поскольку если да, то у вас может быть многоядерный монстр из мира смартфонов, а на деле его процессор будет работать, как двухъядерный!

Также может возникнуть вопрос относительно разницы между 4- и 8-ядерным процессором. В ПК или серверах восьмиядерные процессоры построены так, что чип состоит из одинаковых ядер. Для большинства восьмиядерных процессоров с архитектурой ARM существуют высокопроизводительные и энергоэффективные варианты ядер. И смысл в том, что более энергоэффективные ядра служат для выполнения более второстепенных задач, а высокопроизводительные – для работы в тяжелой весовой категории. Однако, как и в настольной версии, эти ядра могут использоваться одновременно.

Основное, что здесь стоит запомнить, это то, что восьмиядерный процессор big.LITTLE обладает восемью ядрами из соображений энергоэффективности, а не производительности.

Тестирование

В Android возможно получить сведения о том, сколько ядер система использовала в процессоре. Для подкованных, это можно посмотреть в файле /proc/stat. Был создан инструмент, который берет информацию об использовании ядер в Android, пока запущено приложение. Чтобы повысить его эффективность и уменьшить падение производительности, сведения собираются, только когда приложение активно. Анализ данных производится офлайн.

Используя этот инструмент, у которого пока нет названия, для теста запускали серии приложений разного типа (игры, веб-браузинг и т.п.) на телефоне с четырехъядерным процессором Qualcomm Snapdragon 801, а затем на телефоне с восьмиядерным Qualcomm Snapdragon 615. При сопоставлении данных получились графики использования процессора. Начнем с простого примера. Вот график работы ядер Snapdragon 801 при использовании браузера Chrome:

График показывает, сколько ядер использовали Android и браузер. Он не демонстрирует, насколько было задействовано ядро, только то, использовалось ли оно в принципе. Если бы Chrome был однопоточным, можно было бы ожидать, что задействуются одно или два ядра, может быть, третье или четвертое по случаю. Но мы этого не видим. Наоборот, задействованы четыре ядра, и только временами количество используемых ядер падает до 2. В тесте с браузингом не читались загруженные страницы, это не повлияло бы на использование процессора. Страницы просто прогружались, и можно было переходить к новым.

Вот график, который показывает, насколько задействовалось каждое ядро. Это усредненный график (в реальном путаницу вносит огромное количество линий). Это значит, что по меньшей мере, показаны пики использования. К примеру, пик на этом графике превышает 90%, однако изначальные данные показывали, что некоторые ядра достигали 100% много раз. Тем не менее, здесь хорошо видно, что происходило.

А что у нас с восьмиядерным процессором? Демонстрирует ли он ту же самую схему? Нет, как видно на графике ниже. Постоянно используется семь ядер, на пиках доходит до 8, иногда опускается до 6 и 4.

Также и средний показатель использования каждого ядра демонстрирует, что планировщик вел себя иначе, поскольку Snapdragon 615 – процессор big.LITTLE.

Можно видеть, что два или три ядра трудятся больше других, но так или иначе задействованы все ядра. Мы видим, как архитектура big.LITTLE может передавать потоки от ядра к ядру в зависимости от загруженности. И не забываем, что смысл дополнительных ядер – это энергоэффективность, а не производительность.

Мы можем спокойно говорить о том, что использование «андроидом» всего одного ядра – это миф. Это было ожидаемо с учетом того, что Chrome, как и Android, был разработан многопоточным, как и для настольных компьютеров.

Другие приложения

Итак, это был разработанный многопоточным Chrome, а что с другими приложениями? Вот, что получилось вкратце

Gmail – на 4-ядерном телефоне получились равные доли использования 2 и 4 ядер. Однако среднее использование ядра не поднималось выше 50% — ожидаемо для относительно легкого приложения. Восьмиядерный процессор давал скачки от 4 к 8 ядрам, но меньшее среднее использование ядра – менее 35%.

YouTube – на 4-ядерном процессоре использовались только 2 ядра, в среднем менее 50% загрузки. На 8-ядерном в основном 4 ядра, временами вырастало до 6 и падало до 3. Загрузка ядер в среднем была всего 30%. Интересно, что планировщик предпочитал большие ядра, а маленькие почти не использовал.

Riptide GP2 – 4 ядра – процессор Qualcomm большую часть времени использовал два ядра, а остальные два – очень мало. А в 8-ядерном варианте последовательно использовались 6-7 ядер, но основную работу выполняли только три.

Templerun 2 – эта игра – более яркий пример проблемы однопоточности, чем другие приложения в тесте. В 8-ядерном варианте задействовались 4-5 ядер последовательно с пиками до 7. И только одно ядро выполняло тяжелую работу. На телефоне с 4-ядерным Qualcomm Snapdragon 801 два ядра делили нагрузку примерно поровну, а двум другим доставалось очень мало. На телефоне с 4-ядерным процессором от MediaTek нагрузка распределялась между всеми четырьмя ядрами. Это показывает, насколько разные планировщики и разные ядра разительно меняют то, как используется процессор.

Вот выборка графиков для наглядности. График бездействия 8-ядерной системы добавлен в качестве отправной точки.

Восьмиядерный аппарат, активный экран, пользователь не совершает никаких действий:

YouTube, запущенный на 4-ядерном аппарате:

YouTube, запущенный на 8-ядерном аппарате:

TempleRun2, запущенный на 4-ядерном аппарате:

TempleRun2, запущенный на 4-ядерном аппарате с процессором MediaTek:

Gmail, запущенный на 4-ядерном аппарате:

Gmail, запущенный на 8-ядерном аппарате:

Riptide GP2, запущенный на 4-ядерном аппарате:

Riptide GP2, запущенный на 8-ядерном аппарате:

Интересный результат получился в AnTuTu на 8-ядерном процессоре.

Как видите, последняя часть теста полностью загружает все ядра. Понятно, что бенчмарк искусственно создает высокую нагрузку, и поскольку все ядра работают на полную, чипсеты с большим количеством ядер выигрывают. С обычными приложениями такого не наблюдалось. Бенчмарки искусственно раздувают преимущество восьмиядерных аппаратов в производительности (больше, чем в энергоэффективности).

Почему легкие приложения используют 8 ядер?

Если вы посмотрите на приложения вроде Gmail, вы заметите интересный феномен. На 4-ядерном аппарате использование ядер поровну распределено между двумя и четырьмя ядрами, а на 8-ядерном – между четырьмя и восемью. Как Gmail может работать на 2 – 4 ядрах на 4-ядерном телефоне, а на 8-ядерном требовать как минимум четырех ядер? Бессмыслица какая-то.

Все дело снова в том, что ядра в телефонах с big.LITTLE неравноценны. В реальности мы видим, что планировщик использует ядра LITTLE, а когда нагрузка повышается, в дело вступают их собратья big. После некоторого времени совместной работы ядра LITTLE отправляются отдыхать. Когда нагрузка снижается, все происходит наоборот. Конечно, все это случается очень быстро, тысячи раз в секунду. Посмотрите на график, где сравнивается использование ядер big и LITTLE в Epic Citadel.

Посмотрите, вначале используются ядра big, а ядра LITTLE неактивны. Затем, около отметки 12 секунд, ядра big начинают использоваться меньше, и просыпаются ядра LITTLE. На 20 секундах big-ядра увеличивают активность снова, и LITTLE снижают ее почти до нуля. Это видно и на отметках 30, 45 и 52 секунды. В этих точках число использованных ядер колеблется. К примеру, в первые 10 с используются только 3 или 4 ядра (это ядра big), и на 12 с это число доходит до 6, затем снова падает до 4 и т.д. Так работает big.LITTLE. Этот процессор построен не так, как процессор для ПК. Дополнительные ядра позволяют планировщику выбирать для разных действий правильные ядра.

Все тесты, которые проводились, показали, что не нашлось ни одного реального приложения, которое использовало бы все 8 ядер на сто процентов. Так и должно было быть.

Подводим итоги

Прежде всего, подчеркнем, что эти тесты не отражают производительности телефонов, а лишь показывают, задействуют ли приложения Android несколько ядер. Не раскрывается преимуществ или недостатков многоядерности или чипсета big.LITTLE, как не сравнивается и работа частей приложения на двух ядрах при их использовании на 25% с использованием одного ядра на 50%, и так далее.

Затем, тесты еще не проводились для схемы Cortex-A53/Cortex-A57 или Cortex-A53/Cortex-A72. У Qualcomm Snapdragon 615 4-ядерный 1.7 ГГц ARM Cortex A53 кластер и четырехъядерный кластер 1.0 ГГц A53.

Интервал сканирования в этой статистике равен примерно трети секунды, т. е. около 330 миллисекунд. Если ядро сигнализирует об использовании на 25% в эти 300 миллисекунд и второе ядро – о том же самом, график покажет, что оба ядра используются на 25% одновременно, при этом одно ядро может задействоваться на 25% в течение 150 миллисекунд, то же и со вторым. Это означает, что ядра использовались последовательно, а не единовременно. В настоящее время меньшего интервала тест не предполагает.

Источник

Оцените статью