Sei sulla pagina 1di 7

2.

NACHOS MACHINE

Nachos simula una CPU real y todo el hardware incluyendo manejo de memoria, el
responsable de esta simulacin es el paquete nachos.machine.

2.1. CONFIGURIRNG NACHOS.

Nachos cuenta con un archivo llamado nachos.conf que hace las veces de BIOS, en l
se especfica que dispositivos de hardware de simularn y que Kernel usar nachos.

2.2. BOOT PROCESS

Una instancia de la clase nachos.machine.Machine es creada para dar inicio al
proceso de booting. Este objeto inicializa primero los dispositivos incluyendo
interrupt controller, timer, elevator controller, MIPS processor, console, y sistema
de archivos. Lo siguiente que hace el objeto es controlar el AutoGrader que est n
uso, lo que equivale a cargar el cdigo bootstrap desdeel boot al disco. Es este
AutoGrader quien crea el Kernel que dar inicio al sistema operativo nachos.
El kernel nachos no es ms que una subclase de nachos.machine.Kernel. Para
instancias el proyecto con hilos usa nachos.threads.ThreadedKernel.

2.3 NACHOS HARDWARE DEVICES.

2.3.1 INTERRUPT MANAGEMENT

La clase nachos.machine.Interrupt simula interrupciones manteniendo una
cola de eventos junto con un reloj simulado. Cuando el reloj avanza, la cola es
examinada en busca de eventos calendarizados que puedan tomar lugar en
el instante. El controlador de interrupciones es retornado por
Machine.interrupt().
Cada vez que se re-ensambla la interrupcin, el reloj avanza diez veces.
La clase interrupt est acompaada de tres mtodos:

schedule( ) toma un instante y un manejador de eventos como
argumentos, y calendariza el manejador especifico para que sea
llamado en el instante indicado.
tick( ) avanza una o diez veces, dependiendo si Nachos est en Kernel
o en modo usuario. Es llamado por setStatus( ) y tambin por
Processor.run( ).
checkIfDue( ) invoca manejadores de eventos para eventos en cola
hasta que ya no existan mas eventos por ejecutar, es invocado por
tick( ).




2.3.2 TIMER

Nachos proporciona una instancia de Timer para permitir simular un reloj
real. Machine.timer ( ) es quien retorna la referenciaal timer. Soporta dos
operaciones.
getTime( ) retorna la cantidad de avances hasta que Nachos inicia.
setInterruptHandler( ) fija el reloj manejador de interrupciones.

El timer puede ser usado para implementar apropiacin.

2.3.3 SERIAL CONSOLE

De las tres interfaces I/O que permite Nachos, la consola serial es la mas
simple, esta simula el comportamiento de un puerto serial, perimte la
escritura y lectura de pares de byte y nunca se bloquea.
La maquina de consola serial es retornada por Machine.console( ). La
operacin de lectura devuelve un byte si es que hay alguno disponible, caso
contrario retornar -1. La operacin de escritura inicia transmitiendo un
byte de datos y retorna inmediatamente, cuando ocurren dos operaciones de
escritura sin un interrupt se considera que la informacin transmitida no
est definida.

2.3.4 DISK

El sistema de archivos no ha sido portado aun, asi que el disco no se prob.

2.3.5 ENLACE DE RED

Instancias distintas de Nachos corriendo en la misma maquina pueden
comunicarse entre s con ayuda de la clase NetworkLink. Una instancia de
esta clase es retornada por Machine.networkLink( ).

La interface de enlace de red es similar a la consola serial, solo que en lugar
de enviar y recibir bytes a la vez, la interface de red recibe y enva paquetes.



3. THREADS AND SCHEDULING

Nachos trae consigo un paquete de manejo de hilos permitiendo a varias tareas
ejecutarse de forma consurrente. Una vez que los procesos de usuario son
implementados, estos pueden correr sobre el simulador de MIPS.


3.1 THREAD PACKAGE

Todos los threads de Nachos son instancias de nachos.threads.KThread. Un
objeto nachos.machine.TCB es destinado para cada KThread y provee
soporte de bajo nivel para contextos de interruptores, creacin de hilos,
destruccin de hilos y rendimiento.
Cada KThread tiene un estado miembro que muestra el estado del KThread.

