MINIX

Este sistema operativo al igual que Linux, Windows NT y Amoeba permite la multiprogramación, en estos sistemas el procesador ejecuta cada programa durante decenas o centenares de milisegundos, para luego conmutar al programa siguiente. En cada instante el procesador está ejecutando un sólo programa, pero a lo largo de un espacio de tiempo puede haber ejecutado partes de diversos programas dando así la sensación de paralelismo. Para poder realizar esto necesitamos una buena planificación de cómo los procesos se ejecutarán en la CPU.

Un proceso es un programa en ejecución que comprende el valor actual del contador de programa, de los registros y de las variables. Conceptualmente cada proceso tiene su propio procesador virtual y la CPU va conmutando de un proceso a otro. Para que esta conmutación pueda darse el sistema dota a los procesos una serie de estados en los que pueden encontrarse. Estos estados en Minix son tres, pero como veremos más adelante en Windows NT son 6 y en Linux son 5. Estos estados son:

  1. En ejecución: el proceso esta usando el procesador.
  2. Bloqueado: el proceso está esperando a que ocurra un evento externo.
  3. Listo : el proceso está preparado para ser ejecutado, pero está parado.

Existen cuatro transiciones posible entre los diferentes estados que son:

    1. De ejecución a bloqueado
    2. De ejecución a listo
    3. De listo a ejecución
    4. De bloqueado a listo

La primera transición ocurre cuando un proceso no puede continuar, por ejemplo porque tiene que leer de un tubo en el que todavía no se ha escrito.

La segunda y tercera transición es el planificador el encargado de realizarlas, para realizar estas transiciones el planificador dota a cada proceso de un quantum de tiempo que indica el tiempo que cada proceso deberá estar en ejecución y cuando este tiempo a expirado realiza la transición 2 para "sacar" del procesador al proceso que se está ejecutando y después realiza la transición 3 para "meter" en el procesador a un proceso que está en el estado listo. La forma en que se realizan estas transiciones por parte del planificador la explicaré más adelante.

Por último la cuarta transición se produce cuando el proceso que estaba bloqueado recibe la información que precisaba para continuar ejecutando.

Para implementar este modelo de procesos el sistema operativo utiliza la tabla de procesos que posee una posición por cada proceso. Esta posición contiene información sobre el estado del proceso, su contador de programa, el puntero a pila, la memoria asignada, el estado de sus ficheros abiertos, información relativa a su planificación y a su utilización de los recursos, es decir, todo lo que hay que salvar para que cuando el proceso pasa de ejecución a listo después pueda volver a pasar a ejecución.

El planificador de Minix es el nivel más inferior del sistema operativo, todo el manejo de interrupciones así como el manejo y la parada de los procesos y la comunicación entre ellos están ocultos dentro del planificador. Es por esto que el planificador debe ser muy eficiente porque de él depende que el sistema operativo le saque el mayor rendimiento posible a la CPU.

El funcionamiento del Planificador de Minix es muy parecida al del Coordinador de Linux o el despachador de procesos de Windows NT. Al final de la memoria existen unas posiciones, llamadas vectores de interrupciones, cada uno de estos vectores contiene la dirección del procedimiento de servicio de las interrupciones correspondientes. Cuando llega una interrupción se salvará automáticamente en la pila el contador de programa, la palabra de estado del programa y uno o más registros. Una vez hecho esto el computador dará un salto a la dirección de memoria especificada en el vector de interrupciones de disco. Lo primero que hace el procedimiento de servicio de la interrupción es salvar todos los registros en la posición de la tabla de procesos correspondiente al proceso actual, con objeto de recuperarlos después. Mientras esto se realiza el procesador pasa a estar en modo no interrumpible de forma que si llegara otra interrupción no se ejecutaría. Esto es una cosa bastante normal ya que si no podemos salvar la información del proceso que se está ejecutando podemos perder este proceso. Una vez hecho esto se recupera de la pila la información que la interrupción ha almacenado allí, y se carga el puntero de pila con un nuevo valor para que apunta a una pila auxiliar utilizada por el manejador de procesos. Una vez atendida la interrupción se invoca otra vez al planificador. El planificador elegirá cual es el nuevo proceso a ejecutar y cambiará el estado del nuevo proceso de listo a ejecución. Para saber que proceso debe ejecutarse Minix asigna prioridades a los procesos, de forma que las prioridades mayores las poseen los procesos que realizan E/S y las menores los procesos de usuarios. Estos procesos que están listos para ser ejecutado se guardan en una cola que es gestionada por el planificador, de esta cola de estados listos es de donde se cogen los procesos que se van a ejecutar.

