85
E/S Avanzada E/S Avanzada Programación de Sistemas

E/S Avanzada E/S Avanzada Programación de Sistemas

Embed Size (px)

Citation preview

Page 1: E/S Avanzada E/S Avanzada Programación de Sistemas

E/S AvanzadaE/S Avanzada

Programación de

Sistemas

Page 2: E/S Avanzada E/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

Page 3: E/S Avanzada E/S Avanzada Programación de Sistemas

Programación de Sistemas 3

IntroducciónIntroducción

• Conceptos Previos

Page 4: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 5: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 6: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 7: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 8: E/S Avanzada E/S Avanzada Programación de Sistemas

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 );

Page 9: E/S Avanzada E/S Avanzada Programación de Sistemas

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).

Page 10: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 11: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 12: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 13: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 14: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 15: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 16: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 17: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 18: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 19: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 20: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 21: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 22: E/S Avanzada E/S Avanzada Programación de Sistemas

Programación de Sistemas 22

E/S MultiplexadaE/S Multiplexada

• select• pselect• poll

Page 23: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 24: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 25: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 26: E/S Avanzada E/S Avanzada Programación de Sistemas

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);

Page 27: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 28: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 29: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 30: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 31: E/S Avanzada E/S Avanzada Programación de Sistemas

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 };

Page 32: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 33: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 34: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 35: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 36: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 37: E/S Avanzada E/S Avanzada Programación de Sistemas

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 };

Page 38: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 39: E/S Avanzada E/S Avanzada Programación de Sistemas

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);

Page 40: E/S Avanzada E/S Avanzada Programación de Sistemas

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 };

Page 41: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 42: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 43: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 44: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 45: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 46: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 47: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 48: E/S Avanzada E/S Avanzada Programación de Sistemas

Programación de Sistemas 48

E/S Conducida por E/S Conducida por señalesseñales

• SVR4

• 4.3+BSD

Page 49: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 50: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 51: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 52: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 53: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 54: E/S Avanzada E/S Avanzada Programación de Sistemas

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 );

Page 55: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 56: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 57: E/S Avanzada E/S Avanzada Programación de Sistemas

Programación de Sistemas 57

E/S asíncronaE/S asíncrona

• aio_XXX funtions

Page 58: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 59: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 60: E/S Avanzada E/S Avanzada Programación de Sistemas

Programación de Sistemas 60

Ficheros mapeados Ficheros mapeados en memoriaen memoria• mmap• munmap• msync• mremap

Page 61: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 62: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 63: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 64: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 65: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 66: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 67: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 68: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 69: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 70: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 71: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 72: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 73: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 74: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 75: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 76: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 77: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 78: E/S Avanzada E/S Avanzada Programación de Sistemas

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é

Page 79: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 80: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 81: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 82: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 83: E/S Avanzada E/S Avanzada Programación de Sistemas

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

Page 84: E/S Avanzada E/S Avanzada Programación de Sistemas

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.

Page 85: E/S Avanzada E/S Avanzada Programación de Sistemas

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.