Planificación de Procesadores en Windows, Linux, iOS y Android

Mauricio Javier Flores, Karen Danelia Sierra, Dilcia Yessenia Sánchez y Marvin Yovany Cortez
20131001416 mfloresirias@gmail.com
20131002909 karendanelia2@yahoo.com
2012107960sdilcia_2010@yahoo.es
 20031009370 mayoco84@gmail.com

Resumen
La Planificación de procesadores en Windows Microsoft comenzó a mediados de 1988 con el desarrollo del sistema operativo Windows NT15.
Por lo general en el sistema operativo Windows se utiliza una política de planificación: Round Robin (turno rotatorio). La desventaja principal que presenta es que hace un cambio de procesos en ejecución con demasiada frecuencia. Lo que hace suponer una pequeña pérdida de tiempo.
En ser un sistema multiproceso se basa Linux, en el cual la planificación puede ser en tiempo real y en no tiempo real para las versiones de la 2.4 y anteriores. La planificación en tiempo real se puede definir en tres clases: sched_fifo, sched_rr, sched_other. En cuanto a la versión 2.6 esta comprende básicamente la misma capacidad de planificación de tiempo real que las versiones anteriores y un planificador modificado para procesos no de tiempo real, el cual es más complejo en interés de la escalabilidad con el número de procesos y procesadores.
La aplicación de Android se conoce lo que es la planificación de procesadores se compone o se hace en el núcleo o también llamado kernel de Linux para lograr la determinación de las políticas de planificación de procesos. Y políticas de planificación de alta y baja prioridad, los estados del proceso y comunicación entre procesos.


Abstract. Processor Planning in Windows Microsoft began in mid-1988 with the development of the Windows NT15 operating system.
Usually in the Windows operating system a planning policy is used: Round Robin. The main disadvantage it presents is that it makes a change of processes running too often. Which makes it a small waste of time.
In being a multi-process system is based Linux, in which the planning can be real-time and non-real time for versions of 2.4 and earlier. Real-time scheduling can be defined in three classes: sched_fifo, sched_rr, sched_other. As for version 2.6 this basically comprises the same real-time scheduling capability as previous versions and a modified scheduler for non-real-time processes, which is more complex in the interests of scalability with the number of processes and processors.
The Android application is known what is the planning of processors is composed or done in the kernel or also called Linux kernel to achieve the determination of process planning policies. And high and low priority planning policies, process states and interprocess communication.


Palabras Claves. Planificación, procesos, Multiprogramación, Proceso, planificador, estado, procesador, tiempo, kernel, Libdus, wrappers, frameworks, Android, GPS.




Planificación de procesos en Windows

Principales características:
1.       Que está Basado en las prioridades.
2.       Una Planificación apropiativa.
3.       Una Planificación con la afinidad de procesador.

Planificación por hilos y no por procesos.

Un hilo puede perder el procesador si
hay otro más prioritario que esté listo.

Decisiones de planificación:
Los Hilos nuevos --> en estado “Listo”.
Los Hilos bloqueados que reciben evento --> en estado “Listo”.
Hilo deja del procesador si termina cuanto, finaliza o pasa a bloqueado.

