Gestión de procesos y memoria en iOS

Gestión de procesos y memoria en iOS

El sistema operativo iOS es un sistema operativo para móviles desarrollado por Apple.inc. para su propio hardware. El funcionamiento de éste está basado principalmente en el sistema operativo Darwin ya que estos comparten el mismo núcleo (o kernel): XNU.

Un poco de Darwin...

Darwin es un sistema operativo Unix de código abierto también desarrollado por Apple que está compuesto tanto por código desarrollado por Apple como código proveniente de BSD, Mach, NeXTSTEP y otros proyectos de código abierto. Sobre este se basan los sistemas operativos macOS, iOS, watchOS y tvOS.

Y también de XNU...

También desarrollado por Apple, XNU fue creado para ser el núcleo de sus sistemas operativos, éste es el núcleo de todos los sistemas operativos anteriormente mencionados y sus siglas significan "X is Not Unix".

¿iOS vs Mac OS X?


Como podemos ver, todos los sistemas operativos desarrollados por Apple se basan sobre Darwin y tienen como núcleo XNU por lo que su gestión de procesos y memoria es muy parecido. Por este motivo la mayoría de información expuesta en esta entrada proviene del libro "Mac OS X Internals: A System Approach" del autor Amit Singh; en éste se encuentra información más detallada sobre estos temas.

Gestión de procesos

Si bien la gestión de procesos en un sistema operativo es un tema tan extenso como quiera mostrarse, en esta entrada nos centraremos en cómo XNU provoca una ilusión de ejecución concurrente por medio de la planificación en la ejecución de procesos listos para correr.

Concurrencia: iOS como cualquier sistema operativo actual debe soportar procesos concurrentes y sabemos que gestionar la concurrencia de procesos requiere dar solución al problema de la sección crítica, que es la porción de código de un programa de ordenador en la que se accede a un recurso compartido que no debe ser accedido por más de un proceso o hilo en ejecución.
XNU soluciona este problema por medio del sistema de escritura, envío y lectura de mensajes de mach en sus hilos de ejecución.
Los dispositivos que utilizan iOS tienen en su mayoría procesadores de dos núcleos por lo que además de gestionar la multiprogramación (concurrencia de procesos en un solo núcleo), deben también soportar el multiprocesamiento (concurrencia de procesos en varios núcleos); así, usa un sistema llamado multiprocesamiento simétrico (SMP) en el que varios núcleos son manejados por un solo kernel, que es XNU en este caso, con este sistema todos los procesadores pueden acceder al mismo espacio en memoria, y cualquier hilo de ejecución puede estarse ejecutando en cualquiera de los núcleos, básicamente todos los núcleos son iguales para la mayoría de propósitos y de ahí el nombre "simétrico".





PlanificaciónEl kernel de Mac OS X sólo reconoce un tipo de hilo y es el “Mach thread”, una estructura propia del sistema operativo, y contiene la información de prioridad de planificación, su política de planificación (diferentes políticas son aplicadas dependiendo de la carga de trabajo entregada) y la información de uso de CPU. Toda esta información permite al planificador dar un tiempo de ejecución a cada proceso llamado "cuanto" y al terminar cada cuanto, el proceso puede ser reemplazado si un proceso de igual o mayor prioridad requiere ser ejecutado.




Cada proceso posee una prioridad base y una prioridad planificada que es calculada a partir de la prioridad base y una compensación según el uso reciente de la CPU por parte del proceso. Mientras un proceso más haya usado el procesador, menos prioridad tendrá, pero esto podría generar inanición en caso de que un proceso haya usado mucho tiempo la CPU, por este motivo se toma en cuenta solo el tiempo "reciente", lo que va aumentando gradualmente la prioridad de los procesos no usados.
Otra posibilidad para que un proceso quede en inanición es que su prioridad base sea tan baja que nunca pueda ser ejecutado, para estos casos, el kernel realiza un proceso propio "thread_update_scan()" y aumenta la prioridad de los procesos que puedan quedar en inanición cada cierto tiempo.

Gestión de memoria


Memoria virtual:

Como ya sabemos el kernel de Mac OSX se encuentra basado en mach, el cual combina la memoria virtual paginada de accent y la comunicación entre procesos (IPC)  lo que permite grandes transferencias de datos a través del mapeo de memoria copy on write (COW).

COW: es una técnica de gestión de recursos utilizada en la programación informática para implementar de manera eficiente una operación de "duplicado" o "copia" en recursos modificables.


A partir de accent, mach también se basó para proporcionar la abstracción de un objeto en memoria, que representa un repositorio de datos y se encuentra con un almacén de respaldo en el disco duro.



El diseño de VM de Mach tiene los siguientes aspectos dignos de mención:

1) Una separación limpia entre partes dependientes de la máquina e independientes de la máquina. Solo la última parte tiene información completa relacionada con VM.
2)Espacios de direcciones virtuales amplios y dispersos para cada tarea, y totalmente compartidos por todos los hilos dentro de esa tarea o proceso.
3) Integración de la gestión de la memoria y la comunicación entre procesos. Mach proporciona basado en IPC interfaces para trabajar con espacios de direcciones de tareas. Estas interfaces son especialmente flexibles al permitir una tarea para manipular el espacio de direcciones de otro.
4)Operaciones optimizadas de copia virtual a través de copy-on-write simétrico o asimétrico (COW).





Paginación.

Mach divide un espacio de direcciones de memoria en páginas, con las páginas siendo usualmente del mismo tamaño que las que dicta la arquitectura de la CPU (páginas residentes o marcos). Aún así tiene la posibilidad de crear páginas más grandes que las nativas del hardware y en este caso se usan varios marcos de memoria.
Cada programa se divide entonces en páginas, y dependiendo del patrón de uso de memoria de cada programa y algunos otros factores, puede que ninguna, algunas o incluso todas las páginas del mismo estén guardadas en memoria principal a través de páginas residentes.

El kernel mantiene una tabla hash de las páginas residentes para realizar su búsqueda, y se encarga de hacer puente entre la página residente y la página encontrada en memoria virtual.


Distribución de las páginas residentes:


Existen tres colas que comprenden las páginas residentes o marcos:
  • La cola de libres: contiene marcos libres disponibles para su asignación inmediata
  • La cola de inactivos: contiene marcos que el kernel puede desalojar fácilmente en caso de necesitarlo
  • La cola de activos: estos pasan a la cola de inactivos antes de ser desalojados



Reemplazo de páginas:


El kernel usa una política de reemplazo de páginas denominada FIFO con segunda chance, que se asemeja a un comportamiento LRU. Se implementa por medio de una cola FIFO (cola de activas) , si una pagina inactiva es referenciada vuelve a la cola de activas y se le puede dar una segunda chance a una página en la cola de inactivas, evitando que pase a libres, dependiendo de su frecuencia de referenciación.



Fallos de página:
Cuando una página referenciada no está entre las páginas residentes, se presenta un fallo de memoria. Ahí pueden ocurrir dos casos, que se presente un fallo de memoria denominado "suave" cuando la página se encuentra en cache, o un fallo de memoria "duro" cuando definitivamente se debe de acudir a memoria virtual para cargar el proceso.

Referencias:

  •  Addison. (2006). Mac OS X Internals: A Systems Approach. Disponible en: http://venom630.free.fr/pdf/OSXInternals.pdf
  • https://developer.apple.com/library/content/documentation/Darwin/Conceptual/KernelProgramming/Architecture/Architecture.html
  • https://www.freebsd.org/doc/en/books/design-44bsd/overview-process-management.html





Comentarios