stringtranslate.com

Multitarea cooperativa

La multitarea cooperativa , también conocida como multitarea no preemptiva , es un estilo de multitarea informática en el que el sistema operativo nunca inicia un cambio de contexto de un proceso en ejecución a otro proceso. En cambio, para ejecutar varias aplicaciones simultáneamente, los procesos ceden voluntariamente el control de forma periódica o cuando están inactivos o bloqueados lógicamente . Este tipo de multitarea se denomina cooperativa porque todos los programas deben cooperar para que funcione el esquema de programación.

En este esquema, el programador de procesos de un sistema operativo se conoce como un programador cooperativo cuyo papel se limita a iniciar los procesos y permitirles devolverle el control voluntariamente. [1] [2]

Esto está relacionado con el enfoque de programación asincrónica .

Uso

Aunque rara vez se utiliza como mecanismo de programación principal en los sistemas operativos modernos, se utiliza ampliamente en sistemas integrados con restricciones de memoria y también en aplicaciones específicas como CICS o el subsistema JES2 . La multitarea cooperativa fue el principal esquema de programación para aplicaciones de 16 bits empleado por Microsoft Windows antes de Windows 95 y Windows NT , y por el Mac OS clásico . Windows 9x utilizó multitarea no preemptiva para aplicaciones heredadas de 16 bits, y las versiones PowerPC de Mac OS X anteriores a Leopard lo utilizaron para aplicaciones clásicas . [1] NetWare , que es un sistema operativo orientado a la red, utilizó multitarea cooperativa hasta NetWare 6.5. La multitarea cooperativa todavía se utiliza en sistemas RISC OS . [3]

La multitarea cooperativa es similar a async/await en lenguajes como JavaScript o Python , que cuentan con un bucle de eventos de un solo subproceso en su tiempo de ejecución. Esto contrasta con la multitarea cooperativa en que await no puede invocarse desde una función no asincrónica, sino solo desde una función asincrónica, que es una especie de corrutina . [4] [5]

La multitarea cooperativa permite una implementación mucho más sencilla de las aplicaciones porque su ejecución nunca es interrumpida inesperadamente por el programador de procesos; por ejemplo, varias funciones dentro de la aplicación no necesitan ser reentrantes . [2]

Problemas

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 harían que todo el sistema se cuelgue . En un entorno de servidor , este es un riesgo que a menudo se considera que hace que todo el entorno sea inaceptablemente frágil, [1] aunque, como se señaló anteriormente, la multitarea cooperativa se ha utilizado con frecuencia en entornos de servidor, incluidos NetWare y CICS.

Por el contrario, la multitarea preventiva interrumpe las aplicaciones y otorga control a otros procesos fuera del control de la aplicación.

La posibilidad de que el sistema se cuelgue se puede aliviar mediante el uso de un temporizador de vigilancia , a menudo implementado en el hardware; esto normalmente invoca un reinicio del hardware .

Referencias

  1. ^ abc "Definición de multitarea no preventiva". pcmag.com . Consultado el 15 de agosto de 2015 .
  2. ^ de Joe Bartel (5 de noviembre de 2011). «Multitarea no preventiva» (PDF) . classiccmp.org . Archivado desde el original (PDF) el 19 de agosto de 2019. Consultado el 15 de agosto de 2015 .
  3. ^ "Multitarea preventiva". riscos.info . 2 de noviembre de 2009 . Consultado el 15 de agosto de 2015 .
  4. ^ Kerkour, Sylvain (25 de enero de 2022). "Async Rust: Cooperative vs Preemptive scheduling" (Rust asincrónico: programación cooperativa frente a programación preventiva) . Consultado el 30 de enero de 2023 .
  5. ^ Skvortsov, Victor. "Python detrás de escena n.° 12: cómo funciona async/await en Python" . Consultado el 30 de enero de 2023 .