El final fue sólo el punto de File Systems + una parte oral.

File Systems

4. File System

Parte a: Sea un disco que posee 256 bloques de 4KB (bytes) y un sistema operativo cuyos i-nodos son de 128 bytes, definir un sistema de archivos FFS.

<aside> 💡 $Resolución$

No hay una respuesta única, pero todo depende de la justificación. ¿Cuántos nodos entran en un bloque?

$$ \#inodos ~\times bloque = \frac{4KB}{128~bytes} = \frac{4 \times 1024 ~bytes}{128~bytes} = 32 $$

Tener más i-nodos que bloques de datos está mal, porque nunca los vas a poder aprovechar.

Un buen ratio podría ser 1 i-nodo por cada bloque de datos.

$$ \begin{aligned} & \text{1 inodo ------ 1 bloque de datos} \\ & \implies \text{32 inodos ------ 32 bloques de datos} \\ & \implies \text{1 bloque de inodos ------ 32 bloques de datos} \\ ~\\ &\text{Tengo que decidir la cantidad de bloques de inodos} \\

&\text{Tengo 256 bloques.} \\

&\text{256 / 32 es 8} \\ &\text{Puedo elegir cant(bloques inodos) = 8} \\ \end{aligned} $$

Entonces si tengo $8$ bloques de inodos, me queda espacio para $248$ bloques de datos.

Si agarramos más de esa cantidad, son demasiados i-nodos.

Si agarramos menos, no está mal, pero soportamos menos archivos con un promedio de tamaño de archivo más grande.

Los bloques separados para superbloque y para bitmaps se consideran dentro de los 248 bloques a ser leídos. En palabras de Mariano Mendez: “no sé por qué siempre separan antes esos bloques, no se hace”

</aside>

Parte b: Escriba un programa que utilice el API de archivos para simular un find, que recibe un nombre y lo busca en el directorio actual

int open (pathname, flags);
int creat(pathname, mode);
size_t read(fd, ..);
size_t write(fd, ..);
int unlink(path);
int stat(path, statbuf);
int fstat(int fd, statbuf);

struct stat {
	dev_t st_dev;
	ino_t st_ino;
	mode_t st_mode;
	nlink_t st_nlink;
	uid_t st_uid;
	guid_t st_guid;
	dev_t st_rdev;
	off_t st_size;
	blksize_t st_blksize;
	blkcnt_t st_blocks;
	struct timespace st_atim; // last access
	struct timespace st_mtim; // last modification
	struct timespace st_ctim; // last status change
}

struct dirent {
	ino_t d_fileno;
	char d_name[MAXNAMLEN + 1];
}

DIR* opendir(dirname);
struct dirent* readdir(DIR* dirst);
int closedir(DIR* dirstream);
void find(char *file) {
    DIR *dp; // declaro el puntero al directorio
    struct dirent *ep; // declaro el puntero a la lista de elementos del directorio

    dp = opendir("./"); // intento abrir el dir actual
    if (dp != NULL) { 
        while (ep = readdir(dp)) { // mientras pueda leer del stream del dir,
						// Me fijo que el string pasado se contenga en el nombre
						**if (strstr(ep->d_name, file) != NULL) {**
					    // imprimo el nombre
	            puts("%s",ep->d_name);
						}
				}
        closedir(dp); // cierro el directorio
    }
    else { // si no abrió, lanzo error
        perror("No such directory");
    }
    return 0;
}