En informática , la multitarea es la ejecución simultánea de múltiples tareas (también conocidas como procesos ) durante un período de tiempo determinado. Las nuevas tareas pueden interrumpir las que ya se han iniciado antes de que finalicen, en lugar de esperar a que finalicen. Como resultado, un ordenador ejecuta segmentos de múltiples tareas de forma intercalada, mientras que las tareas comparten recursos de procesamiento comunes, como las unidades centrales de procesamiento (CPU) y la memoria principal . La multitarea interrumpe automáticamente el programa en ejecución, guarda su estado (resultados parciales, contenido de la memoria y contenido de los registros del ordenador) y carga el estado guardado de otro programa y le transfiere el control. Este " cambio de contexto " puede iniciarse en intervalos de tiempo fijos ( multitarea preventiva ), o el programa en ejecución puede estar codificado para indicar al software supervisor cuándo puede ser interrumpido ( multitarea cooperativa ).
La multitarea no requiere la ejecución paralela de múltiples tareas exactamente al mismo tiempo; en cambio, permite que más de una tarea avance durante un período de tiempo determinado. [1] Incluso en computadoras multiprocesador , la multitarea permite ejecutar muchas más tareas que CPU.
La multitarea es una característica común de los sistemas operativos de computadoras desde al menos la década de 1960. Permite un uso más eficiente del hardware de la computadora; cuando un programa está esperando algún evento externo, como una entrada de usuario o una transferencia de entrada/salida con un periférico para completarse, el procesador central aún puede usarse con otro programa. En un sistema de tiempo compartido , varios operadores humanos usan el mismo procesador como si estuviera dedicado a su uso, mientras que detrás de escena, la computadora está atendiendo a muchos usuarios al realizar múltiples tareas con sus programas individuales. En los sistemas de multiprogramación , una tarea se ejecuta hasta que debe esperar un evento externo o hasta que el programador del sistema operativo intercambia a la fuerza la tarea en ejecución fuera de la CPU. Los sistemas en tiempo real, como los diseñados para controlar robots industriales, requieren un procesamiento oportuno; un solo procesador podría compartirse entre los cálculos del movimiento de la máquina, las comunicaciones y la interfaz de usuario. [2]
A menudo, los sistemas operativos multitarea incluyen medidas para cambiar la prioridad de las tareas individuales, de modo que las tareas importantes reciban más tiempo de procesador que las consideradas menos significativas. Según el sistema operativo, una tarea puede ser tan grande como un programa de aplicación completo o puede estar compuesta por subprocesos más pequeños que ejecutan partes del programa general.
Un procesador diseñado para usarse con sistemas operativos multitarea puede incluir hardware especial para soportar de forma segura múltiples tareas, como protección de memoria y anillos de protección que garantizan que el software de supervisión no pueda dañarse ni subvertirse por errores del programa en modo usuario.
El término "multitarea" se ha convertido en un término internacional, ya que la misma palabra se utiliza en muchos otros idiomas, como alemán, italiano, holandés, rumano, checo, danés y noruego.
En los primeros tiempos de la informática, el tiempo de CPU era caro y los periféricos eran muy lentos. Cuando el ordenador ejecutaba un programa que necesitaba acceso a un periférico, la unidad central de procesamiento (CPU) tenía que dejar de ejecutar las instrucciones del programa mientras el periférico procesaba los datos. Esto solía ser muy ineficiente. La multiprogramación es una técnica informática que permite cargar y ejecutar simultáneamente varios programas en la memoria de un ordenador, lo que permite que la CPU cambie entre ellos rápidamente. Esto optimiza la utilización de la CPU al mantenerla ocupada con la ejecución de tareas, lo que resulta especialmente útil cuando un programa está esperando a que se completen las operaciones de E/S.
El Bull Gamma 60 , diseñado inicialmente en 1957 y lanzado por primera vez en 1960, fue el primer ordenador diseñado con la multiprogramación en mente. Su arquitectura incluía una memoria central y un distribuidor de programas que alimentaba hasta veinticinco unidades de procesamiento autónomas con código y datos, y permitía el funcionamiento simultáneo de varios clústeres.
Otro ordenador de este tipo fue el LEO III , lanzado por primera vez en 1961. Durante el procesamiento por lotes , se cargaban varios programas diferentes en la memoria del ordenador y el primero de ellos comenzaba a ejecutarse. Cuando el primer programa alcanzaba una instrucción que estaba esperando un periférico, el contexto de este programa se almacenaba y el segundo programa en la memoria tenía la oportunidad de ejecutarse. El proceso continuaba hasta que todos los programas terminaban de ejecutarse. [3]
El uso de la multiprogramación se vio mejorado con la llegada de la memoria virtual y la tecnología de máquinas virtuales , que permitieron que los programas individuales utilizaran la memoria y los recursos del sistema operativo como si otros programas que se ejecutaban simultáneamente fueran, a todos los efectos prácticos, inexistentes. [ cita requerida ]
La multiprogramación no garantiza que un programa se ejecute en el momento oportuno. De hecho, el primer programa puede funcionar perfectamente durante horas sin necesidad de acceder a un periférico. Como no había usuarios esperando en una terminal interactiva, esto no era un problema: los usuarios entregaban una baraja de tarjetas perforadas a un operador y volvían unas horas más tarde para obtener los resultados impresos. La multiprogramación redujo enormemente los tiempos de espera cuando se procesaban varios lotes. [4] [5]
Los primeros sistemas multitarea utilizaban aplicaciones que cedían tiempo voluntariamente entre sí. Este enfoque, que finalmente fue admitido por muchos sistemas operativos de computadoras , se conoce hoy como multitarea cooperativa. Aunque ahora rara vez se utiliza en sistemas más grandes, excepto para aplicaciones específicas como CICS o el subsistema JES2 , la multitarea cooperativa alguna vez fue el único esquema de programación empleado por Microsoft Windows y Mac OS clásico para permitir que varias aplicaciones se ejecutaran simultáneamente. La multitarea cooperativa todavía se utiliza hoy en día en los sistemas RISC OS . [6]
Como un sistema multitarea cooperativo depende de que cada proceso ceda tiempo regularmente a otros procesos del sistema, un programa mal diseñado puede consumir todo el tiempo de la CPU para sí mismo, ya sea realizando cálculos extensos o esperando demasiado tiempo ; ambas cosas provocarían que todo el sistema se bloqueara . En un entorno de servidor, esto es un peligro que hace que todo el entorno sea inaceptablemente frágil.
La multitarea preventiva permite al sistema informático garantizar de forma más fiable a cada proceso una "porción" regular de tiempo de funcionamiento. También permite al sistema gestionar rápidamente eventos externos importantes, como datos entrantes, que podrían requerir la atención inmediata de uno u otro proceso. Los sistemas operativos se desarrollaron para aprovechar estas capacidades del hardware y ejecutar múltiples procesos de forma preventiva. La multitarea preventiva se implementó en el PDP-6 Monitor y Multics en 1964, en OS/360 MFT en 1967 y en Unix en 1969, y estaba disponible en algunos sistemas operativos para ordenadores tan pequeños como el PDP-8 de DEC; es una característica fundamental de todos los sistemas operativos tipo Unix , como Linux , Solaris y BSD con sus derivados , [7] así como las versiones modernas de Windows.
En cualquier momento específico, los procesos se pueden agrupar en dos categorías: aquellos que están esperando una entrada o una salida (llamados " limitados por E/S ") y aquellos que están utilizando completamente la CPU (" limitados por CPU "). En los sistemas primitivos, el software a menudo " sondeaba " o " esperaba en espera " mientras esperaba la entrada solicitada (como la entrada de disco, teclado o red). Durante este tiempo, el sistema no estaba realizando un trabajo útil. Con la llegada de las interrupciones y la multitarea preventiva, los procesos limitados por E/S podían "bloquearse" o ponerse en espera, a la espera de la llegada de los datos necesarios, lo que permitía que otros procesos utilizaran la CPU. Como la llegada de los datos solicitados generaría una interrupción, se podía garantizar a los procesos bloqueados un retorno oportuno a la ejecución. [ cita requerida ]
Posiblemente el primer sistema operativo multitarea preventiva disponible para usuarios domésticos fue el OS-9 de Microsoft , disponible para ordenadores basados en el Motorola 6809 como el TRS-80 Color Computer 2 , [8] con el sistema operativo suministrado por Tandy como una actualización para sistemas equipados con disco. [9] Sinclair QDOS en el Sinclair QL le siguió en 1984, pero no fue un gran éxito. El Amiga de Commodore fue lanzado al año siguiente, ofreciendo una combinación de capacidades multitarea y multimedia. Microsoft hizo de la multitarea preventiva una característica central de su sistema operativo estrella a principios de los años 1990 cuando desarrolló Windows NT 3.1 y luego Windows 95. En 1988 Apple ofreció A/UX como una alternativa basada en UNIX System V al Mac OS clásico . En 2001 Apple cambió al Mac OS X influenciado por NeXTSTEP .
Un modelo similar se utiliza en Windows 9x y la familia Windows NT , donde las aplicaciones nativas de 32 bits se ejecutan en modo multitarea preventivo. [10] Las ediciones de 64 bits de Windows, tanto para las arquitecturas x86-64 como para Itanium , ya no admiten aplicaciones heredadas de 16 bits y, por lo tanto, proporcionan multitarea preventiva para todas las aplicaciones compatibles.
Otra razón para la multitarea fue el diseño de sistemas informáticos en tiempo real , donde hay una serie de actividades externas posiblemente no relacionadas que deben ser controladas por un solo sistema de procesador. En tales sistemas, un sistema de interrupción jerárquico se combina con la priorización de procesos para garantizar que las actividades clave reciban una mayor proporción del tiempo de proceso disponible . [11]
A medida que la multitarea mejoraba enormemente el rendimiento de las computadoras, los programadores comenzaron a implementar aplicaciones como conjuntos de procesos cooperativos (por ejemplo, un proceso que recopila datos de entrada, un proceso que procesa los datos de entrada, un proceso que escribe los resultados en el disco). Sin embargo, esto requería algunas herramientas que permitieran a los procesos intercambiar datos de manera eficiente. [ cita requerida ]
Los subprocesos nacieron de la idea de que la forma más eficiente para que los procesos cooperativos intercambien datos sería compartir todo su espacio de memoria. Por lo tanto, los subprocesos son efectivamente procesos que se ejecutan en el mismo contexto de memoria y comparten otros recursos con sus procesos principales , como archivos abiertos. Los subprocesos se describen como procesos livianos porque cambiar entre subprocesos no implica cambiar el contexto de memoria. [12] [13] [14]
Si bien los subprocesos se programan de manera preventiva, algunos sistemas operativos ofrecen una variante de los subprocesos, denominada fibras , que se programan de manera cooperativa. En los sistemas operativos que no ofrecen fibras, una aplicación puede implementar sus propias fibras mediante llamadas repetidas a funciones de trabajo. Las fibras son incluso más livianas que los subprocesos y algo más fáciles de programar, aunque tienden a perder algunos o todos los beneficios de los subprocesos en máquinas con múltiples procesadores . [15]
Algunos sistemas admiten directamente subprocesos múltiples en hardware .
Un elemento esencial de cualquier sistema multitarea es compartir de forma segura y eficaz el acceso a los recursos del sistema. El acceso a la memoria debe gestionarse estrictamente para garantizar que ningún proceso pueda leer o escribir de forma inadvertida o deliberada en ubicaciones de memoria fuera del espacio de direcciones del proceso. Esto se hace con el fin de garantizar la estabilidad general del sistema y la integridad de los datos, así como la seguridad de los datos.
En general, la gestión del acceso a la memoria es responsabilidad del núcleo del sistema operativo, en combinación con mecanismos de hardware que proporcionan funcionalidades de apoyo, como una unidad de gestión de memoria (MMU). Si un proceso intenta acceder a una ubicación de memoria fuera de su espacio de memoria, la MMU rechaza la solicitud y envía una señal al núcleo para que tome las medidas adecuadas; esto suele dar como resultado la finalización forzada del proceso infractor. Según el diseño del software y del núcleo y el error específico en cuestión, el usuario puede recibir un mensaje de error de violación de acceso, como "error de segmentación".
En un sistema multitarea bien diseñado e implementado correctamente, un proceso determinado nunca puede acceder directamente a la memoria que pertenece a otro proceso. Una excepción a esta regla es el caso de la memoria compartida; por ejemplo, en el mecanismo de comunicación entre procesos de System V, el núcleo asigna memoria para que sea compartida entre varios procesos. Estas características se utilizan a menudo en software de gestión de bases de datos como PostgreSQL.
Los mecanismos de protección de memoria inadecuados, ya sea por fallas en su diseño o malas implementaciones, permiten vulnerabilidades de seguridad que pueden ser potencialmente explotadas por software malicioso.
El uso de un archivo de intercambio o una partición de intercambio es una forma en que el sistema operativo proporciona más memoria de la que está físicamente disponible al mantener partes de la memoria principal en el almacenamiento secundario . Si bien la multitarea y el intercambio de memoria son dos técnicas completamente no relacionadas, se utilizan muy a menudo juntas, ya que el intercambio de memoria permite cargar más tareas al mismo tiempo. Por lo general, un sistema multitarea permite que otro proceso se ejecute cuando el proceso en ejecución llega a un punto en el que tiene que esperar a que se vuelva a cargar una parte de la memoria desde el almacenamiento secundario. [16]
Los procesos que son completamente independientes no presentan demasiados problemas para programarse en un entorno multitarea. La mayor parte de la complejidad de los sistemas multitarea proviene de la necesidad de compartir recursos informáticos entre tareas y de sincronizar el funcionamiento de las tareas que cooperan entre sí. [ cita requerida ]
Se utilizan diversas técnicas de computación concurrente para evitar posibles problemas causados por múltiples tareas que intentan acceder al mismo recurso. [ cita requerida ]
Los sistemas más grandes a veces se construían con uno o más procesadores centrales y una cierta cantidad de procesadores de E/S , una especie de multiprocesamiento asimétrico . [ cita requerida ]
Con el paso de los años, los sistemas multitarea se han ido perfeccionando. Los sistemas operativos modernos suelen incluir mecanismos detallados para priorizar procesos, mientras que el multiprocesamiento simétrico ha introducido nuevas complejidades y capacidades. [17]