Como podemos observar la planificación de la ejecución del os procesos es muy importante sobre todo en un sistema multiprogramación en el que de esta planificación va depender que realmente se puedan ejecutar todos los procesos de una forma efectiva. Como veremos más adelante los todos los sistemas operativos estudiados a excepción de MS-DOS poseen una planificación muy parecida a la de este sistema operativo.

LINUX

Linux, al igual que Mínix, es un sistema operativo que permite la multitarea o multiprogramación, es por esto que en el núcleo existe una función que se encarga de la organización de los procesos. En el transcurso de la ejecución un proceso en Linux puede pasar por cinco estados diferentes a diferencia de Minix en el que sólo hay tres. Estos estados son:

  1. En ejecución: el proceso es ejecutado por el procesador.
  2. A punto: el proceso podría ser ejecutado pero otro proceso se está ejecutando en ese momento.
  3. Suspendido: el proceso está en espera de un recurso.
  4. Parado: el proceso ha sido suspendido por una intervención externa.
  5. Zombi: el proceso ha terminado su ejecución pero sigue siendo referenciado en el sistema.

Los atributos que el sistema mantiene mientras un proceso se esta ejecutando son: el estado, el valor de los registros, la identidad del usuario bajo cuyo nombre se ejecuta, las informaciones utilizadas por el núcleo para proceder al ordenamiento de los procesos(prioridad), las informaciones respecto del espacio de direccionamiento del proceso(segmentos de código, de datos, de pila), las informaciones respecto a las entradas/salidas efectuadas por el proceso y las informaciones que resumen los recursos utilizados por el proceso.

La forma que posee Linux para ejecutar varios procesos es muy parecida a la que poseen los demás sistemas operativos que admiten la multiprogramación. El sistema mantiene una lista de procesos a punto que podría ejecutar y procede periódicamente a un ordenamiento. A cada proceso se le atribuye un lapso de tiempo. Linux elige un proceso a ejecutar, y le deja ejecutarse durante ese lapso. Cuando ha transcurrido, el sistema hace pasar al proceso actual al estado a punto, y elige otro proceso que ejecuta durante otro lapso. El lapso de tiempo es muy corto y el usuario tiene la impresión que varios procesos se ejecutan simultáneamente, aunque sólo un proceso se ejecuta en un instante dado. Se dice que los procesos se ejecutan en pseudoparalelismo.

La función del núcleo que decide qué proceso debe ser ejecutado por el procesador es el Coordinador. Éste explora la lista de procesos a punto y utiliza varios criterios para elegir el proceso a ejecutar. El coordinador de Línux proporciona tres políticas de coordinación deferentes: una para los procesos "normales" y dos para los procesos de "tiempo real".

A cada proceso sele asocia un tipo de proceso, una prioridad fija y una prioridad variable. El tipo de proceso puede ser:

La política de coordinación depende del tipo de procesos contenidos en la lista de procesos a punto de ejecutar:

Cuando un proceso de tipo SCHED_FIFO está a punto, se ejecuta inmediatamente. El coordinador prioriza la elección del proceso de tipo SCHED_FIFO que posea la más alta prioridad, y lo ejecuta. Este proceso no es normalmente peemtible, es decir, que posee el procesador, y el sistema sólo interrumpirá su ejecución en tres casos:

  1. Otro proceso de tipo SCHED_FIFO que posea una prioridad más elevada pasa al estado a punto.
  2. El proceso se suspende en espera de un evento, como pro ejemplo el fin de una entrada/salida.
  3. El proceso abandona voluntariamente el procesador por una llamada a la primitiva sched_yield. El proceso pasa al estado a punto y se ejecutan otros procesos.

Cuando un proceso de tipo SCHED_RR está a punto, se ejecuta inmediatamente. Su comportamiento es similar al de un proceso de tipo SCHED_FIFO, con una excepción: cuando el proceso se ejecuta, se le atribuye un lapso de tiempo. Cuando este lapso expira, puede elegirse y ejecutarse un proceso de tipo SCHED_FIFO o SCHED_RR de prioridad superior o igual a la del proceso actual.

Los procesos de tipo SCHED_OTHER únicamente pueden ejecutarse cuando no existe ningún proceso de "tiempo real" en estado a punto. El proceso a ejecutar se elige tras examinar las prioridades dinámicas. La prioridad dinámica de un proceso se basa por una parte en el nivel especificado por el usuario por las llamadas al sistema nice y setpriority, y por otra parte en una variación calculada por el sistema. Todo proceso que se ejecuta durante varios ciclos de reloj disminuye en prioridad y puede así llegar a ser menos prioritario que los procesos que no se ejecutan, cuya prioridad no se ha modificado.

