Multitarea en dispositivos móviles

Daniel Eran Dilger escribe en Apple Insider:

Otras plataformas han incluido la multitarea haciendo algo tan sencillo como permitir que se ejecute cualquier número de aplicaciones. Esto les causa una gran complicación a los usuarios porque depende de ellos gestionarlas y determinar qué aplicaciones están desbocándose o consumiendo demasiados recursos mientras están en segundo plano. Android y Windows Mobile son conocidos por necesitar una aplicación como TasKiller para cerrar aplicaciones u otro tipo de gestor manual de procesos para mantener controlado el consumo de batería y el rendimiento.

Creo que tiene razón sobre Windows Mobile, pero ya no importa porque Microsoft ha abandonado Windows Mobile, y parece que Windows Phone 7 será lanzado sin multitarea, y, una vez que la multitarea llegue a estar incluida en Windows Phone, no será de esta forma. Pero Dilger se equivoca por completo sobre Android. Es facilísimo, lo sé, pero creo que merece la pena aclarar este punto. Si queréis entender el panorama móvil actual es esencial comprender que, en términos amplios, lo que Apple ha presentado para iPhone OS 4 es bastante parecido al modelo de multitarea en Android. Tanto en iPhone OS 4 como en Android, los usuarios no tendrían por qué cerrar nunca las aplicaciones de forma manual — cuando el sistema se queda sin memoria, cierra automáticamente las aplicaciones en segundo plano que llevan más tiempo sin usarse para liberar memoria.

Ahora bien, es cierto que existen aplicaciones de gestión de tareas abiertas en el Android Market. Pero no son necesarias. El sistema Android no incluye ninguna de estas aplicaciones y no la necesita. Y tengo muchas sospechas de que al equipo de Android en Google no le gusta que haya este tipo de aplicaciones en el mercado, porque su existencia crea la impresión de que son necesarias o útiles. He pasado unas cuantas semanas usando un Nexus One, y las aplicaciones en segundo plano no ralentizan el sistema y tampoco deben cerrarse de forma manual.

Hay muchas cosas del iPhone que prefiero antes que el Android. La arquitectura multitarea, sin embargo, ha sido una ventaja de Android, y iPhone OS 4, creo yo, pondrá a ambos sistemas operativos al mismo nivel en este sentido. Existen diferencias técnicas, pero son diferencias de poca importancia.

Tanto en Android como en iPhone OS 4, las aplicaciones que no estén ejecutándose en primer plano pueden seguir ejecutándose en segundo plano, aunque de manera limitada. No ocurre como en Mac OS X o Windows, donde las aplicaciones en segundo plano siguen ejecutándose exactamente de igual modo que si estuvieran en primer plano. En iPhone OS 4, las aplicaciones en segundo plano — aquellas con soporte para el “cambio rápido de aplicaciones” en la jerga de Apple — quedan pausadas a efectos prácticos. Siguen estando en la memoria RAM, pero no pueden reclamar una gran parte del tiempo de procesador. Lo que sí pueden hacer es emplear una pequeña serie de APIs del sistema para realizar ciertas tareas — los dos ejemplos hasta la fecha son la reproducción de audio (Pandora) y la conexión constante y recepción de llamadas de voz sobre IP (Skype).

Se puede discutir qué plataforma, Android o iPhone OS 4, tiene el mejor sistema de multitarea. Quizás el sistema de Android siga siendo superior; tengo la intuición de que Android da más libertad a las aplicaciones en segundo plano. Quizás el sistema del iPhone sea mejor; hay varios detalles técnicos que resultan fascinantes, como que los bloques y Grand Central Dispatch están ahora disponibles para tareas simultáneas y en segundo plano (Penséis lo que penséis sobre el modelo de multitarea de iPhone OS 4, no cometáis el error de pensar que es sencillo; estamos frente a tecnología informática de alto nivel1). Al final, imagino que las opiniones sobre las diferencias entre la multitarea de Android y el iPhone se encauzará por el típico debate de si es mejor Android o iPhone — Android ofrece algo más de libertad a los desarrolladores y el iPhone está más controlado y ordenado, e intenta garantizar que el sistema siempre responde de inmediato al usuario.