statusNew. Nuevo creado, antes de bifurcarse.
statusReady. Un hilo esperando para entrar a la CPU. KThread.ready( ) que
aadir el hilo a la cola y pondr el estado en statusReady.
statusRunning. El hilo est en el instante corriendo en la CPU.
KThread.restoreState( ) es responsable de cambiar el estado a statusRunning
invocado por KThread.runNextThread().
statusBlocked. Un hilo que est dormido esperando por algn recurso
adems de CPU. Es fijado por KThread.sleep().
statusFinished. Un hilo calendarizado para destruirse. Se usa
KThread.finish() para fijar este estado.

3.2 SCHEDULER

Una subclase de la clase abstracta base es la responsable de la
calendarizacin de los hilos para todos los recursos limitados como la CPU,
construcciones de sincronizacin como un lock o incluso una operacin join
de hilos.
Para cada recurso una cola del tipo nachos.threads.ThreadQueue es creada
por medio de Scheduler.newThreadQueue( ). La implementacin del recurso
(por ejemplo la instancia de la clase nachos.threads.Semaphore) es
responsable aadir KThreads a la cola and solicitar a ThreadQueue que
retorne el siguiente hilo (ThreadQueue.nextThread( ) ).


3.3 CREATING THE FIRTS THREAD

El constructor de KThread sigue esta secuencia la primera vez que se llama:


1. Crear la cola (ThreadedKernel.scheduler.newThreadQueue()).
2. Asigna la CPU al nuevo hilo (readyQueue.acquire(this)).
3. Fija KThread.currentThread al nuevo KThread que est siendo creado.
4. Fija el objeto TCB de nuevo KThread al TCB.currentTCB(). Haciendo eso,
el actual hilo de java que est corriendo es asignado al objeto KThread que
est siendo creado.
5. Cambia el estado del nuevo KThread de defecto (statusNew) a
statusRunning. Esto se hace con statusReady .
6. Crea un hilo perezoso.
a. Hace otro KThread.
b. Bifurca el hilo perezoso desde el main.

3.4. CREATING MORE THREADS

Crear lo hilos subsecuentes es mas simple. Un nuevo KThread es creado,
pasndole al constructor un objeto Runnable, luego se llama fork( ):

KThread newThread = new KThread(myRunnable);
...
newThread.fork();

3.4.1 CLASES JAVA ANONIMAS EN NACHOS

El cdigo de nachos es relativamente limpio con la excepcin de
ciertas clases annimas usadas para replicar la funcionalidad de
apuntadores en C++. A continuacin se muestra un ejemplo de uso de
clases annimas en la creacin de un KThread.


Runnable myRunnable = new Runnable() {
public void run() {
myFunction();
}
};
KThread newThread = new KThread(myRunnable);


3.5 ON THREAD DEATH

Todos los hilos tienen recursos asignados necesarios para que pueda
ejecutarse. Como el hilo no puede por si mismo liberar dichos recursos debe
preguntar de forma virtual al siguiente hilo que correr para que los libere.
Esto est implementado en KThread.finish( ) quien fija
KThread.toBeDestroyed al hilo que se encuentre corriendo, este hilo queda
dormido por siempre; es decir, Nachos nunca lo intenta despertar.









Busy join


Para lograr un busy join se introdujo las siguientes 2 lineas de cdigo dentro del
mtodo join (antes vcio) de la clase KThread:

while(status!=statusFinished);
return;

El ciclo while se prolonga de manera indefinida hasta que el estado es equivalente a
statusFinished, en ese punto lo deja salir del ciclo y retorna. Se hace de est manera
en lugar de hacer un sleep y agrgarlo a una cola para que sea espera ocupada. A
continuacin se muestra el pantallaso del programa corriendo luego de la
implementacion busyJoin.


El programa muestra un error al realizer la prueba y esto es debido a que es possible que el join se llame
mas de una vez para el mismo hilo.

Potrebbero piacerti anche