Como se puede observar todo el peso de la planificación de la ejecución de los procesos en Linux la lleva a cabo el Coordinador, al igual que como veremos más adelante en Windows NT esta función la lleva a cabo el despachador de hilos. De esta forma nos damos cuenta que una buena planificación del modo de utilizar el procesador el primordial para sacar el mayor rendimiento posible de éste.

AMOEBA

El sistema operativo Amoeba consta de dos partes fundamentales, como dije en la práctica anterior, una de ellas es el microkernel que se ejecuta en cada procesador y otra son los servidores de los cuales se habló ampliamente el la práctica anterior.

El micronúcleo de Amoeba se ejecuta en todas las máquinas del sistema. El mismo núcleo se utiliza en los procesadores de la pila, las terminales y los servidores especializados. El micro núcleo tiene cuatro funciones básica:

  1. El manejo de procesos e hilos.
  2. Soporte del manejo de memoria de bajo nivel
  3. Soporte de la comunicación
  4. Manejo de E/S de bajo nivel

En este capítulo de la práctica no vamos a centrar en cómo maneja los procesos y los hilos.

Amoeba, al igual que veremos en Windows NT, además de manejar el concepto de proceso también soporta varios hilos de control dentro de un único espacio de direcciones. Un proceso con un sólo hilo es en esencia igual a un proceso en Linux.

Un proceso en Amoeba es básicamente un espacio de direcciones y una colección de hilos que se ejecutan en él. Un proceso es un objeto en Amoeba, la creación de procesos es diferente a la de Linux ya que en Línux los procesos se crean por clonación al igual que en Mínix, pero este sistema no es bueno para un sistema distribuido ya que el gasto es muy grande. Amoeba permite crear un nuevo proceso en un procesador específico donde la supuesta imagen en memoria comienza justo al principio, al igual que en MS-DOS, pero ha diferencia de él un proceso puede continuar su ejecución en paralelo con su hijo.

La administración de procesos se controla en tres distintos niveles en Amoeba, en el nivel inferior (que es el que nos interesa) están los servidores de procesos que son hilos del núcleo que se ejecutan en cada una de las máquinas.

El descriptor de procesos es en Amoeba quien nos proporciona la información sobre el proceso que está ejecutándose. Este descriptor de procesos contiene información como las arquitecturas de CPU donde puede se puede ejecutar el proceso, los segmentos del proceso, así como los descriptores de todos sus hilos. El contenido de este descriptor de hilo depende de la arquitectura pero como mínimo contiene el contador del programa y el apuntador a la pila del hilo. También puede contener la información adicional necesaria para ejecutar el hilo, donde se incluyen otros registros, el estado del hilo y varias banderas.

En Amoeba la organización de los procesos y dónde se ejecutan la lleva a cabo el servidor de ejecución. Este servidor se encarga de marcar en qué tipo de arquitectura se debe ejecutar un proceso y qué procesador elegir. Par realizar esto cada servidor de ejecución maneja una o varia pilas de procesadores. Una pila de procesadores se representan mediante un directoria llamado pooldir, el cual contiene subdirectorios para cada una de las arquitecturas de CPU soportadas. Los subdirectorios contienen posibilidades para el acceso a los servidores de procesos para cada una de las máquinas en al pila. Cuando un nuevo proceso quiere ejecutarse entonces se realiza un RPC al servidor de ejecución para enviarle todos los descriptores disponibles del proceso y solicitarle que elija tanto una arquitectura como un CPU específico.

El servidor de ejecución busca entonces en su pooldir para ver lo que puede ofrecer. Para realizar la elección realizar los siguientes pasos.

En primer lugar, se calcula la intersección de los descriptores de procesos y los procesadores de la pila. Si existen descriptores de procesos para 386, SPARC y 6830 y este servidor de ejecución maneja procesadores 386, SPARC y VAX en la pila, las únicas posibilidades son las 386 y la SPARC, de modo que las demás máquinas quedan eliminadas.

En segundo lugar, el servidor de ejecución verifica si alguna de las máquinas candidato tiene la memoria suficiente para ejecutar el programa. Las que no lo tengan se eliminan. El servidor de ejecución mantiene un registro del uso de la memoria del CPU para cada uno de los procesadores de la pila mediante llamadas periódicas a getload en cada una, donde solicita ese valores, de modo que los números en las tablas del servidor de ejecución se refrescan de manera continua.

