Планирование процессов Android - PullRequest
34 голосов
/ 28 октября 2011

Я пытаюсь получить лучшее понимание, чтобы я мог оценить влияние надежности от потенциальных проблем взаимодействия при создании приложения / службы для Android.Я хотел бы выяснить, как определяется приоритет процесса.Различия в приоритетах между службами и действиями и если планировщик обрабатывает их приоритет по-разному.По сути, я пытаюсь получить четкое представление о том, насколько вероятно, что активность или служба истощаются мошенническими процессами из другого приложения (или даже ядра Linux).Вы могли бы порекомендовать ... Мои поиски пока не сильно возросли.

Спасибо!

Редактировать: Меня беспокоит не только использование памяти (памятьресурсы хорошо описаны в документации Android.) Еще раз спасибо!

Ответы [ 3 ]

46 голосов
/ 28 октября 2011

В следующем списке представлены различные типы процессов в порядке важности (первый процесс наиболее важен, а последний уничтожается):

  1. Процесс переднего плана
  2. Видимый процесс
  3. Процесс обслуживания
  4. Фоновый процесс
  5. Пустой процесс

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

Отсюда ссылка Процессы и потоки

EDIT:

Понимание приоритета приложения и состояний процесса

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

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

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

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

Активные процессы Активные (на переднем плане) процессы - это те, на которых размещаются приложения с компонентами, в настоящее время взаимодействующими с пользователем. Это процессы, которые Android пытается поддерживать, восстанавливая ресурсы. Обычно таких процессов очень мало, и они будут убиты только в крайнем случае.

enter image description here

Активные процессы включают в себя:

1.Деятельность в «активном» состоянии; то есть они находятся на переднем плане и отвечают на пользовательские события. Подробнее о состояниях активности вы узнаете позже в этой главе.

2.Деятельность, Службы или Приемники вещания, которые в настоящее время выполняют обработчик события onReceive.

3.Услуги, которые выполняют обработчик событий onStart, onCreate или onDestroy.

Видимые процессы Видимые, но неактивные процессы - это те, на которых размещены «видимые» действия. Как следует из названия, видимые действия видимы, но они не находятся на переднем плане и не реагируют на пользовательские события. Это происходит, когда действие только частично скрыто (не полноэкранным или прозрачным действием). Обычно видимых процессов очень мало, и они будут убиты только в экстремальных обстоятельствах, чтобы позволить активным процессам продолжаться.

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

Background Processes Хостинг процессов. Действия, которые не видны и у которых нет запущенных Сервисов, считаются фоновыми процессами. Как правило, будет большое количество фоновых процессов, которые Android будет уничтожать, используя шаблон «видел первым убитым» для получения ресурсов для процессов переднего плана.

Пустые процессы Чтобы повысить общую производительность системы, Android часто сохраняет приложения в памяти после окончания срока их службы. Android поддерживает этот кэш, чтобы сократить время запуска приложений при их повторном запуске. Эти процессы обычно убиваются по мере необходимости.

Для получения дополнительной информации смотрите здесь (я нашел в этом блоге) Управление памятью в Android

EDIT:

I think Android is basic Linux so, whatever scheduler works for Linux is same in Android. 

Разница между планировщиком Android и планировщиком Linux

Планировщик - 5 файлов - Ядро Android также содержит небольшие изменения в планировщике процессов ЦП и алгоритмах учета времени. Мы не знаем историю этих изменений, и влияние не было очевидным, если судить по беглому экзамену.

Выработка процесса:

Как уже упоминалось, операционная система Linux является преимущественной. Когда процесс переходит в состояние TASK_RUNNING, ядро ​​проверяет, является ли его приоритет выше приоритета выполняющегося в данный момент процесса. Если это так, планировщик вызывается, чтобы выбрать новый процесс для запуска (предположительно, процесс, который только что стал работоспособным). Кроме того, когда временной интервал процесса достигает нуля, он прерывается, и для выбора нового процесса вызывается планировщик.

Политика планирования в действии

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

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

35 голосов
/ 09 ноября 2011

Android в этом отношении немного отличается от обычной системы Linux.Android использует две вещи для воздействия на планирование: уровень «хороший» процесса / потока и cgroups.

Уровень «хорошего» процесса влияет на нормальную политику «справедливого» планирования в Linux;потоки, которые имеют более высокую точность, будут запускаться реже, чем потоки с меньшей полезностью.В ситуации, когда у вас есть один поток с приоритетом «по умолчанию» (как определено в Process.THREAD_PRIORITY_DEFAULT), он будет запускаться значительно чаще, чем поток с фоновым приоритетом (или Process.THREAD_PRIORITY_BACKGROUND).

Теоретически это может гарантировать, что фоновая работа / потоки пользовательского интерфейса не окажут значительного влияния на фоновую работу ... однако на практике этого недостаточно.Подумайте, есть ли у вас 10 фоновых потоков, все они хотят работать, но один приоритетный поток управляет пользовательским интерфейсом.Это все еще может привести к заметному влиянию на поведение потока переднего плана.

Для решения этой проблемы Android также использует Linux cgroups простым способом для создания более строгого планирования переднего плана по сравнению с фоновым.Группа переднего плана / по умолчанию позволяет планировать поток как обычно.Фоновая cgroup, тем не менее, применяет ограничение, составляющее всего лишь небольшой процент общего процессорного времени, доступного всем потокам в этой cgroup.Таким образом, если этот процент равен 5%, и у вас есть 10 фоновых потоков, все из которых хотят работать, и один приоритетный поток, то вместе 10 фоновых потоков могут занять не более 5% доступных циклов ЦП от переднего плана.(Конечно, если ни один из потоков переднего плана не хочет запускаться, фоновые потоки могут использовать все доступные циклы ЦП.)

Android неявно перемещает потоки между стандартной и фоновой группами, когда вы используете свои открытые API для установки потокаприоритет.Таким образом, если вы установите приоритет потока на Process.THREAD_PRIORITY_BACKGROUND или выше, вы также поместите поток в фоновую группу.Установите для него значение Process.THREAD_PRIORITY_DEFAULT, и оно будет в cgroup по умолчанию.

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

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

8 голосов
/ 08 ноября 2011

Да, возможно для вашего процесса, который будет голодать.

Android использует Linux 2.6 для управления ресурсами низкого уровня.Linux 2.6 использует многоуровневые очереди обратной связи в качестве алгоритма планирования.Это благоприятствует процессам, связанным с вводом / выводом, и процессам с коротким циклом процессора (идеально подходит для телефонов для быстрого реагирования / взаимодействия).Это, однако, означает, что процессы с интенсивным использованием процессора и процессы с низким приоритетом рискуют стать голодными.Я не уверен, что в Linux 2.6 периодически повышается приоритет ожидающих процессов, поэтому они в конечном итоге будут обслуживаться, что позволит избежать голодания.

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

...