public Proceso() { this.mem = new Memoria(); this.contexto = new List <Contexto>(); this.nucleo0 = new Nucleo(); this.nucleo1 = new Nucleo(); busDatos = new Bus(); busInstrucciones = new Bus(); reloj = 0; inicializarMemoria(); }
public Proceso() { this.mem = new Memoria(); this.contexto = new List <Contexto>(); this.nucleo0 = new Nucleo(); this.nucleo1 = new Nucleo(); busDatos = new Bus(); busInstrucciones = new Bus(); this.contextoFinal = new List <Contexto>(); reloj = 0; List <string> nombresHilillos = Misc.leerNombresHilillos(); inicializarMemoria(nombresHilillos); }
//TODO: cambiar el nombre del metodo /// <summary> /// Metodo que se encarga de poner una instruccion de la memoria de instrucciones en cache y luego en el IR del nucleo que entra como parametro /// </summary> /// <param name="nucleo">nucleo a utilizar</param> /// <param name="contextoActual">Instrucciones de los hilillos a ejecutar</param> public void iniciarHilo(ref Nucleo nucleo, ref Contexto contextoActual) { //ir a memoria y cargar la instruccion //Cargar el contexto nucleo.PC = contextoActual.PC; while (nucleo.PC != -1 /*si se termino el quantum*/) { int bloqueMemoria = (nucleo.PC - Constantes.Posicion_Inicial_Memoria_instrucciones) / Constantes.Cache_Instrucciones_Tamanio_Bloque; int palabra = ((nucleo.PC - Constantes.Posicion_Inicial_Memoria_instrucciones) % Constantes.Cache_Instrucciones_Tamanio_Bloque) / Constantes.Numero_Bloques_Cache; int posicionEnCache = bloqueMemoria % Constantes.Numero_Bloques_Cache; if (nucleo.CacheInstrucciones.Bloques[posicionEnCache].Etiqueta != bloqueMemoria || nucleo.CacheInstrucciones.Bloques[posicionEnCache].Estado == Constantes.Estado_Invalido) { //subir bloque de memoria a cache while (busInstrucciones.Bloqueado) { //probablemente haya que aumentar ciclos de reloj } busInstrucciones.Bloqueado = true; //Esto sube un bloque de memoria de instrucciones a cache nucleo.CacheInstrucciones.Bloques[posicionEnCache].Bloque = mem.Instrucciones[bloqueMemoria]; nucleo.CacheInstrucciones.Bloques[posicionEnCache].Etiqueta = bloqueMemoria; nucleo.CacheInstrucciones.Bloques[posicionEnCache].Estado = Constantes.Estado_Compartido; // busInstrucciones.Bloqueado = false; } nucleo.RegistroInstruccion = nucleo.CacheInstrucciones.Bloques[posicionEnCache].Bloque.Instrucciones[palabra]; //Esto probablemente deberia ir fuera de este metodo ProcesadorInstrucciones.procesarInstruccion(ref nucleo); //nucleo.CacheInstrucciones.imprimir(); } //nucleo.imprimirRegistros(); }