El tercer y último lugar, para cada una de las máquinas restantes se hace una estimación del pode de cómputo que se puede dedicar al nuevo proceso. La heurística utiliza como entrada el poder de cómputo total conocido del CPU y el número de hilos activos que en ese momento s ejecutan en él.. El servidor de ejecución elige el procesador que pueda entregar un mayor número de MIPS y regresa la posibilidad para que se puedan comunicar su servidor de procesos y el proceso que hizo la llamada.

Como se puede observar este sistema operativo no sólo debe organizar la CPU sino que debido a se un sistema distribuido en el cual pueden haber máquinas con distintas arquitecturas la planificación de los procesos pasa por mirar en que tipo de arquitectura se debe ejecutar ese proceso o hilo y dentro de esa arquitectura que CPU posee menos carga para que el procesamiento sea lo más rápido posible.

WINDOWS NT

Cómo dije en el capitulo anterior el núcleo de Windows NT se incluía dentro del executive. En Windows NT el núcleo lleva a cabo las operaciones más fundamentales , determinando cómo el sistema operativo utiliza el procesador o procesadores, asegurando que se utilizan prudentemente. El éxito del sistema operativo completo depende de una correcta y eficiente operación del núcleo. El núcleo esta separado del executive, implementando los mecanismos de sistema operativo y evitando hacer cualquier tipo de políticas. Deja caso todas las decisiones al executive de Windows NT. Separar los mecanismos de sistema operativo de sus políticas es un principio importante en Windows NT. Los mecanismos se refieren a la forma en la cual se realizan las tareas en un sistema, y están implementados por algoritmos y código. Las políticas determinan qué tareas se deben realizar y cuándo, o incluso se deben realizarse ciertas tareas. El principio de separar las políticas de los mecanismos existe en varios niveles en Windows NT. En el nivel más alto cada subsistema de entorno establece una capa de políticas de sistema operativo que es distinta en cada subsistema. Bajo lo subsistemas, el executive de Windows NT establece otra capa más básica de políticas que se ajusta a todos los subsistemas. En la capa más baja del sistema operativo, el núcleo evita las políticas enteramente, él mismo sirve como una capa entre el resto del sistema operativo y el procesador. Forzar a que todas las operaciones relacionadas con el procesador sean canalizadas a través del núcleo resulta en una gran portabilidad y predicibilidad. El executive de Windows NT ejerce sólo un control limitado sobre estas operaciones al llamar a las funciones del núcleo.

El núcleo nunca es paginado fuera de la memoria aunque se le puede interrumpir la ejecución de una función de servicio de interrupción, su ejecución es preemptiva. La multitarea cesa durante cortos periodos de tiempo, mientras se ejecuta el núcleo en modo kernel, el modo de procesador privilegiado de Windows NT, y está diseñado para ser pequeño, compacto, y tan portable como el rendimiento y las diferencias entre arquitecturas de los procesos permitan. El código del kernel está escrito principalmente en C, con código de ensamblador.

El núcleo de Windows NT realiza cuatro funciones importantes:

  1. Planifica la ejecución del los hilos
  2. Transfiere el control a las funciones del controlador cuando suceden interrupciones y excepciones
  3. Lleva a cabo la sincronización de bajo nivel del multiprocesador
  4. Implementa los procedimientos de recuperación del sistema después de un fallo de alimentación.

En esta parte del trabajo nos vamos a centrar el las dos primeras funciones que realiza el núcleo de Windows NT.

 

1.PLANIFICACIÓN DE LOS HILOS

Un hilo es una entidad ejecutable que se ejecuta en el espacio d direcciones de un proceso, utilizando los recursos reservados al proceso. Uno de los trabajos del núcleo de Windows NT el llevar el seguimiento de los hilos que están listos para ejecutarse y seleccionar el orden en el que se ejecutarán. Esta tarea se denomina planificación de hilos, al igual que en Mínix se denomina planificación de procesos. Una selección de contexto es el procedimiento de salvar el estado máquina volátil asociado con la ejecución de un hilo, cargar el de otro hilo y poner en marcha la ejecución del nuevo hilo. El módulo que realiza estas tareas es el despachador del núcleo.