La Planificación de procesadores en Windows Microsoft comenzó a mediados de 1988 con el desarrollo del sistema operativo Windows NT15, dedicado a ciertas estaciones de el trabajo y a servidores con un tamaño medio y pequeño.
A partir del ano 1994 se comercializaron sucesivas versiones (3.51, 4.0, XP, 2000, Vista). Este Se trata de uno de los sistemas operativos que podríamos llegar a considerar moderno en virtud con su estructura modular cliente-servidor (aunque no cuenta con un micronúcleo) y también de su orientación hacia soportes del hardware distribuido. Uno de los objetivos importantes fue el diseño de la transpirabilidad, que se logra a través de una interfaz de abstracción del hardware (HAL), existen implementaciones para diferentes arquitecturas, como ser Alpha, 80x86 de Intel, Digital y MIPS.
Se puede observar que Windows NT planifica threads, pero por prioridades, siguiendo un esquema muy parecido al que usa UNIX. Este Cuenta con 32 niveles de prioridad divididos en solo dos clases. Los dieciséis niveles superiores, de prioridades estáticas, constituyen la clase de tiempo real. Los dieciséis niveles inferiores (clase variable), que es donde se ubican los threads de usuario, son de un tiempo compartido y estos se gestionan con una disciplina FCFS (primero en entrar, primero en salir). Un thread de usuario perteneciente a un proceso A parte con una prioridad de base inicial que puede estar en el rango [prio(A) ‒2, prio(A)+2]. La prioridad del thread actúa de forma dinámica durante toda la ejecución en un rango [prio(A)‒2, 15], aumentando cuando el thread se bloquea y disminuyendo cuando el thread es expulsado por fin del quantum.
Con un multiprocesador que cuenta con N procesadores, la planificación de threads en Windows 2000 se basa en estos dos criterios: (1) la afinidad al procesador, y (2) asignar N‒1 procesadores a los N‒1 threads que son más prioritarios y el restante a todos los demás.
Por lo general en el sistema operativo Windows se utiliza una política de planificación: Round Robin (turno rotatorio). La desventaja principal que presenta es que hace un cambio de procesos en ejecución con demasiada frecuencia. Lo que hace suponer una pequeña pérdida de tiempo.


Además, que Las prioridades en W2K se organizan en dos bandas o clases: el tiempo real y el tiempo variable. Cada una de estas bandas consta de dieciséis niveles de prioridad. Los hilos que son los que requieren atención inmediata están en la clase de tiempo real, que incluye funciones como tareas de tiempo real.  En esencia, puesto que W2K utiliza el planificador preferente con prioridades, los hilos que están con prioridades de tiempo real tienen preferencia sobre los otros hilos.
En un monoprocesador, cuando esta un hilo cuya prioridad es mayor que la del que se ejecuta en ese momento pasa a estar en estado Listo, el hilo de menor prioridad es expulsado y se le asigna el procesador al de mayor prioridad. En la clase de prioridad de tiempo real, todos los hilos tienen una prioridad fija que no cambia nunca. Se cuenta con una cola FIFO en cada nivel de prioridad, pero también un proceso puede emigrar a una de las otras colas dentro de la clase de prioridad variable. Sin embargo, un hilo de prioridad no puede promocionarse a ningún otro nivel de la clase de tiempo real.

Planificación de procesadores en Linux

En un sistema multiproceso se basa Linux. Los procesos son tareas independientes, es decir que que cada una realiza sus propias responsabilidades por sí sola. Si llega a suceder que un proceso tenga un problema y se detiene esto no hará que otros procesos en el sistema fallen también. Cada proceso se ejecuta en su propio espacio de dirección virtual y no puede haber intercambio o interacción con otros procesos excepto por medio de mecanismos gestionados por el núcleo.
En el tiempo de vida de un proceso, éste hará utilizará de muchos recursos del sistema. Linux debe llevar recuento del proceso y de los recursos de sistema que está usando de forma que pueda gestionar este y otros procesos. Ya que no sería correcto para los otros procesos del sistema que un proceso acapare la mayoría de la memoria física o las CPUs.
La finalidad de Linux al ser un sistema multiproceso es tener un proceso ejecutándose en cada CPU del sistema en todo momento, para incrementar el uso de la CPU. Normalmente hay más procesos que CPU entonces el resto de los procesos tiene que esperar a que una CPU quede libre para que ellos puedan ejecutarse. Se mantienen muchos procesos en memoria al mismo tiempo en un sistema multiproceso. En el que caso que un proceso tiene que esperar, el sistema operativo se encarga de quitar la CPU a ese proceso y se la da a otro proceso que se lo merite más. El planificador se encarga de elegir el proceso más adecuado para ejecutar a continuación. Linux usa varias estrategias de organización del tiempo de la CPU para asegurar una distribución equitativa.
En las anteriores versiones a la 2.4 y ella misma de Linux podía utilizar planificación en tiempo real y también planificador para procesos en no tiempo real. En la planificación en tiempo real hay tres tipos: SCHED_FIFO: En la cual son hilos de tiempo real planificados primero en entrar primero en salir, SCHED_RR: hilos con tiempo real planificados, pero con turno rotatorio. SCHED_OTHER: hace referencia a los hilos no tiempo real.
Hasta la versión 2.6, el algoritmo de planificación era relativamente sencillo y consistía en elegir el proceso al que le quedaba más cantidad de quantum por gastar, recompensando así los procesos interactivos. El planificador actual es mucho más complejo en interés de la escalabilidad con el número de procesos y de procesadores.

