Beispiel #1
0
        public int Write(string name, int idProc, int offset, int cant_uA)
        {
            int tOP     = 0;
            int posArch = BuscaArch(name);

            if (posArch != -1)                                                                                    // Verifico que el archivo este creado
            {
                if (TablaArchivos[posArch].getEstado() == idProc)                                                 // Verifico que el proceso que abrio el archivo sea el que lo quiere leer
                {
                    int         inicio    = (int)Math.Floor((decimal)(offset) / (decimal)(disp.GetTamBloques())); //bloque donde comienza a leerse
                    int         fin       = (int)Math.Ceiling((decimal)(offset + cant_uA) / (decimal)(disp.GetTamBloques()));
                    Indicadores indicador = new Indicadores();
                    Archivo     arch      = TablaArchivos[posArch];                                     //busco archivo en la tabla

                    if (fin > arch.getTablaDireccion().Count&& GetOrganizacionFisica() == Org.Contigua) //solo se realoca si es contigua
                    {
                        if (!realocar(ref arch, fin, arch.getTablaDireccion().Count, ref indicador))    //PROBAR SI MODIFICA ARCH ASI!!!!!!!
                        {
                            throw new Exception("No se pudo realocar.");
                        }
                    }
                    else if (fin > arch.getTablaDireccion().Count) //para enlazada e indexada
                    {
                        indicador.tGestionTotal = disp.TprocesamientoBloquesLibres(GetAdminEspacio(), fin - arch.getTablaDireccion().Count);
                    }

                    switch (GetOrganizacionFisica())
                    {
                    case Org.Contigua:
                    {
                        indicador.tGestionTotal += disp.GetTseek();         //el t de gestion es el t en ir al primer bloque
                        break;
                    }

                    case Org.Enlazada:
                    {
                        int bloqueLeido = -1;

                        for (int i = 0; i < fin; i++)
                        {
                            if (arch.getTablaDireccion()[i] != bloqueLeido - 1)         //comprueba si los bloques son contiguos
                            {
                                indicador.tGestionTotal += disp.GetTseek();
                            }
                            bloqueLeido = arch.getTablaDireccion()[i];
                        }

                        indicador.tGestionTotal += inicio * disp.GetTlectura();

                        break;
                    }

                    case Org.Indexada:
                    {
                        indicador.tGestionTotal += (2 * disp.GetTseek() + disp.GetTprocesamient()) * (fin - inicio);
                        break;
                    }
                    }

                    indicador.tEspera         = tSimulacion - TablaOperaciones[getOpActual()].Tarribo;
                    indicador.tLectoEscritura = (fin - inicio) * disp.GetTescritura();
                    indicador.tSatisfaccion   = indicador.tGestionTotal + indicador.tEspera + indicador.tLectoEscritura;
                    indicador.tipoOp          = 'W';

                    tOP = indicador.tSatisfaccion - indicador.tEspera;
                    indicadoresOP.Add(indicador);
                }
                else
                {
                    if (!Find(ColaEspera, GetContadorOp()))
                    {
                        ColaEspera.Add(GetContadorOp()); // Si no es asi, lo agrego a la cola de espera
                    }
                }
            }


            return(tOP);
        }
