El final fue sólo el punto de File Systems + una parte oral.
<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>
find
, que recibe un nombre y lo busca en el directorio actualint 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;
}