El diseño del planificador es crítico, ya que dos de las partes más complicadas de un kernel son el subsistema de memoria y el planificador porque estas dos piezas intervienen en el diseño y afectan al comportamiento de casi todos los demás elementos del kernel y del sistema operativo. Esta es también la razón por la que se quiere que estas dos piezas tengan un funcionamiento completamente correcto y un comportamiento perfecto.






El planificador de Linux busca lograr varios objetivos:
·         Ecuanimidad: El planificador debería distribuir la CPU entre todos los procesos de manera imparcial. En el nuevo kernel se ha trabajado para garantizar un reparto equitativo del tiempo de CPU entre los procesos.
·         Volumen de producción y eficiencia: El planificador debería intentar incrementar tanto el volumen de producción como la eficiencia. La manera usual de incrementar la utilización de la CPU es aumentar el nivel de multiprogramación.
·         Mínima Sobrecarga: Un planificador debería estar en ejecución el menor tiempo posible.
·         Hacer cumplir una planificación basada en prioridades: O sea que algunos procesos tienen prioridad sobre otros. Linux respeta las prioridades.
·         Tiempo de espera: Es la suma del tiempo de servicio y el tiempo de
espera en la cola de ejecución. El planificador intenta aminorar ambos.
·         Tiempo de respuesta y variabilidad: El tiempo de respuesta de un programa debería ser
lo menor posible.
Es necesario saber cómo el planificador asigna el tiempo de CPU y administra la ejecución de los programas, así mismo comprender el significado de proceso. Un proceso es un conjunto de instrucciones que el procesador ejecuta secuencialmente. Uno o más procesos pueden componer un programa.
Hay dos tipos de procesos en Linux, normales y de tiempo real. Los procesos de tiempo real tienen una prioridad más alta que los otros. Así que, si hay un proceso de tiempo real listo para ejecutarse, siempre se ejecutará primero. Pueden tener dos tipos de políticas los procesos de tiempo real: round robin (en círculo) en esta política cada proceso se ejecuta por turnos y en la otra que es first in first out (el primero en llegar es el primero en salir). Cada proceso se ejecuta en el orden que está en la cola de ejecución y el orden no se cambia nunca.
Para que Linux pueda gestionar los procesos en el sistema, cada proceso se representa por una estructura de datos task_struct. El vector task es una lista de punteros a estructuras task_struct en el sistema. Significa que el mayor número de procesos en el sistema está limitado por el tamaño del vector task; por defecto tiene 512 entradas.
Los procesos pueden tener uno de cinco estados:
·         En ejecución: Está siendo ejecutado por el procesador o guardado en memoria esperando ser ejecutado.
·         Interrumpible: En el momento está esperando algún suceso, sucede cuando un proceso cede el control de la CPU hasta que se cumpla alguna condición.
·         No interrumpible: Es cuando el proceso depende directamente de sucesos del hardware no se pueden interrumpir en ningún caso.
·         Zombi: Cuando ya ha terminado pero cuya estructura task_struct permanece aún en el vector task. Se suele mantener para que el padre pueda extraer información útil de él.
·         Detenido: Usualmente ocurre porque ha recibido una señal. Por ejemplo, si se están eliminando errores en un proceso, puede estar detenido.

El planificador de Linux 2.6

