コード例 #1
0
        public void agregaTableMap(int paginas, int proceso)
        {
            pageMapTable tablaProce = new pageMapTable(proceso);

            tablaProce.agregaPaginas(paginas);
            for (int i = 0; i < paginas; i++)
            {
                tablaProce = cargaAmemoria(i, tablaProce, proceso);
            }
            mainDataTables.Tables.Add(tablaProce.getPageTable());
        }
コード例 #2
0
        private pageMapTable cargaAmemoria(int pagina, pageMapTable tablaProce, int proceso)
        {
            int[] arr = new int[2];

            int[] paraFifo = new int[2];
            paraFifo[0] = proceso;
            arr         = M.getNextFreePF(true);
            if (arr[0] == -1)     //La memoria se lleno, por lo tanto tenemos que hacer swap out
            {
                swapOutFIFO();
                arr = M.getNextFreePF(true);
            }
            // Si existe marco libre en Memoria Real
            tablaProce.agregaDirPA(pagina, arr[0], arr[1], true); // Se asigna physical address low y high, e indicador que se encuentra en memoria M
            paraFifo[1] = pagina;
            FIFO.Enqueue(paraFifo);                               //agregamos el proceso a la cola para despues poderlos remover

            return(tablaProce);
        }
コード例 #3
0
        public int[] leeDireccion(int virtualAddres, int numProceso, int tipo_accion)
        {
            DataTable tableProceso;

            int[] arrResultado = new int[3]; //arr[0]= pagina N arr[1]=direccion real arr[2]=marcoPagina
            int   va_low, va_high, pa_low, direccion;

            tableProceso = mainDataTables.Tables["" + numProceso];
            if (tableProceso == null)
            {
                Console.WriteLine("El proceso " + numProceso + " no existe");
                return(arrResultado);
            }

            foreach (DataRow dataRow in tableProceso.Rows)
            {
                va_low  = (int)dataRow["Virtual Address low"];
                va_high = (int)dataRow["Virtual Address high"];
                pa_low  = (int)dataRow["Physical Address low"];
                int pagina = (int)dataRow["Pagina"];

                if (virtualAddres >= va_low && virtualAddres <= va_high)
                {
                    if ((bool)dataRow["Is on Memory"] == true)
                    {
                        int     posicion    = virtualAddres - (int)dataRow["Virtual Address low"];
                        decimal d           = pa_low / 16;
                        int     marcoPagina = Decimal.ToInt32(Math.Ceiling(d));
                        direccion       = marcoPagina * 16 + posicion;
                        arrResultado[0] = pagina;
                        arrResultado[1] = direccion;
                        arrResultado[2] = marcoPagina;
                    }
                    else
                    {   //Proceso de swap-in
                        timestamp[numProceso]  += TIME_CARGA;
                        pageFaults[numProceso] += 1;
                        pageMapTable dummyMap = new pageMapTable(-1);
                        dummyMap.agregaPagina(pagina);
                        dummyMap = cargaAmemoria(pagina, dummyMap, numProceso);
                        DataTable tempTable = dummyMap.getPageTable();
                        dataRow["Physical Address low"]  = dummyMap.getDirPA(pagina)[0];
                        dataRow["Physycal Address high"] = dummyMap.getDirPA(pagina)[1];
                        dataRow["Is on Memory"]          = true;
                        int     posicion    = virtualAddres - (int)dataRow["Virtual Address low"];
                        decimal d           = (int)dataRow["Physical Address low"] / 16;
                        int     marcoPagina = Decimal.ToInt32(Math.Ceiling(d));
                        direccion       = marcoPagina * 16 + posicion;
                        arrResultado[0] = pagina;
                        arrResultado[1] = direccion;
                        arrResultado[2] = marcoPagina;

                        Console.WriteLine("Se localizó la pagina " + arrResultado[0] + " del proceso " + numProceso);
                    }

                    if (tipo_accion == 1)
                    {
                        dataRow["Is modified"] = true;
                    }
                    else if (tipo_accion == 0)
                    {
                        dataRow["Is modified"] = false;
                    }
                }
            }

            timestamp[numProceso] += TIME_ACCESO;
            return(arrResultado);
        }