El trabajo del despachador del núcleo es asegurar que de todos los hilos que están esperando a ejecutarse, los procesadores estén ejecutando los más adecuados. Cuando suceden eventos del sistema que cambian el estado de algún hilo, el despachador examina la lista de hilos en espera y realiza una selección de contexto a un nuevo hilo si se requiere un cambio. El núcleo trabaja con una versión reducida del objeto hilo denominada objeto hilo del núcleo, éste representa sólo la información que el núcleo necesita para despachar la ejecución de un hilo. El núcleo también utiliza una versión reducida del objeto proceso que recibe el nombre de objeto proceso del núcleo, éste objeto contiene un puntero a una lista de hilos del núcleo. El objeto proceso del núcleo también apunta al directoria del la tabla de páginas del proceso al tiempo total que los hilos del proceso han estado ejecutándose, a la prioridad de planificación base por defecto del proceso y al conjunto de procesadores por defecto en los que pueden ejecutarse los hilos. El objeto hilo del núcleo es más complicado que el proceso objeto. Éste posee información sobre la afinidad con el procesador del hilo, la cantidad de tiempo total que el hilo ha empleado para ejecutarse y la prioridad actual del hilo. A diferencia que en Mínix un hilo en Windows NT puede estar es seis estados posibles, de los cuales sólo uno hace que el hilo sea susceptible a se elegido para su ejecución.

El ciclo de vida de un hilo comienza cuando un programa crea un nuevo hilo. La petición llega al executive de Windows NT, donde el administrador de procesos reserva espacio para un objeto hilo y llama al núcleo para inicializar el objeto hilo del núcleo contenido dentro de él. Una vez inicializado el hilo progresa a través de los siguientes estados:

  1. Listo. Estos hilos están esperando para ser ejecutados
  2. Stanby. El hilo se encuentra en este estado cuando ha sido seleccionado para su ejecución próxima en un procesador particular.
  3. Ejecución. La ejecución de un hilo en Windows NT termina cuando el núcleo lo desplaza para ejecutar un hilo con una prioridad más alta, o su quantum de tiempo finaliza, o termina, o voluntariamente entra en estado de espera.
  4. Espera. Cuando finaliza este estado el hilo vuelve al estado listo para volver a entrar en la planificación.
  5. Transición. Un hilo se encuentra en este estado cuando está listo para la ejecución pero los recursos que necesita no están disponibles.
  6. Terminado. Cuando un hilo ha terminado su ejecución. Una vez terminado el hilo puede ser eliminado o no pero de esto se encarga el administrador de objetos no el núcleo.

El estado de espera requiere algunas consideraciones más. Un Hilo está en estado de espera cuando está esperando a que un objeto o grupo de objetos se coloquen en el estado señalado. Él núcleo es quien implementa las semánticas de señal y espera de Windows NT. Todos los objetos sincronización visibles en modo usuario incorporan uno o más de los objetos despachador del núcleo. El núcleo es responsable de colocar los objetos despachador en el estado señalado de acuerdo con reglas bien definidas; cuando lo hace, libera los hilos que estaban esperando a aquéllos objetos cambiando su estado despachador de espera a listo. Esto a su vez incita al despachador a iniciar la planificación de hilos.

El despachador del núcleo utiliza un esquema de prioridad para determinar el orden en el cual los hilos deberían ejecutarse e incluso interrumpe o desplaza la ejecución de un hilo, si un hilo con prioridad más alta llega a estar listo para ejecutarse.

Inicialmente un hilo obtiene su prioridad del proceso en el cual es creado, el hilo hereda esa prioridad y puede alterarla para que sea ligeramente más alta o más baja. Para tomar decisiones en la planificación de hilos, el núcleo mantiene un conjunto de estructuras de datos conocidas colectivamente como la base de datos del despachador. Esta base de datos controla qué hilos están esperando a ser ejecutados y qué procesadores están ejecutando qué hilos. Las estructura de datos más importante en la base de datos del despachador se denomina cola de hilos listos des despachador. Ésta cola es en realidad un conjunto de colas, una para cada prioridad de planificación.

El executive de Windows NT soporta 32 niveles de prioridad, divididos en dos clases: tiempo real y prioridad variable. Los hilos de tiempo real son hilos de alta prioridad utilizados pro programas en los que el tiempo es un parámetro crítico. La mayoría de los hilos del sistema entran dentro de la clase de prioridad variable, se denominan de esta forma porque el despachador ajusta sus prioridades cuando se ejecutan para optimizar el tiempo de respuesta del sistema. Si un hilo interrumpido es un hilo con prioridad variable, el despachador disminuye la prioridad del hilo, el despachador eleva la prioridad de un hilo después de liberarlo de una operación de espera. El código del executive fuera del núcleo normalmente determina el tamaño del empuje de prioridad de un hilo, pero el tamaño del empuje sigue un patrón basado en lo que el hilo está esperando. En conjunto los hilos interactivos tienden a ejecutarse en una prioridad variable elevada, los hilos de E/S con una prioridad intermedia, y los hilos de proceso con una prioridad baja.

