Example #1
0
        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();
        }