¿Cómo funciona la multitarea?

15

No tengo ni idea del funcionamiento interno de un sistema operativo, pero puedo adivinar más o menos el comportamiento aproximado de muchas funciones. Sin embargo, una cosa que no puedo entender es la multitarea.

En teoría, el sistema operativo gestiona el tiempo, de acuerdo con la CPU, durante pequeños intervalos para los distintos programas en ejecución. Pero no está claro cómo funciona esto realmente .

Digamos que el sistema operativo quiere iniciar mi programa. El código de la máquina se carga en algún lugar de la RAM, comenzando en una determinada dirección. Supongo que entonces se debe realizar un salto a esa dirección, permitiendo que mi código se ejecute. Pero de esta manera, el sistema operativo no puede recuperar el control hasta que salte hacia atrás.

Básicamente, puedo imaginar solo dos formas de hacer que esto funcione, pero ninguna parece realmente adecuada:

  • El sistema operativo podría leer las instrucciones de la máquina que quiero realizar y emularlas en lugar de ejecutarlas directamente. Soy intencionalmente vago, ya que no sé cómo funcionaría esto, pero parece que ralentizaría considerablemente el programa.

  • Alternativamente, el sistema operativo podría esperar hasta que haga una llamada al sistema. En ese momento recupera el control y puede verificar cuánto tiempo he estado corriendo y hacer sus cosas de tiempo compartido. Esto puede funcionar, pero parece poco confiable, ya que podría hacer un cálculo largo que no implique llamadas al sistema y cuelgue todo por un tiempo.

Entonces, parece que ninguno de los mecanismos funcionaría muy bien. ¿Cómo se realiza realmente la multitarea?

Andrea
fuente
Aunque su suposición no es exactamente correcta, el problema que señala es, bueno, sí: "Podría hacer un cálculo largo que no implique llamadas al sistema y suspender todo por un tiempo".
jhocking
Una palabra clave para buscar:interrupt
SK-logic
Sí, pero ¿quién está lanzando la interrupción? Si mi código se está ejecutando, el sistema operativo no tiene forma de ejecutar una INTinstrucción. Algo sigue siendo misterioso para mí
Andrea
@Andrea, el reloj de hardware está activando una interrupción. Tan simple como eso. en.wikipedia.org/wiki/Scheduling_%28computing%29
SK-logic
Ok, ahora ya veo. Entonces, si entiendo correctamente, es una característica basada en hardware, no algo que uno simplemente puede implementar en el sistema operativo.
Andrea

Respuestas:

21

El sistema operativo programa un temporizador para activar cada pocos microsegundos (o milisegundos, dependiendo de la velocidad del sistema). Este temporizador genera la interrupción de hardware, lo que hace que la CPU detenga lo que esté haciendo actualmente, descargue todo su contenido en la pila y procese la rutina de interrupción indicada por la dirección proporcionada por el controlador de interrupción. Esta rutina puede inspeccionar la pila y varias otras variables para tomar una decisión sobre qué proceso en ejecución debe volver a ponerse en acción. Si es el mismo proceso, la rutina de interrupción simplemente regresa. Si es diferente, las partes relevantes de la pila se guardan y luego se reemplazan con el contenido de un proceso interrumpido previamente, de modo que cuando la rutina de interrupción regresa, ese proceso continúa. Aparte del hecho de que ha pasado algún tiempo,

Esta es (para las CPU modernas) una versión MUY MUY simplificada de lo que sucede, pero explica el principio. Además de estas interrupciones controladas por el sistema operativo, también hay interrupciones causadas por eventos externos (mouse, teclado, puertos serie, puertos de red, etc.) que se procesan con rutinas de interrupción separadas, que generalmente están conectadas a controladores de eventos.

Muy a menudo, el cambio de proceso / tarea / contexto también se basa en la disponibilidad de recursos externos. Normalmente, un proceso que requiere datos del almacenamiento (es decir, no en la RAM) colocará la solicitud en una cola, establecerá un controlador de eventos para la interrupción de hardware que indica que la solicitud se ha atendido y luego cederá el control al programador de tareas (ya que no hay punto de espera). Una vez más, una descripción muy simplificada de lo que realmente sucede, pero debería servir para los propósitos de esta respuesta.

wolfgangsz
fuente
5

Varía de un sistema a otro.

En los sistemas multitarea no preventivos (como el Oberon original o el Apple Macintosh original), el sistema operativo "sondea" periódicamente todas las tareas, dándoles la oportunidad de trabajar. Se espera que las tareas jueguen bien juntas. Si solo tienen un poco de trabajo que hacer, lo hacen y regresan al sistema operativo. Si una tarea tiene una GRAN porción que hacer, se espera que la rompa en pedazos pequeños y trabaje un pedazo pequeño cada vez que se sondea.

Las interrupciones de hardware (terminaciones de DMA de la unidad de disco, interrupciones de puerto serie, lo que sea que tenga) hacen que se ejecuten rutinas de interrupción. Estas rutinas de interrupción pueden a su vez notificar a las tareas sobre el trabajo que se realizará la próxima vez que se ejecute la tarea.

En sistemas multitarea no preventivos, la ocurrencia o no de una interrupción no afecta qué tarea se está ejecutando después de que finaliza la rutina de interrupción.

En los sistemas multitarea preventivos, es posible que una rutina de interrupción fuerce un cambio de programación. En un sistema multitarea preventivo tradicional de round-robin, una interrupción periódica del temporizador hace exactamente eso. Se dispara la interrupción del temporizador, la rutina de interrupción del temporizador hace algo de magia negra para hacer que la instrucción de retorno de la interrupción regrese al programa preventivo del sistema operativo, en lugar de a la tarea en ejecución, alejando el procesador de la tarea actual y (POSIBLEMENTE ) dándole a otra tarea. Si ninguna otra tarea está lista para ejecutarse en ese punto, la tarea actual volverá a obtener el procesador y solo habrá perdido algo de tiempo.

La multitarea preventiva puede causar MUCHOS problemas. Todas esas cosas molestas sobre mutexes y secciones críticas y abrazos mortales e inversiones prioritarias y ... aparecen cuando te quitan el procesador sin previo aviso. Debe usar todas esas cosas para decirle al sistema operativo que está mezclando nitroglicerina y quitándole el procesador en este momento, es probable que se produzca un gran agujero virtual humeante en el medio del piso de la sala de servidores.

John R. Strohm
fuente
¿Qué puede pasar si le quitan el procesador sin previo aviso? Supongo que volverás a tener el control del procesador con los mismos valores en los registros. ¿Cómo es eso diferente de simplemente mantener su cálculo?
Andrea
@Andrea: la exclusión mutua y las secciones críticas tienen que ver con no perder el procesador en un momento crítico. Si su proceso tiene algo bloqueado y pierde el procesador, ese elemento permanece bloqueado hasta que vuelva a obtener el procesador. Esto puede causar problemas.
John R. Strohm
@Andrea Obtendrá el control del procesador nuevamente, y es posible que algún otro proceso haya jugado con la memoria que estaba a punto de usar.
user253751
4

El hardware de la computadora puede generar interrupciones del temporizador para interrumpir la CPU. De esta manera, según el algoritmo de programación utilizado por el sistema operativo, el sistema operativo puede decidir si continúa ejecutando su programa actual o cambio de contexto a otro que esté listo para ejecutarse.

nevayeshirazi
fuente