La afinidad con el procesador de un hilo también juega un papel a la hora de decidir el orden en el cual se ejecutan los hilos. El núcleo selecciona un hilo basándose en su prioridad, y después comprueba en qué procesadores su puede ejecutar el hilo.

Cuando no está sucediendo nada en el sistema, el núcleo suministra un hilo que siempre puede ser ejecutado. Estos hilos de denominan hilos ociosos, y el despachador los trata como si su prioridad estuviera por debajo de la de todos los demás hilos. Un hilo ocioso simplemente ejecuta un bucle, comprobando si otro hilo ha entrado en estado standby y está listo para ejecutarse en su procesador. El hilo ocioso también comprueba si hay funciones de llamadas de procedimiento aplazado para ser ejecutadas.

Después de que un hilo se ejecuta durante un quantum de tiempo completo, el núcleo lo desplaza y vuelve a planificar el procesador, la planificación también se pone en marcha cuando el hilo que se está ejecutando no puede continuar o cuando cambia el estado del hilo y su ejecución ya no es de la prioridad más alta.

Otros motivos por los cuales se puede poner en marcha la planificación son:

  1. Cuando un hilo está listo para ejecutarse.
  2. Cuando finaliza el quantum de tiempo de un hilo, cuando termina el hilo o cuando entra en el estado de espera.
  3. Cuando el despachador o el executive cambia la prioridad de un hilo.
  4. Cuando el ejecutor o un programa de aplicación cambia la afinidad con el procesador.

Al volver a planificar los hilos, el núcleo utiliza la base de datos del despachador para determinar rápidamente qué procesadores están ocupados, cuáles están ociosos y que prioridad de hilo está ejecutando cada procesador.

Para sacar a un proceso del procesador Windows NT realiza una selección de contexto, ésta varia en función de la arquitectura del procesador. Una selección de contexto típica requiere salvar volver a cargar el contador de programa, el registro de estado del procesador, los contenidos de otros registros, punteros a la pila del núcleo y del usuario y un puntero al espacio de direcciones en el cual se ejecuta el hilo. Para realizar esta selección de contexto el núcleo salva esta información empujándola en la pila de modo kernel del hilo actual, carga el contexto del nuevo hilo y si el nuevo hilo está en un proceso diferente, carga la dirección de su directorio de tabla de páginas para que su espacio de direcciones está disponible.

 

  1. MANEJO DE INTERRUPCIONES Y EXECPCIONES

Las interrupciones y las excepciones son condiciones del sistema operativo que desvían al procesador hacia código que está fuera del flujo normal de control. Cuando detecta una interrupción el procesador detiene lo que está haciendo y transfiere el control (despacha) a una localización especial de memoria, es decir, la dirección del código que gestiona la condición. En Windows NT, este código se denomina controlador de bloqueo .

Una interrupción es un evento asíncrono, que puede ocurrir en cualquier momento, no relacionado con lo que el procesador está ejecutando. Una excepción es una condición síncrona resultante de la ejecución de una instrucción particular. El núcleo de Windows NT trata las llamadas a servicios del sistema como excepciones.

El término bloqueo se refiere al mecanismo de un procesador para capturar la ejecución de un hilo cuando sucede una excepción o una interrupción, cambiado de modo usuario a modo protegido (no interrumpible), y transfiriendo el control a una localización fija del sistema operativo. Al ser invocado el controlador de bloqueo deshabilita brevemente las interrupciones mientras salva el estado de la máquina. Crea un marco de bloqueo en el cual almacena el estado de la ejecución del hilo interrumpido. El marco de bloqueo es un subconjunto del contexto completo de un hilo.

Las interrupciones generadas por hardware se originan normalmente en los dispositivos de E/S que deben notificar al procesador cuando necesitan un servicio. Los dispositivos activados mediante interrupción permiten que el sistema operativo consiga la máxima utilización del procesador al solapar el procesamiento central con las operaciones de E/S. El procesador pone en marcha una transferencia de E/S hacia o desde un dispositivo y después ejecuta otros hilos mientras el dispositivo completa la transferencia. El software también genera interrupciones, éstas pueden ser deshabilitadas por el procesador pero sólo lo hace cuando está en modo no interrumpible. Dentro del controlador de bloqueo del núcleo existe un submódulo llamado despachador de interrupciones, este módulo se encarga de gestionar las interrupciones, éstas interrupciones se ejecutan también según unas prioridades. Lo que hace el núcleo es que cuando ocurre una interrupción el controlador de bloqueo salva el estado de la máquina y llama al despachador de interrupciones que se encarga de verificar que tipo de interrupción es y que prioridad posee. Cuando se termina de ejecutar la rutina de servicio de la interrupción el procesador vuelve hasta donde estaba antes de ocurrir la interrupción y carga el estado de la máquina.

