Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Captulo 8
Gestin de Archivos y Directorios
Contenido
1
Visin del usuario
Visin lgica:
Archivos
Directorios
Sistemas de archivos y particiones
Visin fsica:
Bloques o bytes ubicados en dispositivos
Visin Visin
lgica fsica
Funcin principal
SISTEMA
DE
FICHEROS
Proteccin
Sistemas operativos: una visin aplicada 3 J. Carretero, F. Garca, P. de Miguel, F. Prez
2
Caractersticas para el usuario
Sistema de archivos
3
Archivos: visin lgica
Conjunto de informacin relacionada que ha sido definida por su creador
Estructura de un archivo:
Secuencia o tira de bytes (UNIX, POSIX)
Posicin
Registros (de tamao fijo o variable)
Registro 1 C1 C2 C3 C4 C5 Registro 1 C1 C2 C3
Registro 2 C1 C2 C3 C4 C5 Registro 2 C1 C3 C4 C5
Registro 3 C1 C2 C3 C4 C5 Registro 3 C1 C2 C3 C4
Registro 4 C1 C2 C3 C4 C5 Registro 4 C1 C2 C3 C4 C5
Registro n C1 C2 C3 C4 C5 Registro n C1 C3 C4
Concepto de archivo
4
Representacin del archivo
Ejemplos de representacin
cabecera
Atributos
Tamao
Nombre
Nombre Seguridad
Atrib.
Size KB
Agrup. FAT Datos
Vclusters
5
Nombres de fichero y extensiones I
6
Estructura del fichero
Posicin
Visin lgica
Archivo A 1 2 3 4 5 6
Bloques: 13
20 7 8 9 10 11 12
1
8 13 14 15 16 17 18
3 19 20 21 22 23 24
16
19 25 26 27 28 29 30
Visin fsica
7
Archivos: visin fsica
Bloque
Unidad de transferencia
2n sectores
Parmetro fijo por sistema de archivos
Agrupacin
Unidad de asignacin
2p bloques
Aumenta la secuencialidad del archivo
Descripcin de la estructura fsica:
Bloques utilizados
Punteros
a Bloques
de Datos
Punteros
a Bloques
de Datos
Punteros
a Bloques
de Datos
8
Descripcin fsica en MS-DOS (FAT)
FAT
Directorio Raz
Nombre Atrib. KB Agrup.
27 <eof>
pep_dir dir 5 27
fiche1.txt 12 45
45 58
51 <eof>
Directorio pep_dir
Nombre Atrib. KB Agrup. 58 <eof>
carta1.wp R 24 74
74 75
prue.zip 16 91 75 76
76 <eof>
91 92
FAT de 12 bits 4K agrupaciones
FAT de 16 bits 64K agrupaciones
Mtodos de Acceso
9
Contenido
Concepto de directorio
10
Directorios: visin lgica
Esquema jerrquico.
Cuando se abre un archivo el SO busca el nombre en la
estructura de directorios.
Operaciones sobre un directorio:
Crear (insertar) y borrar (eliminar) directorios.
Abrir y cerrar directorios.
Renombrar directorios.
Leer entradas de un directorio.
Montar (combinar)
La organizacin jerrquica de un directorio
Simplifica el nombrado de archivos (nombres nicos)
Proporciona una gestin de la distribucin => agrupar
archivos de forma lgica (mismo usuario, misma aplicacin)
11
Ejemplo de entradas de directorio
Tipo de Contador
Nombre archivo de bloques
...
Directorio de CP/M
Nmero
Tipo de del primer
Nombre archivo Reservado Hora bloque
Directorio de MS-DOS
Nodo-i: Puntero al
descriptor del archivo Nombre
Directorio de UNIX
Sistemas operativos: una visin aplicada 22 J. Carretero, F. Garca, P. de Miguel, F. Prez
Directorio de un nivel
12
Directorio de dos niveles
stdio.h buzon
test agenda claves
datos lista.c claves
sh rm vi
mio.o
correo agenda
13
Directorio con estructura de rbol
Nombres jerrquicos
14
Interpretacin de nombres en LINUX. I
.
..
.
..
.
..
claves 758
textos 3265
Interpretar /users/miguel/claves
Traer a memoria entradas archivo con nodo-i 2
Se busca dentro users y se obtiene el nodo-i 342
Traer a memoria entradas archivo con nodo-i 342
Se busca dentro miguel y se obtiene el nodo-i 256
Traer a memoria entradas archivo con nodo-i 256
Se busca dentro claves y se obtiene el nodo-i 758
Se lee el nodo-i 758 y ya se tienen los datos del archivo
Cundo parar?
Se ha encontrado el nodo-i del archivo
No se ha encontrado y no hay ms subdirectorios
Estamos en un directorio y no contiene la siguiente
componente del nombre (por ejemplo, miguel).
15
Sistemas de archivos y particiones
MS-DOS
Dos copias Directorio Datos y
Boot
de la FAT Raz Directorios
UNIX
Super Mapas Datos y
Boot nodos-i
Bloque de bits Directorios
Contenido
16
Operaciones genricas sobre archivos
17
Archivos, directorios y servicios en
POSIX (UNIX)
Tipos de archivo:
Normales
Directorios
Especiales
Nombres de archivo y directorio:
Nombre completo (empieza por /)
/usr/include/stdio.h
Nombre relativo al directorio actual (no empieza por /)
stdio.h asumiendo que /usr/include es el directorio
actual.
La entradas . y .. pueden utilizarse para formar rutas de
acceso
../include/stdio.h
Servicio:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int creat(char *name, mode_t mode);
Argumentos:
name Nombre de archivo
mode Bits de permiso para el archivo
Devuelve:
Devuelve un descriptor de archivo -1 si error.
18
creat. Crea un archivo (II)
Descripcin:
El archivo se abre para escritura.
Si no existe crea un archivo vaci.
UID_dueo = UID_efectivo
GID_dueo = GID_efectivo
Si existe lo trunca sin cambiar los bits de permiso.
Ejemplos:
fd = creat("datos.txt", 0751);
fd = open("datos.txt", O_WRONLY | O_CREAT | O_TRUNC,
0751);
Servicio:
#include <unistd.h>
int unlink(const char* path);
Argumentos:
path nombre del archivo
Devuelve:
Devuelve 0 -1 si error.
Descripcin:
Decrementa el contador de veces que el archivo est abierto.
Si el contador es 0, borra el archivo y libera sus recursos.
19
open. abre un archivo
Servicio:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(char *name, int flag, ...);
Argumentos:
name puntero al nombre del archivo
flags opciones de apertura:
O_RDONLY Slo lectura
O_WRONLY Slo escritura
O_RDWR Lectura y escritura
O_APPEND El puntero de acceso se desplaza al final del archivo
abierto
O_CREAT Si existe no tiene efecto. Si no existe lo crea
O_TRUNC Trunca si se abre para escritura
Devuelve:
Un descriptor de archivo -1 si hay error.
Ejemplos:
fd = open("/home/juan/datos.txt");
fd = open("/home/juan/datos.txt",
O_WRONLY | O_CREAT | O_TRUNC, 0750);
20
close. Cierra un descriptor de archivo
Servicio:
int close(int fd);
Argumentos:
fd descriptor de archivo
Devuelve:
Cero -1 si error.
Descripcin:
El proceso pierde la asociacin a un archivo.
21
write. Escritura de un archivo
Servicio:
#include <sys/types.h>
ssize_t write(int fd, void *buf, size_t n_bytes);
Argumentos:
fd descriptor de archivo
buf zona de datos a escribir
n_bytes nmero de bytes a escribir
Devuelve:
Nmero de bytes realmente escritos -1 si error
Descripcin:
Transfiere n_bytes.
Puede escribir menos datos de los solicitados si se rebasa el tamao
mximo de un archivo o se interrumpe por una seal.
Despus de la escritura se incrementa el puntero del archivo con el
nmero de bytes realmente transferidos.
Si se rebasa el fin de archivo el archivo aumenta de tamao.
lseek.
Modifica el valor del puntero de posicin
Servicio:
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
Argumentos:
fd Descriptor de archivo
offset desplazamiento
whence base del desplazamiento
Devuelve:
La nueva posicin del puntero -1 si error.
Descripcin:
Coloca el puntero de acceso asociado a fd
La nueva posicin se calcula:
SEEK_SET posicin = offset
SEEK_CUR posicin = posicin actual + offset
SEEK_END posicin = tamao del archivo + offset
Sistemas operativos: una visin aplicada 43 J. Carretero, F. Garca, P. de Miguel, F. Prez
22
fnctl. modificacin de atributos de un archivo
Servicio:
#include <sys/types.h>
int fnctl(int fildes, int cmd /* arg*/ ...);
Argumentos:
fildes descriptor de archivos
cmd mandato para modificar atributos, puede haber varios.
Devuelve:
0 para xito -1 si error
Descripcin:
Modifica los atributos de un archivo abierto.
Servicio:
int dup(int fd);
Argumentos:
fd descriptor de archivo
Devuelve:
Un descriptor de archivo que comparte todas las propiedades del fd -1
si error.
Descripcin:
Crea un nuevo descriptor de archivo que tiene en comn con el
anterior:
Accede al mismo archivo
Comparte el mismo puntero de posicin
El modo de acceso es idntico.
El nuevo descriptor tendr el menor valor numrico posible.
23
stat.
Obtiene informacin sobre un archivo
Servicio:
#include <sys/types.h>
#include <sys/stat.h>
int stat(char *name, struct stat *buf);
int fstat(int fd, struct stat *buf);
Argumentos:
name nombre del archivo
fd descriptor de archivo
buf puntero a un objeto de tipo struct stat donde se
almacenar la informacin del archivo.
Devuelve:
Cero -1 si error
stat.
Obtiene informacin sobre un archivo
Descripcin:
Obtiene informacin sobre un archivo y la almacena en una estructura de
tipo struct stat:
struct stat {
mode_t st_mode; /* modo del archivo */
ino_t st_ino; /* nmero del archivo */
dev_t st_dev; /* dispositivo */
nlink_t st_nlink; /* nmero de enlaces */
uid_t st_uid; /* UID del propietario */
gid_t st_gid; /* GID del propietario */
off_t st_size; /* nmero de bytes */
time_t st_atime; /* ltimo acceso */
time_t st_mtime; /* ltima modificacion */
time_t st_ctime; /* ltimo modificacion de datos */
};
24
stat.
Obtiene informacin sobre un archivo
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
25
Ejemplo. Copia un archivo en otro (II)
close(fd_ent);
perror("open");
exit(-1);
}
26
Contenido
Struct dirent {
char *d_name; /* nombre archivo */
...
}
27
mkdir. Crea un directorio
Servicio:
#include <sys/types.h>
#include <dirent.h>
int mkdir(const char *name, mode_t mode);
Argumentos:
name nombre del directorio
mode bits de proteccin
Devuelve:
Cero -1 si error
Descripcin:
Crea un directorio de nombre name.
UID_dueo = UID_efectivo
GID_dueo = GID_efectivo
Sistemas operativos: una visin aplicada 54 J. Carretero, F. Garca, P. de Miguel, F. Prez
Servicio:
#include <sys/types.h>
int rmdir(const char *name);
Argumentos:
name nombre del directorio
Devuelve:
Cero -1 si error
Descripcin:
Borra el directorio si est vaco.
Si el directorio no est vaco no se borra.
28
opendir. Abre un directorio
Servicio:
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(char *dirname);
Argumentos:
dirname puntero al nombre del directorio
Devuelve:
Un puntero para utilizarse en readdir() o closedir().
NULL si hubo error.
Descripcin:
Abre un directorio como una secuencia de entradas. Se
coloca en el primer elemento.
Servicio:
#include <sys/types.h>
#include <dirent.h>
int closedir(DIR *dirp);
Argumentos:
dirp puntero devuelto por opendir().
Devuelve:
Cero -1 si error.
Descripcin:
Cierra la asociacin entre dirp y la secuencia de entradas de
directorio.
29
readdir. Lectura de entradas de directorio
Servicio:
#include <sys/types.h>
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
Argumentos:
dirp puntero retornado por opendir().
Devuelve:
Un puntero a un objeto del tipo struct dirent que representa una
entrada de directorio o NULL si hubo error.
Descripcin:
Devuelve la siguiente entrada del directorio asociado a dirp.
Avanza el puntero a la siguiente entrada.
La estructura es dependiente de la implementacin. Debera asumirse que
tan solo se obtiene un miembro: char *d_name.
Servicio:
#include <sys/types.h>
#include <dirent.h>
void rewindir(DIR *dirp);
Argumentos:
dirp puntero devuelto por opendir()
Descripcin:
Sita el puntero de posicin dentro del directorio en la
primera entrada.
30
link. Crea una entrada de directorio
Servicio:
#include <unistd.h>
int link(const char *existing, const char *new);
int symlink(const char *existing, const char *new);
Argumentos:
existing nombre del archivo existente.
new nombre de la nueva entrada que ser un enlace al archivo existente.
Devuelve:
Cero -1 si error.
Descripcin:
Crea un nuevo enlace, fsico o simblico, para un archivo existente.
El sistema no registra cul es el enlace original.
existing no debe ser el nombre de un directorio salvo que se tenga
privilegio suficiente y la implementacin soporte el enlace de directorios.
31
chdir. Cambia el directorio actual
Servicio:
int chdir(char *name);
Argumentos:
name nombre de un directorio
Devuelve:
Cero -1 si error
Descripcin:
Modifica el directorio actual, aquel a partir del cual se
forman los nombre relativos.
Servicio:
#include <unistd.h>
int rename(char *old, char *new);
Argumentos:
old nombre de un archivo existente
new nuevo nombre del archivo
Devuelve:
Cero -1 si error
Descripcin:
Cambia el nombre del archivo old. El nuevo nombre es
new.
32
getcwd. obtiene el nombre del directorio actual
Servicio:
char *getcwd(char *buf, size_t size);
Argumentos:
buf puntero al espacio donde almacenar el nombre del
directorio actual
size longitud en bytes de dicho espacio
Devuelve:
Puntero a buf o NULL si error.
Descripcin:
Obtiene el nombre del directorio actual
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
33
Programa que lista un directorio (II)
if (dirp == NULL) {
fprintf(stderr,"No puedo abrir %s\n", argv[1]);
} else {
Contenido
34
Sistemas de archivos y particiones
Tipos de particiones
Particin 4 Particin 5
Particin 2
Particin 3
35
Sistemas de archivos y particiones (I)
MS-DOS
Dos copias Directorio Datos y
Boot
de la FAT Raz Directorios
UNIX
Super Mapas Datos y
Boot nodos-i
Bloque de bits Directorios
36
Bloques y agrupaciones
800 100 %
75
500
50
100 uso del
ancho de
disco 25
50 banda
0 0
256 512 1K 2K 4K 8K 16K 32K
Tamao de Bloque
37
Estructuras de sistemas de archivos
Contenido
38
Servidor de archivos
Cache de
Servidor de Bloques Bloques
Manejadores de Dispositivo
...
39
Servidor de bloques
Descomposicin en operaciones de
bloques
Bloques
40
Manejadores de dispositivos
Flujo de datos en el S. de A.
Usuario buffer
tamao
archivo lgic o
(VFS)
Bloques lgicos
1756 bloques del
(Servidor 1340 840 8322
dispositivo
de bloques)
1340
1756
bloques del
Manejador de disco
disco y 840
dispositivo
8322
41
Relacin Sector Lgico y Sector Fsico (I)
42
Estructuras de datos asociadas al S. de A. (I)
Tabla de archivos abiertos (tdaa) por un proceso, dentro del BCP, con sus
descriptores temporales y el valor del apuntador de posicin del archivo para
ese proceso.
El tamao de esta tabla define el mximo nmero de archivos que cada
proceso puede tener abierto de forma simultnea.
El descriptor de archivo fd indica el lugar de tabla. La tdaa se rellena
de forma ordenada, de forma que siempre se ocupa la primera posicin
libre de la tabla.
En los sistemas UNIX cada proceso tiene tres descriptores de archivos
abiertos por defecto: entrada estndar, fd = 0, salida estndar, fd =
1, error estndar, fd = 2.
Correspondencia bloques-archivos
Cmo asignar los bloques de disco a un archivo y cmo hacerlos
corresponder con la imagen del archivo que tiene la aplicacin?
Asignacin de bloques contiguos.
Sencillo de implementar y el rendimiento de la E/S es muy bueno.
Si no se conoce el tamao total del archivo cuando se crea, puede ser necesario
buscar un nuevo hueco de bloques consecutivos cada vez que el archivo crece.
Fragmentacin externa -> compactar el disco.
Asignacin de bloques discontiguos.
Se asigna al archivo el primer bloque que se encuentra libre.
No hay fragmentacin externa del disco ni bsqueda de huecos.
Los archivos pueden crecer mientras exista espacio en el disco.
Complica la implementacin de la imagen de archivo -> mapa de bloques
del archivo.
43
Mecanismos enlazados
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
archivo A: 6 8 4 2
archivo B: 5 9 12
archivo C: 10 3 13
Mecanismos indexados
Cada archivo tiene sus bloques de ndice que incluyen apuntadores a
los bloques de disco del archivo.
El orden lgico se consigue mediante la insercin de los apuntadores en
orden creciente, a partir del primero, en los bloques de ndices.
Ventaja: basta con traer a memoria el bloque de ndices donde est el
apuntador a los datos para tener acceso al bloque de datos. Si un
apuntador de bloque ocupa 4 bytes y el bloque es de 4 Kbytes, con un
nico acceso a disco tendremos 1024 apuntadores a bloques del archivo.
Problema: el espacio extra necesario para los bloques de ndices.
Ese problema, fue resuelto en UNIX BSD combinando un sistema de ndices
puros con un sistema de ndices multinivel, que es que se usa actualmente en
UNIX y LINUX.
Permite almacenar archivos pequeos sin necesitar bloques de ndices.
Permite accesos aleatorios a archivos muy grandes con un mximo de 3
accesos a bloques de ndices.
44
Mapa de bloques en un nodo-i
nodo-i
Informacin
del archivo DISCO
820
...
Direcciones de
los 10 primeros 342
bloques 1623
8204 1134
Indirecto simple
...
10211
Indirecto doble Bloque
indirecto
Indirecto triple
2046
20464
675
45
Ejemplo de listas de recursos
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Incremento de prestaciones
46