Beispiel #1
0
        /// <summary>
        /// Crea todas las condiciones necesarias para la simulacion y
        /// posteriormente la inicia simplemente diciendole a cada procesador
        /// que se ejecute
        ///
        /// Este metodo esta pensado en que se va a envolver en un hilo cuando se
        /// cree desde la vista!
        /// </summary>
        public void EjecutarSimulacion()
        {
            Debug.WriteLine("Simulador: Iniciando...");
            Debug.Flush();

            // Modificar aqui la cantidad de procesadores deseados!
            int numeroProcesadores = cantidadProgramas > 2 ? 3 : cantidadProgramas; //para ajustar la cantidad según necesidad

            // Se crean vectores para todos los objetos necesarios
            Controlador controlador = new Controlador();

            Procesador[]       procesadores       = new Procesador[numeroProcesadores];
            CacheInstrucciones cacheInstrucciones = new CacheInstrucciones(numeroProcesadores, instrucciones, iniciosProgramas, cantidadProgramas, nombresProgramas);

            CacheDatos[]       cachesDatos         = new CacheDatos[numeroProcesadores];
            Directorio[]       directorios         = new Directorio[numeroProcesadores];
            MemoriaPrincipal[] memoriasPrincipales = new MemoriaPrincipal[numeroProcesadores];

            // Se inicializan todos los objetos relacionados a los procesadores
            for (int i = 0; i < numeroProcesadores; ++i)
            {
                directorios[i]         = new Directorio(controlador, i);
                memoriasPrincipales[i] = new MemoriaPrincipal(controlador, i);
                cachesDatos[i]         = new CacheDatos(controlador, i);
                procesadores[i]        = new Procesador(controlador, i);
            }

            // Se agrega la interfaz como listener del controlador/modelo
            controlador.AddListener(interfaz);

            // Se inicializa el controlador que hasta el momento no conocia a nadie
            controlador.Inicializar(procesadores, cachesDatos, cacheInstrucciones, directorios, memoriasPrincipales);

            // Se crean los hilos necesarios
            Thread[] hilosProcesadores = new Thread[numeroProcesadores];
            for (int i = 0; i < numeroProcesadores; ++i)
            {
                // Se crea un hilo para cada procesador y se manda a ejectuar instrucciones
                hilosProcesadores[i] = new Thread(procesadores[i].Procesar);
                hilosProcesadores[i].Start();
            }

            // Cuando todos los procesadores comienzan, se empiezan a sincronizar
            // solos con ayuda del objeto controlador porque ahi esta la barrera

            // Se espera que cada procesador termine
            for (int i = 0; i < numeroProcesadores; ++i)
            {
                hilosProcesadores[i].Join();
            }

            // El hilo del simulador termina en el momento que todos los procesadores terminan!
        }
Beispiel #2
0
        /// <summary>
        /// Le indica al procesador que entra como parametro cual es el siguiente programa que deberia ejecutar
        /// Si no hay un siguiente programa, indica que el procesador ha palabraLeida su trabajo
        /// </summary>
        /// <param name="procesador">Procesador cuyo programa se quiere modificar</param>
        /// <returns>Debuelve true si cambia el programa del procesador</returns>
        public bool AsignarPrograma(Procesador procesador)
        {
            bool asignado = HaySiguientePrograma();

            if (asignado)
            {
                int direccionSiguientePrograma = GetDireccionSiguientePrograma();
                procesador.ProgramCounter = direccionSiguientePrograma;
                procesador.ResetearRegistros();
                programasAsignados[procesador.ID] = GetNombrePrograma(procesador.ProgramCounter);
                Debug.WriteLine("CacheInstrucciones: El procesador " + procesador.ID + " va a ejecutar el programa que empieza en " + direccionSiguientePrograma);
            }
            else
            {
                Debug.WriteLine("CacheInstrucciones: El procesador " + procesador.ID + " va a finalizar porque no hay mas programas que ejecutar");
                procesador.Finalizado = true;
            }
            return(asignado);
        }
Beispiel #3
0
 /// <summary>
 /// Devuelve el nombre del programa asignado en un procesador
 /// </summary>
 /// <param name="id">Id del procesador</param>
 /// <returns>Devuelve el nombre del programa en el procesador</returns>
 public String GetNombreProgramaAsignado(Procesador procesador)
 {
     return(programasAsignados[procesador.ID]);
 }