Multitarea - Conceptos básicos


Conceptos básicos

Se refiere a la capacidad de un sistema operativo de ejecutar múltiples procesos, también llamados tareas, dándole al usuario o los usuarios la impresión de que son ejecutados simultáneamente y sin interferir los unos con los otros.

Cada tarea al ejecutarse, es como si fuera la única dentro del sistema que se está ejecutando y con acceso a todos los recursos y servicios que nos brinda el sistema operativo.

Los procesos que se ejecutan de forma concurrente (al mismo tiempo) pueden representar:

  • Programas diferentes
  • Partes diferentes de un mismo programa
  • Diferentes instancias de un mismo programa (cada instancia es una copia en ejecución del mismo programa)

El número tal de tareas o procesos que pueden ejecutarse en un sistema depende de varios factores entre los que se incluyen:

  • El tamaño de la memoria
  • La velocidad del procesador central (CPU)
  • El tamaño de los programas
  • La tecnología del procesador para soportar la multitarea

Una característica importante del sistema operativo para poder soportar la multitarea es que cada proceso esté protegido del resto de los procesos.

Protegido quiere decir que se ejecuta en un espacio físico y lógico que garantiza su ejecución y que no es alcanzado accidentalmente por ningún otro proceso, no quiere decir aislado completamente (existen formas de comunicar un proceso con otro si es necesario).

Esta protección de procesos realizada a nivel de kernel (núcleo de ejecución del sistema operativo), permite que cuando un proceso se detiene por alguna razón (halt o crash) el resto de los procesos y el propio sistema operativo continúan normalmente con su ejecución.

El procesador (o procesadores) son demandados continuamente en el sistema operativo por numerosos procesos que compiten por sus servicios. Pero como el procesador solo puede ejecutar un proceso al mismo tiempo, la multitarea es acompañada de una técnica de ranuras de tiempo (time slices) que permiten alternar el uso del procesador entre varios procesos a una alta velocidad.


Desde el punto de vista de la ejecución de tareas, los sistemas operativos se dividen en dos grandes grupos:

  • Monotarea: solo ejecutan una tarea al mismo tiempo, por ejemplo el MS-DOS
  • Multitarea: pueden ejecutar simultáneamente múltiples tareas. Aquí se incluyen prácticamente todos los sistemas operativos modernos como Windows XP/7, Mac OSX o UNIX/Linux

En los sistemas operativos monotarea, el CPU permanece ocioso (idle) hasta que el recurso que demanda el programa está disponible (un disco o una impresora por ejemplo). Esta espera es una pérdida de tiempo de proceso y de eficiencia del sistema.

En un sistema multitarea, múltiples procesos se mantienen en la memoria, permitiendo al sistema operativo cambiar a otro proceso mientras el sistema actual tiene que esperar por los periféricos de entrada / salida para completar una tarea.

La multitarea puede realizarse de dos maneras diferentes:

  • Cooperativa (cooperative multitasking)
  • Preventiva o preferente (Preemptive multitasking)

En el caso de la multitarea cooperativa, las tareas ceden voluntariamente el control a otras tareas para que estas se puedan ejecutar. Sin embargo, si una tarea se excede en tiempo por algún fallo, el resto de las tareas pueden quedarse sin tiempo de ejecución y provocar una paralización total del sistema que puede llegar incluso a su caída. Ejemplo de sistemas operativos con multitarea cooperativa son el Windows 3.X o el Mac OS versión 8.0.

En la multitarea preventiva, las tareas delegan en el sistema operativo el tiempo de ejecución disponible para cada una de ellas. Así si una tarea se queda bloqueada o se detiene por alguna razón, el sistema operativo le quita el control asignando tiempo de ejecución al resto de las tareas y evitando que el sistema en su conjunto pueda quedarse bloqueado o se caiga fácilmente.

También es necesario distinguir entre multitarea y multiprocesamiento. La multitarea se refiere a la habilidad de ejecutar varias tareas al mismo tiempo. El multiprocesamiento es una capacidad del sistema operativo de utilizar más de un procesador al mismo tiempo, si el hardware lo permite.

Típicamente, si hay disponibles múltiples procesadores, las tareas pueden ser divididas entre ellos. En tal caso, las tareas pueden ejecutarse simultáneamente, reduciendo el tiempo de ejecución total y dando un gran rendimiento al sistema.

Si solo hay un procesador, a las tareas no les queda otro camino que compartirlo y al sistema operativo asignarles el tiempo de ejecución que les toca.


Orígenes de la multitarea


La multitarea se originó en los años 60, cuando los sistemas de tiempo compartido fueron desarrollados como una alternativa para abaratar los costes de explotación de los grandes ordenadores (mainframes), permitiendo su uso por múltiples usuarios.

En los sistemas de tiempo compartido, el sistema operativo asignaba un tiempo a cada de uno de los usuarios conectados por terminales al ordenador central. Si los cambios eran lo suficientemente rápidos, el usuario conseguía la ilusión de estar él solo conectado al ordenador central, como si no hubiese otros usuarios conectados.

A su vez el sistema de tiempo compartido desarrolló los primeros algoritmos para que un usuario pudiera tener su propia zona protegida de memoria y el acceso a recursos compartidos del sistema sin interferir en el trabajo de otros usuarios.

