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
- About multitasking in Mac OSX. https://developer.apple.com/library/mac/#documentation/Carbon/Conceptual/Multitasking_MultiproServ/02concepts/concepts.html
- MSDN
– Multitasking.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684259(v=vs.85).aspx
- Multitasking Definition. http://www.linfo.org/multitasking.html
- Wikipedia
– Computer Multitasking. http://en.wikipedia.org/wiki/Computer_multitasking
- Wikipedia – List of
Real Time Operating Systems. http://en.wikipedia.org/wiki/List_of_real-time_operating_systems
- Multithreading. http://en.wikipedia.org/wiki/Thread_(computing)
- OpenMP. http://en.wikipedia.org/wiki/OpenMP
0 comentarios:
Publicar un comentario