Beispiel #2
0
        public int Read(string name, int idProc, int offset, int cant_uA)
        {
            int tOP     = 0;
            int posArch = BuscaArch(name);

            if (posArch != -1)                                      // Verifico que el archivo este creado
            {
                if (TablaArchivos[posArch].getEstado() == idProc)   // Verifico que el proceso que abrio el archivo sea el que lo quiere leer
                {
                    Archivo     arch      = TablaArchivos[posArch]; //busco archivo en la tabla
                    Indicadores indicador = new Indicadores();

                    int inicio = (int)Math.Floor((decimal)(offset) / (decimal)(disp.GetTamBloques())); //bloque donde comienza a leerse
                    int fin    = (int)Math.Ceiling((decimal)(offset + cant_uA) / (decimal)(disp.GetTamBloques()));

                    if (fin > arch.getTablaDireccion().Count) // Control de cuanto se quiere leer
                    {
                        throw new Exception("Se quiere leer mas de lo que hay");
                    }
                    switch (GetOrganizacionFisica())
                    {
                    case Org.Contigua:
                    {
                        indicador.tGestionTotal = disp.GetTseek();         //el t de gestion es el t en ir al primer bloque
                        break;
                    }

                    case Org.Enlazada:
                    {
                        int bloqueLeido = -1;

                        for (int i = 0; i < fin; i++)
                        {
                            if (arch.getTablaDireccion()[i] != bloqueLeido - 1)        //comprueba si los bloques son contiguos
                            {
                                indicador.tGestionTotal += disp.GetTseek();
                            }
                            bloqueLeido = arch.getTablaDireccion()[i];
                        }

                        indicador.tGestionTotal += inicio * disp.GetTlectura();

                        break;
                    }

                    case Org.Indexada:
                    {
                        indicador.tGestionTotal = (2 * disp.GetTseek() + disp.GetTprocesamient()) * (fin - inicio);
                        break;
                    }
                    }

                    indicador.tEspera         = tSimulacion - TablaOperaciones[getOpActual()].Tarribo;
                    indicador.tLectoEscritura = (fin - inicio) * disp.GetTlectura();
                    indicador.tSatisfaccion   = indicador.tGestionTotal + indicador.tEspera + indicador.tLectoEscritura;
                    indicador.tipoOp          = 'R';

                    tOP = indicador.tSatisfaccion - indicador.tEspera;

                    indicadoresOP.Add(indicador);
                }
                else // Si el archivo esta abierto x otro proceso --> lo agrego a la cola de espera
                {
                    if (!Find(ColaEspera, GetContadorOp()))
                    {
                        ColaEspera.Add(GetContadorOp()); // Si no es asi, lo agrego a la cola de espera
                    }
                }
            }
            return(tOP);
        }
Beispiel #3
0
        //Devuelve true si se pudo asignar el espacio necesitado (bloques libres) y false si no pudo
        public bool GetLibres(int uAdeseada, Org OrgaFisica, ref Archivo arch)
        {
            bool ObtuveLibres = false;

            if (OrgaFisica == Org.Contigua)
            {
                int bloquesDeseados = (int)Math.Ceiling((decimal)uAdeseada / (decimal)tamBloque);

                List <int> bloquesLibres = new List <int>(bloquesDeseados);

                try
                {
                    bloquesLibres.AddRange(getDireccionBloqueContiguo(bloquesDeseados));
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error: " + e);
                }

                if (bloquesLibres.Count != 0)
                {
                    ObtuveLibres = true; //si obtuve libres devuelvo verdadero
                    arch.TablaDireccion_AddRange(bloquesLibres);
                }//sino devuelve false
            }
            else if (OrgaFisica == Org.Enlazada)
            {
                int bloquesDeseados = (int)Math.Ceiling((decimal)(uAdeseada) / (decimal)(tamBloque - tamIndice));

                List <int> bloquesLibres = new List <int>(bloquesDeseados);

                try
                {
                    bloquesLibres.AddRange(getDireccionBloqueLibre(bloquesDeseados));
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error: " + e);
                }

                if (bloquesLibres.Count != 0)
                {
                    ObtuveLibres = true; //si obtuve libres devuelvo verdadero
                    arch.TablaDireccion_AddRange(bloquesLibres);

                    // Asigno el tamaño del indice a las uABurocracia de cada bloque asignado
                    for (int i = 0; i < bloquesDeseados; i++)
                    {
                        // Obtengo la posicion del bloque
                        int posBloque = (int)arch.getTablaDireccion()[i];
                        TablaBloques[posBloque].uABurocracia = tamIndice;
                    }
                }//sino devuelve false
            }


            else if (OrgaFisica == Org.Indexada)
            {
                int bloquesDeseados = (int)Math.Ceiling((decimal)uAdeseada / (decimal)tamBloque);


                if (checkStorage(bloquesDeseados, arch.getTablaIndices()))
                {
                    List <int> bloquesLibres = new List <int>(bloquesDeseados);

                    try
                    {
                        bloquesLibres.AddRange(getDireccionBloqueLibre(bloquesDeseados));
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("Error: " + e);
                    }

                    if (bloquesLibres.Count != 0)
                    {
                        ObtuveLibres = true; //si obtuve libres devuelvo verdadero
                        arch.TablaDireccion_AddRange(bloquesLibres);

                        try
                        {
                            arch.TablaIndice_AddRange(getDireccionBloqueLibreIndice(bloquesDeseados, arch.getTablaIndices()));
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine("Error: " + e);
                        }
                    }//sino devuelve false
                }
            }

            return(ObtuveLibres);
        }