Pero las diferencias en la multitarea de ambos sistemas tienen que ver con pequeños detalles, no con la imagen de conjunto.

Las nuevas prioridades

La gran diferencia es el salto respecto a los sistemas operativos tradicionales. En los sistemas tradicionales como Mac OS X y Windows, el planteamiento fundamental de los procesos es que, una vez esté en ejecución, seguirá en ese estado hasta que el propio proceso se cierre. En sistemas de sobremesa como Mac y Windows, estos suele querer decir que el usuario le ordena a la aplicación que se cierre. El usuario puede hacer algo como invocar la operación de sistema “Apagar” o “Cerrar sesión”, tras lo cual el sistema enviará un evento de cierre a todas las aplicaciones en ejecución — aunque esto sigue siendo gestionado por el usuario. Es una forma que tiene el usuario de ordenar a todas las aplicaciones que se cierren a la vez. E incluso en este caso, cada aplicación puede hacer lo que quiera antes de cerrarse. Es más bien una sugerencia de que las aplicaciones se cierren. Todos los usuarios de Mac conocen la caja de diálogo que viene a decirnos algo como “Oye, esta aplicación no puede cerrarse de inmediato, tienes documentos abiertos con cambios que aún no han sido guardados”.

En este modelo tradicional, si una aplicación no está preparada para cerrarse, puede negarse a hacerlo. O bien, si necesita efectuar una operación de guardado que durará alrededor de un minuto antes de cerrarse, puede hacerlo. Por supuesto se puede forzar el cierre de las aplicaciones en cualquier sistema operativo de este tipo, pero esto se parece más a hacer que la aplicación se cuelgue. Forzar la salida de una aplicación en el Mac no es lo correcto.

También ocurre que sistemas operativos como Mac OS X, Windows y Linux utilizan memoria de intercambio, o memoria virtual — cuando la memoria RAM física empieza a escasear, el sistema operativo empezará a direccionar bloques de memoria al disco duro. Comparándolas entre sí, la memoria RAM es rápida pero cara; un disco duro es lento paro barato. El sacrificio que se hace con la memoria de intercambio es que se consigue simular que el ordenador tiene más RAM de la que tiene en realidad, pero resulta muchísimo más lento que usar solamente memoria RAM auténtica.

Mac OS X nunca se “quedará sin memoria”. Si uno no deja de abrir aplicaciones y documentos el sistema se ralentizará, usando cada vez más memoria virtual. Al final se ralentizará hasta el punto de no poder utilizarse. Pero no informará de que se está quedando sin memoria. La historia es así: abres una aplicación, ésta se ejecutará y seguirá en ejecución hasta que esté lista para cerrarse, sin importar lo que le pase a la memoria (y a la rapidez de respuesta del sistema).

El nuevo modelo, simbolizado por sistemas móviles como iPhone OS y Android, consiste en que las aplicaciones no son cerradas de forma manual por parte del usuario. El usuario simplemente las abre y el sistema se encarga de gestionarlas a partir de ese momento. Ni siquiera hay que entender el concepto de cerrar una aplicación — de hecho resulta más cómodo no tener que preocuparse de ello. No hay memoria virtual, de modo que, cuando la memoria empieza a agotarse, por algún lado tiene que compensarse. Si la aplicación está ejecutándose en primer plano, es la aplicación activa. Si no está en primer plano, puede seguir ejecutándose de un modo limitado, pero el sistema puede decidir cerrarla en cualquier momento para recuperar la memoria que estaba usando.

El sistema Mac OS original — el de la década de 1980 — tampoco tenía memoria virtual. Cuando se quedaba sin memoria, simplemente no permitía abrir más aplicaciones. Se mostraba una caja de diálogo que decía que no había memoria suficiente para abrir la aplicación, y que el usuario debía cerrar otras aplicaciones en ejecución para liberar parte de la memoria en uso.