Pronto se hizo evidente que esta misma técnica de tiempo compartido, podía aplicarse a los procesos o tareas ejecutados por un mismo usuario. Con un hardware más potente,  fue más fácil que los usuarios pudieran ejecutar a la vez varios procesos, haciendo un uso más óptimo del sistema y del ordenador.

De esta manera el término “tiempo compartido” (time sharing) fue sustituido por un término más genérico: multitarea (multitasking), teniendo en cuenta que cada una de las conexiones de usuario representaban a su vez tareas para el proceso operativo.

De esta forma, cada usuario conectado abría una tarea de usuario. A su vez cada usuario dentro de su tarea de usuario, podía ejecutar varias tareas o procesos de manera simultánea.

IBM fue uno de los líderes en implementar los primeros sistemas operativos multitarea, tales como el OS/360 y OS/370. Aun hoy en día su entorno interactivo multitarea se sigue llamando TSO (Time Sharing Option) incluso para los sistemas más recientes como MVS, OS/390 y z/OS.

Otro centro importante en el desarrollo de los sistemas operativos multitarea fueron los laboratorios Bell, los creadores del sistema operativo UNIX entre 1969 y1972.

El sistema operativo UNIX fue muy famoso por ser el primer sistema escrito en lenguaje de programación C y en ser explotado no solo comercialmente sino por instituciones científicas y universitarias. Miles de horas de entusiastas programadores invertidas en su desarrollo, le convirtieron en el padre de numerosos sistemas operativos modernos tales como AIX, Solaris, Linux o Mac OSX.

Por último, la multitarea es particularmente importante en los llamados sistemas operativos de tiempo real (real time operating systems o RTOS), muy utilizados en sistemas empotrados (embedded systems) mayoritariamente de uso industrial.

En estos sistemas, se hace necesario monitorizar y controlar varias tareas de manera prácticamente instantánea. Estos sistemas utilizan un mecanismo de interrupción y un sistema de prioridad de ejecución de procesos, que permite la ejecución de tareas a intervalos de tiempo y con resultados muy cercanos al tiempo real. En estos sistemas los segundos y milisegundos a la hora de completar un determinado proceso cuentan, a diferencia del resto de los sistemas operativos multitarea donde esos tiempos de respuesta en muchas ocasiones son despreciables desde el punto de vista de usuario.

Algunos de los sistemas operativos de tiempo real más importantes son: RTLinux, Neutrino o QNX.

Multi-hilos (Multi-threading)

Tan pronto como la multitarea mejoró el desempeño de los ordenadores, los programadores comenzaron a implementar aplicaciones diseñadas como un conjunto de procesos que cooperaban entre si. Por ejemplo, un proceso leía la entrada de datos, otro transformaba los datos de entrada y un tercero los escribía en disco.

Esto requirió algunas herramientas que permitieran que estos procesos pudieran comunicarse entre sí.

Así nacieron los hilos de ejecución o threads, con el objetivo de implementar una vía eficiente de ejecutar procesos que compartieran un único espacio de memoria para intercambiar datos.

Dicho de otra manera, los hilos de ejecución son procesos que se ejecutan en un mismo espacio o contexto de memoria (memory context).

Los hilos se consideran procesos ligeros (lightweight processes) porque los cambios entre un hilo y otro no implican cambiar el contexto de memoria.

Los distintos hilos de ejecución comparten una serie de recursos tales como el espacio de memoria, los archivos abiertos, situación de autenticación, etc. Esta técnica permite simplificar el diseño de una aplicación que debe llevar a cabo distintas funciones simultáneamente.

Normalmente los hilos se crean como subprocesos o lo que es lo mismo suelen depender de un proceso principal.

El proceso sigue en ejecución mientras al menos uno de sus hilos de ejecución siga activo. Cuando el proceso finaliza, todos sus hilos de ejecución también han terminado. Asimismo en el momento en el que todos los hilos de ejecución finalizan, el proceso no existe más y todos sus recursos son liberados.

Algunos lenguajes de programación tienen características de diseño expresamente creadas para permitir a los programadores lidiar con hilos de ejecución (como Java, Delphi o FreePascal).

Otros (la mayoría) desconocen la existencia de hilos de ejecución y éstos deben ser creados mediante llamadas de biblioteca especiales que dependen del sistema operativo en el que estos lenguajes están siendo utilizados (como es el caso del C , C++ o Microsoft .NET C#).

Un ejemplo de implementación con hilos es la carga de una página Web en un navegador. Mientras un hilo atiende a los botones y controles de la interfaz de usuario, otro hilo en paralelo descarga el texto y las imágenes del sitio Web remoto y un tercer hilo las va pintando en la pantalla.

Fibras


Mientras que los hilos son ejecutados mediante multitarea preventiva (preemptive multitasking), algunos sistemas operativos ofrecen una variante de hilos denominada fibras (fiber) que se ejecutan de manera cooperativa.

Las fibras son unidades de ejecución aún más ligeras que los hilos. Una fibra en ejecución debe ceder o permitir explícitamente la ejecución de otra fibra. Eso es más simple que implementar hilos a nivel de kernel o a nivel de usuario.

Esto permite que las aplicaciones puedan administrar por ellas mismas la multitarea, en vez de utilizar el planificador del kernel (kernel scheduler).

Algunos sistemas de programación en paralelo como OpenMP (Open Multiprocessing) utilizan de manera intensiva las fibras.


Bibliografía



0 comentarios:

Publicar un comentario

Entrada más reciente Entrada antigua Inicio