[2º Parcial Julio 2016 - Problema 2 - Parte 4]

[2º Parcial Julio 2016 - Problema 2 - Parte 4]

de Mathias Balduvino Duarte -
Número de respuestas: 4

Hola, tenemos una duda sobre la solución de esta parte del Ejercicio.
A grandes rasgos nuestra solución lo que hace es:

  - Recorrer el Sistema de Archivos SA(recorrida de directorios del sistema)
  - Si el directorio está usado, recorremos las entradas de ese directorio.
  - Si la entrada está usada y es del tipo ARCHIVO recorremos los bloques de ese archivo desde la FAT[entrada.comienzo]
  - En un array de booleanos de tamaño max_sectors_on_disck, si el bloque está usado(true) devolvemos FALSE ya que entendemos que otro archivo utiliza ese bloque.
  - Si el bloque está en FALSE se marca en TRUE identificandolo como usado

A diferencia de la solución planteada, nosotros recorremos los directorios desde el FS, pero en la solución, lo que entendemos es que se recorren los directorios en profundidad, nuestra duda es por qué es necesaria(o más performante) esa recorrida que recorrer los directorios del sistema directamente desde SA, ya que recorrer en profundidad entendemos que implica un nivel de dificultad y tiempo mayor a nuestra solución.

Gracias.

En respuesta a Mathias Balduvino Duarte

Re: [2º Parcial Julio 2016 - Problema 2 - Parte 4]

de Manuel Freire -

Buenas, 

No entiendo mucho a que te estás refiriendo con las recorridas "en profunidad" y "desde el FS". Por lo que decís me genera dudas si estarás hablando de la parte 4 (mover archivo) ¿Puede ser que la hayas confundido con la parte 3 (chequear FS)? También te quería pedir si podés poner un pseudocódigo de lo que hiciste así puedo ayudarte un poco más y ver a qué te referís.

Saludos!

En respuesta a Manuel Freire

Re: [2º Parcial Julio 2016 - Problema 2 - Parte 4]

de Mathias Balduvino Duarte -

Sí, fue un error mío, es la parte 3.
Lo que queremos decir por recorrida en profundidad es que se recorren todas las entries de un directorio y si encontras un directorio dentro del que vas recorriendo es el siguiente a recorrer. Nos parece que igualmente tenes que recorrer todos los directorios del SA y se puede hacer recorriendo el array de dir SA.
pseudocodigo:

bloques = array of boolean; // inicializado en false
for i = 0 to max_dir -1 do //recorro todos los directorios del SA
  if SA[i].used then
    for i = 0 to max_entry_dirs -1 do
      if  SA[i].dir_entry[j].used && SA[i].dir_entry[j].tipo = ARCHIVO THEN
        if(!checkArchivo(SA[i].dir_entry[j]) then return false;
        indice = SA[i].dir_entry[j].comienzo;
        while(indice <> 0) do
          if(bloques[indice]) then return true;//significa que otro archivo usó ese bloque
          bloques[indice] = true;
          indice = FAT[indice];//siguiente bloque de este archivo
        end while;
      end if;
   end for;
 end if;
end function;

En respuesta a Mathias Balduvino Duarte

Re: [2º Parcial Julio 2016 - Problema 2 - Parte 4]

de Manuel Freire -

"Nos parece que igualmente tenes que recorrer todos los directorios del SA y se puede hacer recorriendo el array de dir SA" 

En realidad no es necesario recorrer todos los directorios del SA para chequear la correctitud de todos los archivos del sistema ¿Por qué? Porque lo que está en el sistema de archivos es en definitiva todo lo alcanzable navegando desde root entonces si hay entradas que no son alcanzables ¿Qué sentido tiene chequearlas? Ninguno.

Es por esto que la solución es más performante que la que ustedes proponen, si en el SA de archivos tuviéramos / /home y /sistoper y dentro de cada directorio un archivo la recorrida propuesta solo transita por esos tres directorios y chequea 3 archivos mientras que la de ustedes lo hace con max_dir_entrys. En caso de que el sistema este lleno o casi lleno es cuando la eficiencia de las dos se parece pero en cualquier otro hay grandes diferencias.

Espero haber aclarado y cualquier cosa repreguntá.

Saludos!