La nueva forma de hacer las cosas consiste en reformular el planteamiento fundamental de los procesos. En el modelo antiguo, los procesos que ya han sido puestos en marcha tienen prioridad — una vez están en marcha, siguen ejecutándose. En el modelo nuevo, las intenciones del usuario son las que tienen prioridad. Si pulsas el botón inicio, verás la pantalla de inicio en un momento, sin importar que la aplicación que se estuviera ejecutando en ese momento estuviera lista para cerrarse o no. Si quieres abrir otra aplicación, ésta se abrirá de inmediato, aunque el sistema operativo tenga que cerrar una aplicación en segundo plano para liberar suficiente memoria RAM.

En el iPhone y en Android, las aplicaciones no deciden cuándo cerrarse. Deben estar listas para cerrarse en cualquier momento. En versiones recientes de iPhone OS, las aplicaciones de terceros se cierran cuando el usuario pulsa el botón inicio. El usuario puede pulsar el botón inicio en cualquier momento. El sistema le dice a la aplicación en primer plano: “Vale, se acabó” y la aplicación tiene unos instantes para salvar su estado actual o para eliminarlo. Pero pasados unos momentos, si la aplicación sigue ocupada, mala suerte — el sistema la cierra de todos modos.

E incluso con la “multitarea” en iPhone OS 4, las aplicaciones deben estar listas para cerrarse en cualquier momento. Cuando el sistema se queda sin RAM disponible, empezará a cerrar aplicaciones que se hallen abiertas en segundo plano, y al hacerlo no esperará a que éstas “hagan algo”2. Lo mismo ocurre con Android. Se trata de un cambio fundamental del funcionamiento de los sistemas operativos multitarea. Funciona porque las aplicaciones escritas para estos sistemas se han creado desde el principio para adaptarse a este modelo.

Podría ocurrir que este modelo de multitarea sea provisional — que sea motivado por las cantidades de RAM relativamente limitadas en estos dispositivos. En cierto momento, dentro de no muchos años, todos tendremos iPhones y iPads y dispositivos Android con gigabytes de RAM, en lugar de megabytes, y llegados a ese punto puede que volvamos a un modelo de multitarea más persistente. Pero a corto plazo esto no va a cambiar. Y da igual cuánta memoria RAM tengan los dispositivos futuros, nunca va a ser algo aceptable hacer al usuario esperar cuando quiera abrir una aplicación o cambiar de una a otra.

En el modelo tradicional, la principal prioridad es mantenerlo todo abierto. En este nuevo modelo, la principal prioridad es que el sistema siempre debe estar preparado para responder al usuario. No hay esperas causadas por la memoria virtual o por procesos en segundo plano que consumen demasiado tiempo de procesador.

¿Sabéis lo que le falta a iPhone OS pero que sí tiene Mac OS X? El balón de playa de la muerte.


  1. Cuando Apple introdujo los bloques y Grand Central Dispatch, lo presentaron principalmente como su solución al problema de aprovechar ordenadores que cada vez son “más rápidos” añadiendo más núcleos de procesamiento en lugar de duplicar su frecuencia de reloj cada 18 meses. GCD resulta útil para la programación concurrente en sistemas de un solo núcleo como todos los dispositivos actuales que funcionan con iPhone OS, pero añadir GCD al iPhone OS 4 hace que me pregunte sobre, digamos, una versión multinúcleo del procesador A4 (y sospecho que el kernel del iPhone OS 4 es muy parecido al kernel de Snow Leopard).
  2. De hecho, en iPhone OS 4, creo que las aplicaciones en segundo plano ni siquiera reciben un aviso antes de ser cerradas. Si una aplicación quiere guardar su estado actual, debe hacerlo justo cuando el sistema le informa de que va a pasarse a segundo plano. Una vez que se halle en segundo plano, no recibirá ningún aviso antes de ser cerrada a la fuerza.