El planificador mantiene una lista de los niveles de prioridad. Usa un algoritmo eficiente para beneficiar a los procesos de alta prioridad, a la vez que permite ejecutarse a los procesos de baja prioridad. Cuando llega el momento de seleccionar un proceso, el planificador busca el nivel de prioridad más alto que contenga procesos disponibles. Luego selecciona un proceso del nivel de prioridad deseado. Puesto que el número de niveles de prioridad es fijo, el planificador siempre tarda una cantidad constante de tiempo. 

Otra capacidad considerable que tiene el planificador es la expropiación. Lo que permite esto es que un proceso pueda ser detenido en cualquier momento, posibilitando que un proceso de mayor prioridad pueda ser iniciado. Es muy importante desde el punto de vista del usuario, ya que permite que los procesos que interactúan con el usuario sean ejecutados cuando sea necesario. Los beneficios de la expropiación son tan grandes que los desarrolladores del kernel decidieron hacer que el kernel mismo sea  expropiable. Esto le permite al sistema tener mejores tiempos de respuesta a las peticiones del usuario. El kernel 2.6 es capaz de administrar eficientemente sus propias tareas además de los procesos de usuario.

El planificador asigna una cantidad de tiempo a un proceso y esta es llamada una "porción de tiempo". Después de que la porción de tiempo de un proceso ha sido utilizada, el proceso es detenido para que pueda ejecutarse el siguiente. Es importante recordar que un proceso puede ser detenido en medio de su porción de tiempo siendo este es el propósito de la "expropiación".                  
Cuando el planificador calcula porciones de tiempo debe lograr un balance apropiado entre caudal y latencia. Caudal se refiere a la cantidad de datos que pueden ser transferidos desde una ubicación hacia otra. Y Latencia es el tiempo que le toma a un proceso responder a una entrada. Y obteniendo un buen balance entre caudal y latencia llevan a un efecto de respuesta rápida para el usuario con el suficiente caudal.

Planificación de procesadores para Android

Este sistema Android se compone o se hace en el núcleo o también llamado kernel de Linux para lograr la determinación de las políticas de planificación de procesos. Algunos son procesos nativos pero muchos serán los procesos que se ejecutan en una máquina virtual de java en la mayoría de los casos una aplicación Android se ejecuta en su propio proceso de Linux este proceso ha sido creado para la aplicación cuando se ejecuta al inicio y seguirá ejecutándose hasta que no sea necesario y el sistema proceda a buscarlos recursos para otras aplicaciones y se los de a estas.
Android como todos sistemas operativos tiene inconvenientes como ser el gasto de batería que es muy alto y cuando se tienen demasiadas aplicaciones el sistema se vuelve lento en algunas ocasiones las aplicaciones deben tener un hilo en segundo plano la aplicación de Gmail por ejemplo lo que es google maps o cualquier tipo de juego de su preferencia
Políticas de planificación en Android
Políticas Normales: prioridad más baja
-          Sched_other: estándar desarrollado de operación por turnos en tiempo compartido de las políticas
-          Sched_batch: se usa para ejecutar ‘lotes’ igual al de los procesos
-          Sched_iddle: se usa para la ejecución de los trabajos de muy baja prioridad en segundo plano




Políticas en tiempo real
Algunos de estos procesos pueden ser de una prioridad que se inicia de 19 a 20(en escala de bajo a alta prioridad)
-          Sched_fifo: por colas el primero que entra es el primero que sale
-          Sched_RR: una política de turno rotatorio conocido también como round robin.

Estado de un proceso en Android
Android le asigna una prioridad a cada proceso con la siguiente jerarquía:
•      Procesos de primer plano (Active process): Es la aplicación que contiene una actividad ejecutada en el primer plano en la pantalla del usuario y con la cual está intercambiando ahora mismo (se ha llamado a su método onResumen ()), a este  procesos le será borrado como último recurso si el sistema recurre por más memoria

