En informática , la interrupción es el acto de interrumpir temporalmente una tarea en ejecución , con la intención de reanudarla en un momento posterior. Esta interrupción la realiza un programador externo sin asistencia ni cooperación de la tarea. [1] : 153 Este programador preventivo generalmente se ejecuta en el anillo de protección más privilegiado , lo que significa que la interrupción y luego la reanudación se consideran acciones altamente seguras. Dichos cambios en la tarea que se está ejecutando actualmente en un procesador se conocen como cambio de contexto .
En cualquier diseño de sistema dado, algunas operaciones realizadas por el sistema pueden no ser preemptables. Esto generalmente se aplica a funciones del núcleo e interrupciones de servicio que, si no se les permite ejecutarse hasta completarse , tenderían a producir condiciones de carrera que resultarían en un bloqueo . Prohibir al planificador preemptar tareas mientras están procesando funciones del núcleo simplifica el diseño del núcleo a expensas de la capacidad de respuesta del sistema . La distinción entre modo de usuario y modo de núcleo , que determina el nivel de privilegio dentro del sistema, también se puede utilizar para distinguir si una tarea es preemptable en ese momento.
La mayoría de los sistemas operativos modernos tienen núcleos preemptivos , que están diseñados para permitir que las tareas sean preemptivas incluso cuando se está en modo núcleo. Ejemplos de tales sistemas operativos son Solaris 2.0/SunOS 5.0, [2] Windows NT , kernel Linux (2.5.4 y posteriores), [3] AIX y algunos sistemas BSD ( NetBSD , desde la versión 5).
El término multitarea preventiva se utiliza para distinguir un sistema operativo multitarea , que permite la prelación de tareas, de un sistema multitarea cooperativo en el que los procesos o tareas deben programarse explícitamente para ceder cuando no necesitan recursos del sistema.
En términos simples: la multitarea preventiva implica el uso de un mecanismo de interrupción que suspende el proceso que se está ejecutando actualmente e invoca un programador para determinar qué proceso debe ejecutarse a continuación. Por lo tanto, todos los procesos obtendrán cierta cantidad de tiempo de CPU en un momento dado.
En la multitarea preventiva, el núcleo del sistema operativo también puede iniciar un cambio de contexto para satisfacer la restricción de prioridad de la política de programación , con lo que se apropia de la tarea activa. En general, apropiación significa "apropiación previa". Cuando la tarea de alta prioridad en esa instancia apropia de la tarea que se está ejecutando actualmente, se conoce como programación preventiva.
El término "multitarea preventiva" a veces se utiliza por error cuando el significado pretendido es más específico y se refiere en cambio a la clase de políticas de programación conocidas como programación de tiempo compartido o tiempo compartido .
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 la entrada de datos, que podrían requerir la atención inmediata de uno u otro proceso.
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 primeros sistemas, los procesos solían " sondear " o " esperar en espera activa " mientras esperaban la entrada solicitada (como la entrada de disco, teclado o red). Durante este tiempo, el proceso no estaba realizando un trabajo útil, pero aún mantenía el control completo de la CPU. Con la llegada de las interrupciones y la multitarea preventiva, estos procesos limitados por E/S se podían "bloquear" o poner 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.
Aunque las técnicas de multitarea se desarrollaron originalmente para permitir que varios usuarios compartieran una sola máquina, se hizo evidente que la multitarea era útil independientemente del número de usuarios. Muchos sistemas operativos, desde mainframes hasta computadoras personales de un solo usuario y sistemas de control sin usuario (como los de las naves espaciales robóticas ), han reconocido la utilidad del soporte multitarea por diversas razones. La multitarea permite que un solo usuario ejecute varias aplicaciones al mismo tiempo o ejecute procesos "en segundo plano" mientras conserva el control de la computadora.
El período de tiempo durante el cual se permite que un proceso se ejecute en un sistema multitarea preventivo generalmente se denomina franja de tiempo o quantum . [1] : 158 El programador se ejecuta una vez en cada franja de tiempo para elegir el siguiente proceso a ejecutar. La duración de cada franja de tiempo puede ser crítica para equilibrar el rendimiento del sistema frente a la capacidad de respuesta del proceso: si la franja de tiempo es demasiado corta, el programador consumirá demasiado tiempo de procesamiento, pero si la franja de tiempo es demasiado larga, los procesos tardarán más en responder a la entrada.
Se programa una interrupción para permitir que el núcleo del sistema operativo cambie de proceso cuando sus porciones de tiempo expiran, lo que permite que el tiempo del procesador se comparta entre varias tareas, lo que da la ilusión de que está lidiando con estas tareas en paralelo (simultáneamente). El sistema operativo que controla este diseño se denomina sistema multitarea.
Hoy en día, casi todos los sistemas operativos admiten la multitarea preventiva, incluidas las versiones actuales de Windows , macOS , Linux (incluido Android ), iOS y iPadOS .
Un sistema operativo de microcomputadoras temprano que proporcionaba multitarea preventiva fue el OS-9 de Microware , disponible para computadoras basadas en el Motorola 6809 , incluidas computadoras domésticas como la TRS-80 Color Computer 2 cuando se configuraba con unidades de disco, [4] con el sistema operativo suministrado por Tandy como una actualización. [5] Sinclair QDOS [6] : 18 y AmigaOS en Amiga también eran sistemas operativos de microcomputadoras que ofrecían multitarea preventiva como una característica principal. Ambos se ejecutaban en microprocesadores de la familia Motorola 68000 sin administración de memoria. Amiga OS usaba carga dinámica de bloques de código reubicables (" trozos " en la jerga de Amiga) para realizar múltiples tareas preventivamente en todos los procesos en el mismo espacio de direcciones plano.
Los primeros sistemas operativos compatibles con IBM PC, como MS-DOS y PC DOS , no admitían multitarea en absoluto; sin embargo, sistemas operativos alternativos como MP/M-86 (1981) y Concurrent CP/M-86 sí admitían multitarea preventiva. Otros sistemas similares a Unix, como MINIX y Coherent, ofrecían multitarea preventiva en las computadoras personales de la década de 1980.
Los sistemas posteriores compatibles con MS-DOS que admiten de forma nativa la multitarea y el subprocesamiento multiproceso incluyen Concurrent DOS , Multiuser DOS , Novell DOS (posteriormente llamado Caldera OpenDOS y DR-DOS 7.02 y versiones posteriores). Desde Concurrent DOS 386 , también podían ejecutar varios programas DOS simultáneamente en máquinas DOS virtuales .
La primera versión de Windows que admitió una forma limitada de multitarea preventiva fue Windows/386 2.0 , que usaba el modo Virtual 8086 del procesador Intel 80386 para ejecutar aplicaciones DOS en máquinas 8086 virtuales , comúnmente conocidas como "cajas DOS", que podían ser preemptivas. En Windows 95, 98 y Me , las aplicaciones de 32 bits se hicieron preemptivas al ejecutarse cada una en un espacio de direcciones separado, pero las aplicaciones de 16 bits siguieron siendo cooperativas para la compatibilidad con versiones anteriores. [7] En Windows 3.1x (modo protegido), el núcleo y los controladores de dispositivos virtuales se ejecutaban de manera preemptiva, pero todas las aplicaciones de 16 bits no eran preemptivas y compartían el mismo espacio de direcciones.
La multitarea preventiva siempre ha sido compatible con Windows NT (todas las versiones), OS/2 (aplicaciones nativas), sistemas Unix y similares a Unix (como Linux , BSD y macOS ), VMS , OS/360 y muchos otros sistemas operativos diseñados para su uso en los mercados académicos y de empresas medianas y grandes.
Aunque hubo planes para actualizar la multitarea cooperativa encontrada en el Mac OS clásico a un modelo preemptivo (y una API preemptiva existía en Mac OS 9 , aunque en un sentido limitado [8] ), estos fueron abandonados en favor de Mac OS X (ahora llamado macOS) que, como un híbrido del antiguo estilo Mac System y NeXTSTEP , es un sistema operativo basado en el núcleo Mach y derivado en parte de BSD , que siempre había proporcionado multitarea preemptiva similar a Unix.