Al igual que para las interrupciones existe el despachador de interrupciones en el núcleo de Windows NT existe el despachador de excepciones que se encarga de gestionar las excepciones. La función de este submódulo es la de encontrar un controlador de excepción que pueda deshacerse de la excepción. Cuando sucede una excepción se pone en marcha una cadena de eventos en el núcleo. Se transfiere el control al controlador de bloqueo, que crea un marco de bloqueo( al igual que cuando ocurre una interrupción), después si intenta subsanar la excepción y cuando esto termina el procesador continua la ejecución cargando el estado en el que estaba antes de ocurrir la excepción.

Cómo podemos observar la planificación que realiza Windows NT para la utilización del micro permite ser un sistema multiprogramación y además un sistema distribuido ya que el núcleo está preparado para trabajar con distintos procesadores.

MS-DOS

El núcleo de MS-DOS se encuentra en un archivo llamado msdos.sys , este archivo contiene la parte independiente de la máquina del sistema operativo. El núcleo de MS-DOS maneja la administración de los procesos, la administración de la memoria y el sistema de archivos, así como la interpretación de todas las llamadas al sistema.

Cómo he dicho anteriormente la parte que vamos a tratar en esta práctica es la referente a la gestión de procesos, concretamente a la planificación de estos procesos en lo referente al tiempo de uso del microprocesador. La administración de los procesos en MS-DOS es directa, puesto que no existe multiprogramación. Cuando un proceso llama a load_and_exec, MS-DOS lleva a cabo esta llamada al sistema con los siguientes pasos:

En primer lugar encuentra un bloque de memoria lo bastante grande como para contener al proceso hijo, después construye el PSP en los primeros 256 bytes de la memoria asignada. Parte de la información proviene del PSP del padre, mientras que otra parte, como la línea de comandos, es exclusiva de este proceso. También se incluye en el PSP del hijo un apuntador de regreso al PSP del padre. En cierto sentido, el PSP es análogo a la estructura del usuario en Línux. Después de realizar esto carga el archivo ejecutable en binario en la memoria asignada, a partir del primer byte arriba del PSP, Una vez echo esto inicia el programa.

El papel que juegan los PSP es importante en MS-DOS ya que contiene toda la información de estado necesaria para ejecutar el proceso. Puesto que cada PSP contiene un apuntador de regreso al PSP de su padre, dado un apuntador al proceso activo, MS-DOS puede seguir la cadena de regreso hasta el interprete de ordenes.

Después de esta explicación parece que la planificación de la CPU en MS-DOS es totalmente trivial ya que sólo puede existir un proceso activo. Este proceso permanece en la CPU hasta que acaba su ejecución, o un programa TSR toma el control.

WINDOWS 95

También Windows 95 permite la multitarea al igual que casi todos los sistemas operativos anteriores de hecho en el momento en que se está ejecutando existe la multitarea ya que se ejecuta el Administrador de programas y otras diversas tareas que realmente forman parte del mismo sistema. En Windows 95 un proceso es un objeto al igual que en Windows NT o Amoeba, Windows considera cada VM-MSDOS como un único proceso independientemente de lo que suceda dentro de una VM. Cada aplicación en ejecución también es considerada como un proceso, todas estas aplicaciones son ejecutadas dentro de la VM del sistema y por tanto ésta posee mas de un proceso. En Windows 95, al igual que en NT, existe también el concepto de hebra (hilo). Una hebra define un camino de ejecución dentro de un proceso, y cualquier proceso puede crear muchas hebras, compartiendo todas la memoria asignada al proceso original. En este sistema operativo los servicios para hebras sólo están disponibles para las aplicaciones de 32 bits y los VxD. Cada aplicación de 16 bits utiliza una única hebra para su ejecución y con ello se conserva el modelo de multitarea cooperativa de las aplicaciones anteriores de Windows. Cualquier aplicación de Windows 95 puede crear hebras adicionales y éstas pueden ser planificadas con derecho preferente. Las hebras múltiples permiten que una única aplicación gestione fácilmente sus propias actividades en segundo plano y ofrecer al usuario una interfaz más sensible.

