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?
fuente
interrupt
INT
instrucción. Algo sigue siendo misterioso para míRespuestas:
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.
fuente
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.
fuente
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.
fuente