una tutorial studio programacion para móviles español desde desarrollo curso crear como cero app aplicaciones android multithreading scheduler dalvik cgroups

tutorial - manual de programacion android pdf



Programación de procesos de Android (3)

Android en este sentido es un poco diferente a un sistema Linux normal. Hay dos cosas que usa Android para afectar la programación: procesar / enhebrar el nivel "bueno" y cgroups.

El nivel de "buen" proceso afecta la política de programación "justa" normal de Linux; los hilos que tienen una bondad más alta se ejecutarán con menos frecuencia que los hilos con una amabilidad más baja. En la situación en la que tiene un subproceso con una prioridad "predeterminada" (como se define en Process.THREAD_PRIORITY_DEFAULT ) se ejecutará significativamente más a menudo que aquellos en una prioridad de fondo (o Process.THREAD_PRIORITY_BACKGROUND ).

En teoría, esto puede garantizar que los hilos de primer plano / UI no se vean afectados significativamente por el trabajo en segundo plano ... sin embargo, en la práctica, no es suficiente. Considere si tiene 10 hilos de fondo que quieran ejecutarse, pero un hilo de primer plano que impulse la IU. Esto aún puede provocar un impacto notable en el comportamiento del subproceso en primer plano.

Para solucionar este problema, Android también utiliza grupos de programas de Linux de una manera sencilla para crear una programación de primer plano y de fondo más estricta. El cgroup en primer plano / predeterminado permite la programación de subprocesos como normal. Sin embargo, el cgroup de fondo aplica un límite de solo un pequeño porcentaje del tiempo total de CPU que está disponible para todos los subprocesos en ese cgroup. Por lo tanto, si ese porcentaje es del 5% y tiene 10 hilos de fondo que quieren ejecutarse y un hilo de primer plano, los 10 hilos de fondo juntos solo pueden tomar como máximo el 5% de los ciclos de CPU disponibles desde el primer plano. (Por supuesto, si no desea ejecutar ningún subproceso en primer plano, los subprocesos de fondo pueden usar todos los ciclos de CPU disponibles).

Android utiliza implícitamente subprocesos entre los grupos de cg por defecto y de fondo cuando usa sus API públicas para establecer la prioridad de subprocesos. Por lo tanto, si establece la prioridad de un subproceso en Process.THREAD_PRIORITY_BACKGROUND o superior, también colocará el subproceso en el grupo de fondo cgroup. Establézcalo en Process.THREAD_PRIORITY_DEFAULT y estará en el grupo predeterminado cgroup.

Debido a esto, siguiendo la convención normal de poner los subprocesos de trabajo en segundo plano en la prioridad de fondo, puede asegurarse de que no interrumpan su subproceso de IU de primer plano.

Además, Android también moverá todos los hilos en un proceso al grupo de fondo para procesos que sabe que no son críticos para el usuario. Cualquier proceso en segundo plano o proceso de servicio tiene sus subprocesos puestos en el grupo de fondo, independientemente de si los subprocesos individuales han solicitado una prioridad de programación de primer plano.

Estoy tratando de obtener una mejor comprensión para poder determinar el impacto de confiabilidad de posibles problemas de interoperabilidad al crear una aplicación / servicio de Android. Me gustaría descubrir cómo se determina la prioridad del proceso. Las diferencias en prioridad entre servicios y actividades y si el planificador trata su prioridad de manera diferente. Básicamente, estoy tratando de obtener una buena comprensión de qué tan probable es que una actividad o servicio se vea privado de procesos deshonestos de una aplicación diferente (o incluso del kernel de Linux).

¿Alguien tiene algún enlace bueno que pueda recomendar ... Mis búsquedas no han aparecido mucho todavía?

¡Gracias!

Editar: Mi preocupación es con respecto a la división / programación del tiempo del procesador, no a los recursos de memoria (los recursos de memoria están bien descritos en la documentación de Android). ¡Gracias de nuevo!


La siguiente lista presenta los diferentes tipos de procesos en orden de importancia (el primer proceso es el más importante y se elimina por última vez):

  1. Proceso de primer plano
  2. Proceso visible
  3. Proceso de servicio
  4. Proceso de fondo
  5. Proceso vacío

Nota: Android clasifica un proceso al nivel más alto posible, según la importancia de los componentes actualmente activos en el proceso. Por ejemplo, si un proceso alberga un servicio y una actividad visible, el proceso se clasifica como un proceso visible, no como un proceso de servicio.

A esto se hace referencia desde aquí Procesos e hilos

EDITAR:

Comprender la prioridad de la aplicación y los estados del proceso

El orden en que se matan los procesos para reclamar recursos está determinado por la prioridad de las aplicaciones alojadas. La prioridad de una aplicación es igual a su componente de mayor prioridad.

Cuando dos aplicaciones tienen la misma prioridad, el proceso que ha estado en una prioridad más baja será eliminado primero. La prioridad del proceso también se ve afectada por las dependencias entre procesos; si una aplicación tiene una dependencia de un Servicio o Proveedor de Contenido suministrado por una segunda aplicación, la aplicación secundaria tendrá al menos una prioridad tan alta como la aplicación que soporta.

Todas las aplicaciones de Android seguirán ejecutándose y en la memoria hasta que el sistema necesite sus recursos para otras aplicaciones.

Es importante estructurar su aplicación correctamente para asegurarse de que su prioridad sea apropiada para el trabajo que está haciendo. Si no lo hace, su aplicación podría ser eliminada mientras se encuentra en medio de algo importante. La siguiente lista detalla cada uno de los estados de aplicación que se muestran en la Figura, que explica cómo el estado lo determinan los componentes de la aplicación que lo componen:

Procesos activos Los procesos activos (en primer plano) son aquellas aplicaciones de alojamiento con componentes que actualmente interactúan con el usuario. Estos son los procesos que Android intenta seguir respondiendo al recuperar recursos. En general, hay muy pocos de estos procesos, y se eliminarán solo como último recurso.

Los procesos activos incluyen:

1. Actividades en un estado "activo"; es decir, están en primer plano y responden a los eventos del usuario. Explorará los estados de actividad con mayor detalle más adelante en este capítulo.

2.Actividades, Servicios o Receptores de difusión que actualmente están ejecutando un controlador de eventos onReceive.

3.Servicios que están ejecutando un controlador de eventos onStart, onCreate o onDestroy.

Procesos Visibles Visibles, pero los procesos inactivos son aquellos que alojan Actividades "visibles". Como su nombre lo sugiere, las Actividades visibles son visibles, pero no están en primer plano ni responden a los eventos del usuario. Esto ocurre cuando una Actividad está parcialmente oscurecida (por una actividad no de pantalla completa o transparente). En general, hay muy pocos procesos visibles, y solo se eliminarán en circunstancias extremas para permitir que los procesos activos continúen.

Procesos de servicio iniciados Procesos de hosting Servicios que se han iniciado. Los servicios admiten el procesamiento continuo que debe continuar sin una interfaz visible. Debido a que los Servicios no interactúan directamente con el usuario, reciben una prioridad ligeramente menor que las Actividades visibles. Todavía se consideran procesos en primer plano y no serán eliminados a menos que se necesiten recursos para procesos activos o visibles.

Procesos en segundo plano Procesamiento de hosting Las actividades que no son visibles y que no tienen ningún Servicio que se haya iniciado se consideran procesos en segundo plano. En general, habrá una gran cantidad de procesos en segundo plano que Android matará utilizando un patrón visto por última vez para obtener recursos para los procesos en primer plano.

Procesos vacíos Para mejorar el rendimiento general del sistema, Android a menudo retiene las aplicaciones en la memoria una vez que han alcanzado el final de sus vidas. Android mantiene este caché para mejorar el tiempo de inicio de las aplicaciones cuando se vuelven a lanzar. Estos procesos se eliminan rutinariamente según sea necesario.

Para más información mira aquí (encontré en este blog) Administración de memoria en Android

EDITAR:

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

La diferencia entre el programador de Android y el programador de Linux

Programador - 5 archivos - El kernel de Android también contiene pequeños cambios en el programador del proceso de la CPU y en los algoritmos de mantenimiento del tiempo. No conocemos el historial de estos cambios, y el impacto no fue evidente en base a un examen superficial.

Preemption del proceso:

Como se mencionó, el sistema operativo Linux es preventivo. Cuando un proceso ingresa al estado TASK_RUNNING, el kernel verifica si su prioridad es mayor que la prioridad del proceso que se está ejecutando actualmente. Si es así, se invoca el planificador para elegir un nuevo proceso para ejecutar (presumiblemente el proceso que acaba de ser ejecutable). Además, cuando el intervalo de tiempo de un proceso llega a cero, se reemplaza y el planificador se invoca para seleccionar un nuevo proceso.

La política de programación en acción

Considere un sistema con dos tareas ejecutables: un editor de texto y un codificador de video. El editor de texto está vinculado a E / S porque invierte casi todo el tiempo esperando que se presionen las teclas del usuario (no importa qué tan rápido el usuario escriba, no es tan rápido). A pesar de esto, cuando recibe una pulsación de tecla, el usuario espera que el editor responda de inmediato. Por el contrario, el codificador de video está vinculado al procesador. Además de leer el flujo de datos en bruto desde el disco y luego escribir el video resultante, el codificador pasa todo el tiempo aplicando el códec de video a los datos brutos. No tiene restricciones de tiempo fuertes para cuando se ejecuta; si comenzó a ejecutarse ahora o en medio segundo, el usuario no podría decirlo. Por supuesto, cuanto antes termine, mejor.

En este sistema, el programador da al editor de texto una prioridad más alta y un lapso de tiempo más grande que el codificador de video, porque el editor de texto es interactivo. El editor de texto tiene mucho espacio de tiempo disponible. Además, dado que el editor de texto tiene una prioridad más alta, es capaz de adelantar el codificador de video cuando sea necesario. Esto garantiza que el editor de texto pueda responder a las pulsaciones de teclas del usuario de inmediato. Esto va en detrimento del codificador de video, pero debido a que el editor de texto se ejecuta solo de manera intermitente, el codificador de video puede monopolizar el tiempo restante. Esto optimiza el rendimiento de ambas aplicaciones.


Sí, es posible que su proceso se muera de hambre.

Android usa Linux 2.6 para su gestión de recursos de bajo nivel. Linux 2.6 usa colas de retroalimentación de múltiples niveles como su algoritmo de programación. Esto favorece los procesos vinculados de E / S y los procesos de ráfaga corta de la CPU (ideal para teléfonos con capacidad de respuesta / interacción). Sin embargo, esto significa que los procesos intensivos de CPU y los procesos de baja prioridad corren el riesgo de morir de hambre. No estoy seguro de si Linux 2.6 periódicamente aumenta la prioridad de los procesos de espera para que eventualmente sirvan evitando la inanición.

Sin embargo, de forma realista, no deberías preocuparte por esto, ya que serás la actividad activa o serás un servicio, ambos tienen prioridades relativamente altas como lo muestra la respuesta anterior.