•      Procesos visibles (visible process): este proceso  aloja una actividad que en primer plano no se está ejecutando  (en otras palabras su método es onPause () ha sido llamado). Ese tipo de proceso no será eliminado solamente que la memoria se necesite para mantener a los procesos del primer plano en ejecución.

•      Procesos de servicio (stored service process): son aquellos que corren cuando un service ha sido invocado. (Se ha llamado a su método startService ()). Los procesos no se encuentran a la vista se determinan en segundo plano que normalmente son de ayuda e importancia para quien lo usa (conectarse con servidores, actualización del GPS, reproductor de música, etc.)

•      Proceso en segundo plano (Background process): Es un proceso que contiene una actividad denominada activity que en estos momentos no es visible por el usuario (método onStop () ha sido llamado) y que ya no tienen demasiada importancia por ejemplo los programas que inicia el usuario con el arranque hace tiempo y no los ha vuelto a usar pasan a estar en background.

•      Procesos vacíos (Empty process): Es el proceso que no guarda tipos de componentes. Su razón de ser es el de tener una cache disponible para la próxima aplicación que lance el usuario es común que el sistema elimine este tipo de procesos con frecuencia para así poder obtener memoria disponible.
Comunicación entre procesos
•              A través de variables de entorno solo es posible de padres a hijos
•              Mediante señales: solo indica que algo ha ocurrido y solo lleva como información de un número de señal
•              Mediante procesos de entrada/salida: Es la forma más segura a un determinado nivel de Shell
•              Mediante técnicas IPC: Semáforos, memoria compartida, colas de mensajes.
•              Remote procedure call (llamada a procedimiento remoto): Es un protocolo que permite a un programa de ordenador ejecutar código en otra máquina remota sin la preocupación por las distintas comunicaciones entre ambos.
•              D-Bus: Es el mecanismo de comunicación entre procesos (IPC) consistente en tres



capas:

i)             Biblioteca, libdus permite a dos aplicaciones conectarse e intercambiar mensajes.
ii)            Un demonio ejecutable que funciona como bus de mensajes, construido sobre libdus al cual pueden conectarse varias aplicaciones
iii)           Bibliotecas adaptadas (Wrappers) para su uso en frameworks concretos



Gobernadores en android

Es quien dicta cuando el procesador debe trabajar más rápido o cuando entra en reposo, esto ayuda a mejorar la duración de la batería y también alarga la vida útil del móvil.














Conclusiones:
windows
Se puede observar que Windows NT planifica threads, pero por prioridades, siguiendo un esquema muy parecido al que usa UNIX. Este Cuenta con 32 niveles de prioridad divididos en solo dos clases. Los dieciséis niveles superiores, de prioridades estáticas, constituyen la clase de tiempo real. Los dieciséis niveles inferiores (clase variable), que es donde se ubican los threads de usuario, son de un tiempo compartido y estos se gestionan con una disciplina FCFS




Linux
La planificación en Linux está siendo mejorada en sus versiones ya que de la 2.6 se logro hacer un cambio en el planificador para procesos de no tiempo real ya que en la versión 2.4 no escalaba bien con un número mayor de procesadores al igual que un número mayor de procesadores y ese planificador es llamado planificador (O)1, en el cual se rediseño para que le tiempo fuera el mismo a la hora de seleccionar el proceso y asignarlo a un procesador, sin que se tome en cuenta el numero de procesadores.
Android
La planificación para Android es de vital importancia ya que haciendo uso adecuado de los procesos en  las aplicaciones permite resolver los problemas generados por el uso de almacenamiento de aplicaciones, las políticas de tiempo real, nos permite ver los estados de procesos activos y de los planos subsiguientes y donde se resuelve la comunicación entre procesos.


Agradecimientos
Agradezco a Roger Patiño por su información sobre la planificación de procesadores en Android

Referencias
(Planificación, 2014) (Planificadores de sistemas operativos existentes, 2016)
(Williams, 2005)
(Espacio Linux)

(Pérez)

(Elaguizy & Battin)
(Patiño, 2015)



Comentarios

Entradas populares de este blog