Upload
emilia-palma-sosa
View
273
Download
0
Embed Size (px)
Citation preview
E/S AvanzadaE/S Avanzada
Programación de
Sistemas
Programación de Sistemas 2
IndiceIndice
• Conceptos Previos
• Modelos de E/S
• E/S Multiplexada
• E/S Conducida por señales
• E/S Asíncrona
• Ficheros mapeados en memoria
Programación de Sistemas 3
IntroducciónIntroducción
• Conceptos Previos
Programación de Sistemas 4
IntroducciónIntroducción
• El manejo de la E/S de un sistema operativo es un punto clave.
• Uno de los objetivos de un sistema operativo es ocultar a los usuarios las particularidades de ciertos dispositivos hardware.
Programación de Sistemas 5
Conceptos PreviosConceptos Previos
• UNIX soporta un esquema generalizado de concepción sobre los dispositivos periféricos y sus operaciones de E/S como distintos ficheros.
• A estos ficheros se les conoce como archivos de dispositivos
Programación de Sistemas 6
Conceptos PreviosConceptos Previos
• A cada archivo especial le corresponde un controlador de dispositivo (device driver) cuyo código se integra en el núcleo. – Un proceso abre un archivo especial, sus
peticiones de lectura y escritura se transmiten al controlador de dispositivo correspondiente.
Programación de Sistemas 7
Conceptos PreviosConceptos Previos
• Tipos de archivos especiales– modo bloque (discos)
– modo carácter (puertos series y parelelos)
• Características de archivos especiales– tipo (bloque o carácter).– número mayor: identifica el controlador.– número menor: el dispositivo físico
Programación de Sistemas 8
Conceptos PreviosConceptos Previos
• Manejo de archivos especiales– Creacion
• mknod mknod (const char pathname, mode_t mode,
dev_t dev);
– Tratamiento• open; open (const char pathname, int flags, mode_t mode); • read; ssize_t read (int fd, void *buf, size_t count);
• write; ssize_t write (int fd, void *buf, size_t count);
• lseek; off_t lseek (int fildes, off_t offset, int whence);
• close; int close (int fd );
Programación de Sistemas 9
Conceptos PreviosConceptos Previos
• Modos de operación – E/S bloqueante (blocking I/O)– E/S No bloqueante (nonblocking I/O)– E/S Multiplexada (I/O multiplexing),– E/S conducida por señales (signal driven I/O)– E/S asíncrona (I/O asynchronous).
Programación de Sistemas 10
Modelos de E/SModelos de E/S
• E/S bloqueante• E/S no bloqueante • E/S multiplexada• E/S conducida por señales• E/S asíncrona
Programación de Sistemas 11
Modelos de E/SModelos de E/S
• Entrada/Salida bloqueante– Es el esquema más general y extendido. – Todo proceso que efectúa una operación de
E/S queda bloqueado desde la llamada al sistema para la operación hasta que los datos son copiados en el buffer del proceso.
– Al final recibe una notificación por parte del núcleo de que la operación ha concluido.
Programación de Sistemas 12
E/S bloqueanteE/S bloqueante
copia completada
Proceso bloqueado en la llamada a recvfrom
aplicación kernel
recvfromLlamada al sistema
datagrama no recibido
datagrama recibidocopiar datagrama
Esperando por los datos
procesar el datagrama recibido
Retorno OK
Copiado de los datos del kernel al usuario
Programación de Sistemas 13
Modelos de E/SModelos de E/S
• Entrada/Salida no bloqueante– Indicarle al kernel que cuando algunos de
nuestros procesos realice una petición de operación E/S la cuál no puede ser completada o realizada sin tener que poner el proceso en estado sleep, entonces no ponga al proceso en este estado y nos avise mediante un error.
– Interrogación periódica
Programación de Sistemas 14
E/S no bloqueanteE/S no bloqueante
datagrama recibido
EWOULDBLOCKrecvfrom
Llamada al sistemadatagrama no recibido
copia completada
Proceso repetidamente llama a la función recvfrom esperando por un OK (polling)
aplicación kernel
copiar datagrama
Esperando por los datos
procesar el datagrama recibido
Retorno OK
EWOULDBLOCKrecvfrom
Llamada al sistemadatagrama no recibido
recvfromLlamada al sistema
Copiado de los datos del kernel al usuario
Programación de Sistemas 15
Modelos de E/SModelos de E/S
• Entrada/Salida Multiplexada– Tenemos un proceso en espera de varias
peticiones de E/S pertenecientes a varias operaciones e incluso varios ficheros de dispositivo.
– Multiplexar la actuación en cada una de ellas.
– Utilizamos las funciones select o poll
Programación de Sistemas 16
E/S MultiplexadaE/S Multiplexada
Llamada al sistema
copia completada
Proceso bloqueado en la llamada a select Esperando por algún dato disponible
aplicación kernel
selectLlamada al sistema
datagrama no recibido
datagrama recibido
copiar datagrama
Esperando por los datos
procesar el datagrama recibido
Retorno OK
Proceso bloqueado mientras el dato es copiado al buffer
dato disponible
recvfrom
Copiado de los datos del kernel al usuario
Programación de Sistemas 17
Modelos de E/SModelos de E/S
• Entrada/Salida Conducida por señales
– El kernel nos notifica mediante el uso de una señal cuando una operación por la que un proceso esperaba está lista para ser iniciada.
– El proceso no permanece bloqueado mientras espera a que los datos estén listos
– Se bloquea durante la copia en el buffer.
Programación de Sistemas 18
E/S conducida por señalesE/S conducida por señales
sigaction
Establecer un manipulador de señales para SIGIO
Llamada al sistema
copia completada
Proceso continua su ejecución
aplicación kernel
Llamada al sistema
datagrama recibido
copiar datagrama
Esperando por los datos
procesar el datagrama recibido
Retorno OK
Proceso bloqueado mientras el dato es copiado al buffer
señal SIGIO
recvfrom
Copiado de los datos del kernel al usuario
manipulador de señales
Programación de Sistemas 19
Modelos de E/SModelos de E/S
• Entrada/Salida Asíncrona– Este modelo de E/S es nuevo a partir de la
edición de la norma Posix.1 en 1993– El proceso no se bloquea en la operación.– En el modelo asíncrono el kernel nos indica
cuando la operación está completada
– Sus funciones son del tipo aio_XXX• aio_read• aio_write
Programación de Sistemas 20
E/S AsíncronaE/S Asíncrona
Señal especificadaen aio_read
copia completada
Proceso continua su ejecución
aplicación kernel
aio_read Llamada al sistema datagrama no recibido
datagrama recibidocopiar datagrama
Esperando por los datos
Manipulador de señales procesa el datagrama recibido
Copiado de los datos del kernel al usuario
retorno
Programación de Sistemas 21
Comparativa Comparativa Modelos de E/SModelos de E/S
inicio
completado
pollpollpollpollpollpollpoll
completado
preparación
listoinicio
completado
notificaciónincio
completado
inicio
notificación
bloqueado
block
block
block
block
Bloqueante | No bloqueante | Multiplexada | Por señales | Asíncrona
Programación de Sistemas 22
E/S MultiplexadaE/S Multiplexada
• select• pselect• poll
Programación de Sistemas 23
IntroducciónIntroducción
• ¿ Qué es la entrada/salida ¿ Qué es la entrada/salida multiplexada?multiplexada?
Técnica que nos permite que un proceso pueda quedar en espera de datos al acceder a uno o varios dispositivos.
Programación de Sistemas 24
IntroducciónIntroducción
• ¿ Cómo se realiza la entrada/salida ¿ Cómo se realiza la entrada/salida multiplexada ?multiplexada ?Paso de a una función de una lista de descriptores de los dispositicos.
Esta función no retornará hasta que al menos uno de los descriptores está listo
Devolverá los descriptores listos.
Programación de Sistemas 25
Primitivas en LinuxPrimitivas en Linux
• Depende de la norma de Linux.
– BerkeleyEn su versión 4.2 surgió la primitiva selectselect
– System V Release 3 Proporciona el pollpoll
– Posix Introduce el pselectpselect
Programación de Sistemas 26
La primitiva La primitiva selectselect
• Pone el proceso actual en espera de cambio de sobre varios descriptores.
#include <sys/type.h>#include <sys/time.h>#include <unistd.h>
int select(int n, fd_set *readfds, fd_set *writefds, fd_set *readfs, const struct timeval *timeout);
Programación de Sistemas 27
– El parámetro nNúmero de descriptores a los que el proceso llama para pedir información de control o realizar una lectura o escritura.
– En la gran mayoria de las versiones de linux el número de descriptores por proceso está limitado.
Los parámetros Los parámetros selectselect
Programación de Sistemas 28
– Descriptores a interrogarSaber si se pueden leer, escribir o conocer información del dispositivo.
Los parámetros de Los parámetros de selectselect
Readfds Dispositivos a leer.
Writefds Dispositivos a escribir.
Exceptfds Dispositivos a conocer su estado.
Programación de Sistemas 29
Los parámetros de Los parámetros de selectselect
– Son máscaras de bits.
– Cada descriptor pone a 1 el bit de la posición correspondiente a su valor.
– Es necesario un array de enteros.
fd_setFD_SETSIZE
Programación de Sistemas 30
Los parámetros del Los parámetros del selectselect
• Macroinstrucciones paraMacroinstrucciones para fd_set fd_set
Macroinstrucción Significado
FD_ZERO (fd_set *fdset) Inicialización a cero de ungrupo
FD_ISSET (int fd, fd_set*fdset)
Comparación de presencia deun descriptor a un grupo
FD_SET (int fd, fd_set*fdset)
Adición de un descriptor a ungrupo
FD_CLR (int fd, fd_set*fdset)
Supresión de un descriptor deun grupo
Programación de Sistemas 31
Los parámetros de Los parámetros de selectselect
– Timeout Tiempo máximo a esperar desde que select entra en ejecución hasta que devuelve el control.
struct timeval {long tv_sec; // segundos long tv_usec
//microsegundos };
Programación de Sistemas 32
Los parámetros de Los parámetros de selectselect
– Si timeout=NULL espera indefinida.
– Si timeout->tv_sec!=0 || timeout->tv_usec!=0 espera un tiempo especificado.
– Si timeout->tv_sec=0 || timeout->tv_usec=0 no se produce espera (testeo y retorno).
• Posibles valores de timeout
Programación de Sistemas 33
Valores devueltos Valores devueltos selectselect
• El valor devuelto: Devuelve el número de descriptores listos.
Si el tiempo expira y no hay ninguno
listo devolverá cero.
En caso de error se retornará -1 y el tipo de
error en la variable errno.
Programación de Sistemas 34
Valores devueltos Valores devueltos selectselect
• Posibles valores de Posibles valores de errno errno
Error Significado
EBADFSe ha especificado un descriptorde entrada/salida incorrecto enuno de los grupos.
EINTRSe ha recibido una señal durante laespera.
EINVAL n contiene un valor negativo
ENOMEMEl núcleo no ha podido asignarmemoria para sus descriptores
Programación de Sistemas 35
fd_set readset, writeset;
FD_ZERO(&readset);
FD_ZERO(&writeset);
FD_SET(0, &readset);
FD_SET(3, &readset);
FD_SET(1, &writeset);
FD_SET(2, &writeset);
select(4, &readset, &writeset, NULL, NULL);
Ejemplo de uso Ejemplo de uso
Programación de Sistemas 36
La primitiva La primitiva pselectpselect
#include <time.h>#include <sys/select.h>#include <signal.h>
int pselect(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout, const sigset_t *sigmask);
• Funciona como el select pero añade algunas mejoras.
Programación de Sistemas 37
Cambios de Cambios de pselectpselect
– La forma de medir el retardo Introduce la estructura timespec en lugar de timeout.
struct timespec {time_t tv_sec;
//segundos long tv_nusec;
//nanosegundos };
Programación de Sistemas 38
Cambios de Cambios de pselectpselect
– Tratamiento de señales Se introduce en el sexto argumento. Un puntero a una máscara de señales
Permite al programa inhibir la liberación de ciertas señales.
Programación de Sistemas 39
La primitiva La primitiva pollpoll
• Funcionalmente similar al select pero añade tratamiento adicional con los streams.
#include <poll.h>
int poll(struct pollfd *fdarray, unsigned long *nfds, int *timeout);
Programación de Sistemas 40
Los parámetros de Los parámetros de pollpoll
– La lista de descriptoresEs un vector un vector de pollfd.
– Cada elemento del vector especifica las condiciones para el testeado de un descriptor.
struct pollfd {int fd; // descriptor short events; //Evento
solicitado short revents; // Eventos
ocurridos };
Programación de Sistemas 41
Los parámetros de Los parámetros de pollpoll
• Constantes de entrada para Constantes de entrada para events events yy revents reventsConstantes events revents Descripción
POLLIN Puede leerse undato normal opriority band
POLLRDNORM Puede leerse undato normal
POLLBAND Puede leerse undato con priorityband
POLLPRI Puede leerse undato con highpriority
Programación de Sistemas 42
Los parámetros de Los parámetros de pollpoll
• Constantes de salida para Constantes de salida para events events yy revents revents
Constantes events revents Descripción
POLLOUT Puede escribirseun dato normal opriority band
POLLWRNORM Puede escribirseun dato normal
POLLWRBAND Puede escribirseun dato conpriority band
Programación de Sistemas 43
Los parámetros de Los parámetros de pollpoll
• Constantes tratamiento de errores para Constantes tratamiento de errores para events events yy reventsrevents
Constantes events revents Descripción
POLLERR A ocurrido unerror
POLLHUP Colgado
POLLNVAL Descriptor noabierto
Programación de Sistemas 44
Los parámetros de Los parámetros de pollpoll
– El parámetro nfdsNúmero de descriptores a los que el proceso llama para pedir información de control o realizar una lectura o escritura.
– Al contrario que con el select la localización en memoria de los descriptores es problema del llamador.
Programación de Sistemas 45
Los parámetros de Los parámetros de pollpoll
– Timeout Tiempo máximo a esperar desde que poll entra en ejecución hasta que devuelve el control.
El valor se ha de expresar en milisegundos.Valor de timeout Descripción
INFTIN Esperar para siempre
0Retorna inmediatamente, nobloquea
>0Esperar un número específicode milisegundos
Programación de Sistemas 46
Valores devueltos de Valores devueltos de pollpoll
• El valor devuelto: Devuelve el número de descriptores listos.
Si el tiempo expira y no hay ninguno
listo devolverá cero.
En caso de error se retornará -1 y el tipo de
error en la variable errno.
Programación de Sistemas 47
Valores devueltos de Valores devueltos de pollpoll
• Posibles valores de Posibles valores de errno errno
Error Significado
EFAULTEl vector pasado como argumentono está ubicado en el espacio delprograma invocador
EINTRSe ha recibido una señal durante laespera.
ENOMEMEl núcleo no ha podido asignarmemoria para sus descriptores
Programación de Sistemas 48
E/S Conducida por E/S Conducida por señalesseñales
• SVR4
• 4.3+BSD
Programación de Sistemas 49
E/S Conducida por señalesE/S Conducida por señales
• Operación Conducida por Eventos– Varios procesos encargados de atender a las
distintas fuentes de datos. – El proceso principal estará parado esperando
se le comunique que se ha producido un evento, tomará el control y leerá del dispositivo correspondiente.
– Se usa el envío de señales al proceso principal.
Programación de Sistemas 50
E/S Conducida por señalesE/S Conducida por señales
• La entrada/salida conducida por señales nos permite configurar el kernel para que nos notifique cuando algo ha ocurrido sobre un descriptor de fichero.
• Históricamente éste modelo ha sido llamado E/S asíncrona.
Programación de Sistemas 51
E/S Conducida por señalesE/S Conducida por señales
• Hay dos problemas relacionados:– Primero: no todos los sistemas soportan
esta característica. • Entre los sistemas UNIX que tienen integrado la
este modelo está:– SVR4 ( SIGPOLL )– 4.3+BSD ( SIGIO )
– Segundo: solamente permite una señal por proceso
Programación de Sistemas 52
E/S Conducida por señalesE/S Conducida por señales
• System V Release 4– Sólo a dispositivos streams.
Proceso de usuario
stream head(interface de llamada al
sistema)
Controlador de dispositivo (device driver)
Kernel
• Streams– interface de comunicación con
los drivers dentro del kernel.
Programación de Sistemas 53
E/S Conducida por señalesE/S Conducida por señales
• System V Release 41. Crear un signal handler para SIGPOLL
2. Llamada a ioctl(fd, request, arg) con request a I_SETSIG.
Valor arg SignificadoS_INPUT Mensaje distinto de alta prioridad ha entrado.S_RDNORM Mensaje normal.S_RDBAND Mensaje en banda.S_BANDURG Mensaje urgente (genera señal SIGURG).S_HIPRI Mensaje de alta prioridad.S_OUTPUT Mensaje de salida (la cola no está llena)S_WRNORM Igual a S_OUTPUT.S_MSG Un mensaje de señal SIGPOLL ha llegado.S_ERROR Un mensaje M_ERROR ha llegado.S_HANGUP Un mensaje M_HANGUP ha llegado.
Programación de Sistemas 54
E/S Conducida por señalesE/S Conducida por señales
• 4.3+Berkeley Software Distribuition (BSD)– Se soporta por la combinación de dos
señales diferentes: SIGIO y SIGURG.– Sólo está disponibles para terminales y
dispositivos de red.– Es importante conocer la función
int fcntl(int fd, int cmd, long arg );
Programación de Sistemas 55
E/S Conducida por señalesE/S Conducida por señales
• 4.3+Berkeley Software Distribuition (BSD)– Para recibir la señal SIGIO necesitamos:
1. Establecer un manipulador de señal, bien mediante signal o sigaction.
2. Capacitar al proceso (pid) para recibir la señal SIGIO a través de la llamada a fcntl con el comando F_SETOWN.
3. Habilitar el modo E/S “asíncrona” con la primitiva fcntl con el comando F_SETFL para poner el estado del fichero con el flag O_ASYNC.
Programación de Sistemas 56
E/S Conducida por señalesE/S Conducida por señales
• Ejemplo– Servidor sobre UDP con sockets y utilizando
la señal SIGIO (Network Time Protocol)
recvfrom
recvfrom
sendto
sendtoUDP
ClientUDP
Server
En este sentido la señal SIGIO se generará cuando: un datagrama llega al socket correspondiente, o un error asíncrono a ocurrido en el socket.
g
Programación de Sistemas 57
E/S asíncronaE/S asíncrona
• aio_XXX funtions
Programación de Sistemas 58
E/S AsíncronaE/S Asíncrona
• Especificamos al kernel que nos notifique con una señal que la operación se ha completado.
• pocos sistemas soportan el modelo de E/S asíncrona.
• Se suele confundir bastante con el modelo de E/S conducida por señales.
Programación de Sistemas 59
E/S AsíncronaE/S Asíncrona
• Posix proporciona el verdadero modelo de E/S asíncrona con sus funciones– aio_XXX.
• Para utilizar la E/S asíncrona activar– el aio_sigevent (manipulador de señales) – utilizar las funciones al efecto
• aio_read
• aio_write
Programación de Sistemas 60
Ficheros mapeados Ficheros mapeados en memoriaen memoria• mmap• munmap• msync• mremap
Programación de Sistemas 61
IntroducciónIntroducción
• Mapear un fichero en memoria consiste en colocar todo o una porción de este fichero en memoria principal.
• Se debe tener en cuenta la consistencia de esta proyección con el contenido del propio fichero en disco, en este caso se encarga el núcleo del sistema.
Programación de Sistemas 62
Mapeo de un ficheroMapeo de un fichero
#include <sys/types.h>#include <sys/mman.h>
caddr_t mmap(caddr_t dirección, size_t longitud, int proteccion, int flag, int descriptor_de_fichero , off_t desplazamiento);
Devuelve: La dirección de la región mapeada si no hay problema, -1 si hay error.
• Función mmap para mapear un fichero
Programación de Sistemas 63
Diagrama del MapeoDiagrama del Mapeo
Direcciones altas
Direcciones bajas
Dirección de comienzo
Longitud
Pila (stack)
Porción del fichero mapeado en memoria
Montículo(heap)
Datos no inicializados(bss)
Datos incializados
Texto
Porción del fichero mapeado en memoria
LongitudDezplazamiento
Fichero
Programación de Sistemas 64
Parámetros de Parámetros de mmapmmap
– direcciónDirección de comienzo del fichero en memoria si se pone un 0 el sistema elige la mejor dirección
– longitudTamaño en bytes de la zona a mapear
– desplazamientoBytes de desplazamiento con respecto al comienzo del fichero en disco, múltiplo del tamaño de página de la memoria del sistema
Programación de Sistemas 65
– protección Modo de protección en el que se mapea
– La protección debe coincidir con el modo de apertura.
Parámetros de Parámetros de mmapmmap
Proteccion DescripciónPROT_READPROT_WRITEPROT_EXECPROT_NONE
Se puede leerSe puede escribirSe puede ejecutarNo se puedeacceder
Programación de Sistemas 66
– flagDiferentes opciones
Parámetros de Parámetros de mmapmmap
Constante Significado
MAP_FIXED
El valor devuelto debe ser igual alespecificado en dirección. El uso de este flagreduce las posibilidades de portabilidadSi no se especifica este flag pero direcciónes diferente de 0 entonces este valor se tomacomo indicación de donde debería poner lazona de mapeo el núcleo. La máximaportabilidad se consigue poniendo a 0 elparámetro dirección
Programación de Sistemas 67
Parámetros de Parámetros de mmapmmap
Constante Significado
MAP_SHARED
Este flag indica la disposición de lasoperaciones de almacenamiento en laregion de memoria para el proceso.Este flag especifica que lasoperaciones que modifican el ficheromapeado lo hacen directamente. Sedebe especificar este flag o elsiguiente (MAP_PRIVATE)
– flagDiferentes opciones
Programación de Sistemas 68
Parámetros de Parámetros de mmapmmap
Constante Significado
MAP_PRIVATE
Este flag indica que las operacionesmodificadoras causan una copia delfichero mapeado. Todas lasreferencias sucesivas a la regionirán a la copia.Un uso posible espara depuración, por ejemplomapeando el texto de un programa,así cualquier modificación afecta a lacopia y no al original
– flagDiferentes opciones
Programación de Sistemas 69
Parámetros de Parámetros de mmapmmap
Constante Significado
MAP_ DENYWRITE
Todo intento de acceso enescritura al archivo por unproceso devolverá el errorETXBSY
– descriptor_de_ficheroDescriptor del fichero a mapear, nunca un terminal o un socket.
– flagDiferentes opciones
Programación de Sistemas 70
Error en Error en mmapmmap
– En caso de error la variable errno valdrá:
Error Significado
EACCESEl tipo de proyección de acceso es incompatible con el modo
de apertura del archivo
EAGAINEl archivo está bloqueado o una cantidad demasiadoimportante de páginas están bloqueadas en memoria
EBADF El descriptor de entradas/salidas especificado no es válido
EINVALComienzo, longitud o dezplazamiento contiene un valor no
válido (por ejemplo una dirección que no está alineada a unafrontera de página)
ENOMEM No existe bastante memoria disponible
ETITBSYLa opción MAP_DENYWRITE se ha especificado pero el
archivo está abierto en escritura
Programación de Sistemas 71
SeñalesSeñales asociadas al mapeo asociadas al mapeo en memoriaen memoria
– SIGSEGV:
Indica que hemos intentado acceder a memoria que no está disponible para nosotros. Esta señal se genera si intentamos escribir en una región mapeada con protección de solo-lectura.
Programación de Sistemas 72
– SIGBUS: Se produce cuando accedemos a una porción de la región mapeada que no tiene sentido en el momento del acceso.
Por ejemplo, si mapeasemos un fichero usando el tamaño del fichero, pero antes de hacer alguna referencia al fichero mapeado el tamaño es reducido por otro proceso e intentasemos acceder al final del fichero mapeado recibiríamos una SIGBUS.
SeñalesSeñales asociadas al mapeo asociadas al mapeo en memoriaen memoria
Programación de Sistemas 73
• Una región mapeada en memoria es heredada por un hijo haciendo uso del fork (porque es parte del espacio de direcciones del padre), pero por la misma razón no es heredada por un nuevo programa ejecutado con un exec.
• Una región mapeada se desmapea automáticamente cuando el proceso termina, o también directamente llamando a munmap. Cerrando el descriptor del fichero no conseguimos desmapear la región.
Desmapeo del ficheroDesmapeo del fichero
Programación de Sistemas 74
Desmapeo del ficheroDesmapeo del fichero
#include <sys/types.h>#include <sys/mman.h>
int munmap(caddr_t dirección, size_t longitud);
Devuelve: 0 si no hay problemas, -1 y errno = EINVAL si hay error.
• Función munmap para desmapear el fichero
Programación de Sistemas 75
Parámetros de Parámetros de munmapmunmap
– direcciónDirección de comienzo de la zona ya en memoria.
– longitudTamaño en bytes de la zona mapeada.
– La ejecución de munmap no implica la actualización directa en disco, de ello se encarga el núcleo del sistema.
Programación de Sistemas 76
Sincronización de la zona Sincronización de la zona mapeadamapeada
#include <sys/mman.h>
int msync(void *dirección, size_t longitud, int flags);
Devuelve: 0 si no hay problemas, -1 si hay error.
• Función msync para el sincronismo de la zona de mapeo
Programación de Sistemas 77
Parámetros de Parámetros de msyncmsync
– direcciónDirección de comienzo de la zona ya en memoria.
– longitudTamaño en bytes de la zona mapeada.
– Se puede hacer con subconjuntos de la zona mapeada.
Programación de Sistemas 78
– flags Modo de sincronismo de la zona mapeada
– MS_ASYNC y MS_SYNC son mutuamente excluyentes.
Parámetros de Parámetros de msyncmsync
Flag DescripciónMS_ASYNC
MS_SYNC
MS_INVALIDATE
EscrituraasíncronaEscriturasíncronaInvalida datosen caché
Programación de Sistemas 79
Parámetros de Parámetros de msyncmsync
• Si se especifica también MS_INVALIDATE, todas las copias en memoria del fichero que son inconsistentes con el fichero en disco son invalidadas.
• Las siguientes referencias obtendrán los datos del fichero en disco por lo que los datos estarán actualizados.
Programación de Sistemas 80
RemapeoRemapeo
#include <sys/mman.h>
void *mremap(void *vieja_dirección, size_t vieja_longitud,
void *nueva_dirección, size_t nueva_longitud,
unsigned long flags);
Devuelve: Una dirección válida si no hay problemas, NULL si hay error.
• Función mremap para remapear la zona
Programación de Sistemas 81
Parámetros de Parámetros de mremapmremap
– vieja_dirección y vieja_longitudSon los argumentos con los que se llamó a mmap con anterioridad.
– nueva_direcciónNueva dirección de comienzo (puede no ser la misma que la anterior).
– nueva_longitudNuevo tamaño en bytes.
Programación de Sistemas 82
Parámetros de Parámetros de mremapmremap
• El parámetro flags especifíca las modalidades de la modificación. Linux solo proporciona una opción, MREMAP_MAYMOVE, que indica que el núcleo está autorizado para modificar la dirección de inicio de la zona.
• La primitiva mremap devuelve la dirección de la zona de memoria, que puede ser diferente del valor transmitido en vieja_dirección, o bien se devuelve el valor NULL en caso de error.
Programación de Sistemas 83
Error en Error en mremapmremap
– En caso de error la variable errno valdrá:
Error Significado
EFAULTLa región de memoria especificada por vieja_dirección yvieja_longitud no forma parte del espacio de direccionamiento delproceso que llama
EAGAIN La región de memoria está bloqueado o y no puede desplazarse
EINVALVieja_dirección, vieja_longitud o nuevo_dezplazamiento contiene unvalor no válido (por ejemplo una dirección que no está alineada auna frontera de página)
ENOMEMEl tamaño de la región de memoria no puede aumentarse yMREMAP_MAYMOVE no se ha especificado
Programación de Sistemas 84
¿Porqué usar ficheros ¿Porqué usar ficheros mapeados en memoria?mapeados en memoria?
• La mejor ventaja que implican los ficheros mapeados en memoria es que nos despreocupamos de la gestión del fichero en disco, no tenemos que tener código para leer (read), escribir (write) o buscar (lseek), tan solo tenemos que actualizar y/o leer de la memoria directamente y el núcleo se encarga del resto, lo que puede simplificar nuestros programas.
Programación de Sistemas 85
¿Porqué usar ficheros ¿Porqué usar ficheros mapeados en memoria?mapeados en memoria?
• Otro uso posible del mmap es proveer de memoria compartida entre dos procesos no relacionados. En este caso, el contenido actual del fichero se convierte en el contenido inicial de la memoria que será compartida, y cualquier cambio en la memoria compartida hecho por cualquier proceso que comparte esta memoria se copia al fichero.
• Se debe especificar MAP_SHARED.