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); }
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); }
//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); }