Cómo hemos visto un concepto importante en Windows es el de Máquina Virtual (VM) y por eso es el administrador de la máquina virtual (VMM) el verdadero corazón de la base del sistema de Windows 95. La eficiencia del VMM tiene un impacto decisivo en el rendimiento de todo el sistema y algunas de los componentes más complejos del sistema operativo residen ahí. Windows 95 usa los mismos tipos básicos de máquina virtual que Windows 3.1: La VM del sistema, en la que se ejecutan los componentes como el Núcleo, Usuario y GDI además de todas las aplicaciones, y la VM MS-DOS que ejecuta cada una sesión de dos con aplicaciones que se ejecutan bien en modo 8086 virtual o en modo protegido.

El componente del sistema que gestiona la CPU y cómo los procesos y hebras se van a ejecutar en el es el Planificador. Las técnicas que utiliza Windows 95 para la planificación de procesos son la de Cooperación y la de derecho preferente. La planificación de derecho preferente pone a disposición del sistema operativo un control completo sobre qué proceso se ejecuta a continuación y por cuanto tiempo. En cualquier momento, el planificador puede desplazar de la CPU al proceso en curso y asignársela a otro. Normalmente, tal acto de apropiación se producirá como respuesta directa a un suceso que demande un cambio de atención. El planificador asocia una prioridad con cada proceso en ejecución. Si se produce un suceso de interés para un proceso de alta prioridad, el planificador relega al proceso actual y da preferencia de ejecución al proceso de alta prioridad. El planificador consigue el control del sistema tanto cuando un proceso libera la CPU como cuando se produce una interrupción de reloj. Las prioridades de los procesos se recalculan frecuentemente y en este cálculo se tiene en cuenta también la duración del lapso de tiempo que el planificador dota a cada proceso. Con la técnica corporativa, el procesador puede conmutar entre procesos sólo cuando el proceso actualmente en ejecución entrega la CPU.

En Windows 95 en realidad no existe un sólo planificador sino que dentro del VMM existen dos planificadores, el planificador principal y el planificador de lapsos de tiempo. El primeros se encarga de calcular las prioridades de las hebras y el segundo de la asignación de los lapsos. Si una hebra no recibe tiempo de ejecución, ésta quedará suspendida hasta que el planificador vuelva a evaluar la situación.

El planificador principal examina cada hebra presente en el sistema y calcula un valor de prioridad de ejecución para la hebra, éste suspende cualquier hebra que tenga un valor de prioridad de ejecución inferior al valor más alto. Una vez que la hebra está suspendida el planificador principal no le presta más atención en el cálculo de prioridad durante el lapso en cuestión. Después el planificador de lapsos calcula el porcentaje de lapso a asignar a cada hebra, usando los valores de prioridad y conociendo el estado actual de la VM. Por último las hebras se ejecutan y el planificador principal volverá a evaluar las prioridades cada 20 milisegundos.

Como podemos imaginar en muchas ocasiones el VM del sistema tendrá muchas hebras que están listas para ser ejecutadas que poseen prioridades igual de altas, cuando esto ocurre el planificador de lapsos adopta una política de planificación igualitaria para asegurar una asignación justa de tiempo de ejecución entre éstas hebras. Una vez que una hebra dentro de la VM del sistema consume su tiempo asignado de ejecución, el planificador la coloca al final de la cola que contiene las hebras de igual prioridad. Esta técnica clásica asegura que todas las hebras con el nivel más alto de prioridad tienen una misma oportunidad de consumir su tiempo de procesador. Si la hebra elegida falla antes de consumir todo su tiempo asignado de procesador, el planificador concede el procesador a la siguiente hebra de igual prioridad en la VM del sistema.

Internamente el planificador utiliza tres técnicas como ayuda para lograr su objetivo de distribución equitativa del tiempo del procesador. Estas tres técnicas que utiliza son la de Prioridad dinámica estimulada que permite al planificador principal subir o bajar la prioridad de una hebra , Decaimiento de tiempo que hace que la prioridad estimulada vuelva gradualmente a su valor y Herencia de prioridad que permite convertir rápidamente una hebra de prioridad baja en una hebra de prioridad más alta. Normalmente se invierte la prioridad de una hebra para permitir que una hebra con una prioridad baja termine rápidamente su utilización de un recurso exclusivo por el que esperan hebras de prioridad más alta.

Como podemos ver, Windows 95 supone un gran avance en comparación con MS-DOS en el cual no existe la multitarea y por tanto sólo se puede ejecutar un proceso de forma ininterrumpida hasta que termine, pero este sistema operativo aún esta lejos de Windows NT o Amoeba el cual permiten gestionar no solo un sólo procesador con varios procesos sino varios procesadores y arquitecturas diferentes cada una con sus procesos e hilos (hebras).


©1998 Moisés Domènech Llorca