La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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

Presentaciones similares


Presentación del tema: "E/S Avanzada E/S Avanzada Programación de Sistemas."— Transcripción de la presentación:

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

2 Programación de Sistemas 2 Indice Conceptos Previos Modelos de E/S E/S Multiplexada E/S Conducida por señales E/S Asíncrona Ficheros mapeados en memoria

3 Programación de Sistemas 3 Introducción Introducción Conceptos Previos

4 Programación de Sistemas 4 Introducció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.

5 Programación de Sistemas 5 Conceptos 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

6 Programación de Sistemas 6 Conceptos 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.

7 Programación de Sistemas 7 Conceptos 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

8 Programación de Sistemas 8 Conceptos 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 );

9 Programación de Sistemas 9 Conceptos 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).

10 Programación de Sistemas 10 Modelos de E/S Modelos de E/S E/S bloqueante E/S no bloqueante E/S multiplexada E/S conducida por señales E/S asíncrona

11 Programación de Sistemas 11 Modelos 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.

12 Programación de Sistemas 12 E/S bloqueante copia completada Proceso bloqueado en la llamada a recvfrom aplicación kernel recvfrom Llamada al sistema datagrama no recibido datagrama recibido copiar datagrama Esperando por los datos procesar el datagrama recibido Retorno OK Copiado de los datos del kernel al usuario

13 Programación de Sistemas 13 Modelos 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

14 Programación de Sistemas 14 E/S no bloqueante datagrama recibido EWOULDBLOCK recvfrom Llamada al sistema datagrama 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 EWOULDBLOCK recvfrom Llamada al sistema datagrama no recibido recvfrom Llamada al sistema Copiado de los datos del kernel al usuario

15 Programación de Sistemas 15 Modelos 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

16 Programación de Sistemas 16 E/S Multiplexada Llamada al sistema copia completada Proceso bloqueado en la llamada a s elect Esperando por algún dato disponible aplicaciónkernel select Llamada 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

17 Programación de Sistemas 17 Modelos 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.

18 Programación de Sistemas 18 E/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ónkernel 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

19 Programación de Sistemas 19 Modelos 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

20 Programación de Sistemas 20 E/S Asíncrona Señal especificada en aio_read copia completada Proceso continua su ejecución aplicaciónkernel aio_read Llamada al sistema datagrama no recibido datagrama recibido copiar datagrama Esperando por los datos Manipulador de señales procesa el datagrama recibido Copiado de los datos del kernel al usuario retorno

21 Programación de Sistemas 21 Comparativa Modelos de E/S inicio completado poll completado preparación listo inicio completado notificación incio completado inicio notificación bloqueadobloqueado blockblock blockblock blockblock blockblock

22 Programación de Sistemas 22 E/S Multiplexada E/S Multiplexada select pselect poll

23 Programación de Sistemas 23 Introducción ¿ Qué es la entrada/salida multiplexada?¿ Qué es la entrada/salida multiplexada? Técnica que nos permite que un proceso pueda quedar en espera de datos al acceder a uno o varios dispositivos.

24 Programación de Sistemas 24 Introducción ¿ Cómo se realiza la entrada/salida multiplexada ?¿ Cómo se realiza la entrada/salida multiplexada ? 7Paso de a una función de una lista de descriptores de los dispositicos. 7Esta función no retornará hasta que al menos uno de los descriptores está listo 7Devolverá los descriptores listos.

25 Programación de Sistemas 25 Primitivas en Linux Depende de la norma de Linux. select –Berkeley En su versión 4.2 surgió la primitiva select poll –System V Release 3 Proporciona el poll pselect –Posix Introduce el pselect

26 Programación de Sistemas 26 La primitiva select Pone el proceso actual en espera de cambio de sobre varios descriptores. #include int select(int n, fd_set *readfds, fd_set *writefds, fd_set *readfs, const struct timeval *timeout);

27 Programación de Sistemas 27 –El parámetro n Nú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 select

28 Programación de Sistemas 28 –Descriptores a interrogar Saber si se pueden leer, escribir o conocer información del dispositivo. Los parámetros de select  Readfds Dispositivos a leer.  Writefds Dispositivos a escribir.  Exceptfds Dispositivos a conocer su estado.

29 Programación de Sistemas 29 Los parámetros de select –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_set FD_SETSIZE

30 Programación de Sistemas 30 Los parámetros del select Macroinstrucciones para fd_set Macroinstrucciones para fd_set

31 Programación de Sistemas 31 Los parámetros de select –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 };

32 Programación de Sistemas 32 Los parámetros de select –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

33 Programación de Sistemas 33 Valores devueltos select Valores devueltos select 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.

34 Programación de Sistemas 34 Valores devueltos select Posibles valores de errno Posibles valores de errno

35 Programación de Sistemas 35 fd_setreadset, 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

36 Programación de Sistemas 36 La primitiva pselect #include 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.

37 Programación de Sistemas 37 Cambios de pselect –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 };

38 Programación de Sistemas 38 Cambios de pselect –Tratamiento de señales Se introduce en el sexto argumento. Un puntero a una máscara de señales 4Permite al programa inhibir la liberación de ciertas señales.

39 Programación de Sistemas 39 La primitiva poll Funcionalmente similar al select pero añade tratamiento adicional con los streams. #include int poll(struct pollfd *fdarray, unsigned long *nfds, int *timeout);

40 Programación de Sistemas 40 Los parámetros de poll –La lista de descriptores Es 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 };

41 Programación de Sistemas 41 Los parámetros de poll Constantes de entrada para events y revents Constantes de entrada para events y revents

42 Programación de Sistemas 42 Los parámetros de poll Constantes de salida para events y revents Constantes de salida para events y revents

43 Programación de Sistemas 43 Los parámetros de poll Constantes tratamiento de errores para events y revents Constantes tratamiento de errores para events y revents

44 Programación de Sistemas 44 Los parámetros de poll –El parámetro nfds Nú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.

45 Programación de Sistemas 45 Los parámetros de poll –Timeout Tiempo máximo a esperar desde que poll entra en ejecución hasta que devuelve el control. 4El valor se ha de expresar en milisegundos.

46 Programación de Sistemas 46 Valores devueltos de poll 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.

47 Programación de Sistemas 47 Valores devueltos de poll Posibles valores de errno Posibles valores de errno

48 Programación de Sistemas 48 E/S Conducida por señales E/S Conducida por señales SVR4 4.3+BSD

49 Programación de Sistemas 49 E/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.

50 Programación de Sistemas 50 E/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.

51 Programación de Sistemas 51 E/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

52 Programación de Sistemas 52 E/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.

53 Programación de Sistemas 53 E/S Conducida por señales System V Release 4 1. Crear un signal handler para SIGPOLL 2. Llamada a ioctl(fd, request, arg) con request a I_SETSIG.

54 Programación de Sistemas 54 E/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 );

55 Programación de Sistemas 55 E/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.

56 Programación de Sistemas 56 E/S Conducida por señales Ejemplo –Servidor sobre UDP con sockets y utilizando la señal SIGIO (Network Time Protocol) recvfrom sendto UDP Client UDP 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.  Código

57 Programación de Sistemas 57 E/S asíncrona E/S asíncrona aio_XXX funtions

58 Programación de Sistemas 58 E/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.

59 Programación de Sistemas 59 E/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

60 Programación de Sistemas 60 Ficheros mapeados en memoria Ficheros mapeados en memoria mmap munmap msync mremap

61 Programación de Sistemas 61 Introducció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.

62 Programación de Sistemas 62 Mapeo de un fichero #include 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

63 Programación de Sistemas 63 Diagrama 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 Longitud Dezplazamiento Fichero

64 Programación de Sistemas 64 Parámetros de mmap –dirección Dirección de comienzo del fichero en memoria si se pone un 0 el sistema elige la mejor dirección –longitud Tamaño en bytes de la zona a mapear –desplazamiento Bytes de desplazamiento con respecto al comienzo del fichero en disco, múltiplo del tamaño de página de la memoria del sistema

65 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 mmap

66 Programación de Sistemas 66 –flag Diferentes opciones Parámetros de mmap

67 Programación de Sistemas 67 Parámetros de mmap –flag Diferentes opciones

68 Programación de Sistemas 68 Parámetros de mmap –flag Diferentes opciones

69 Programación de Sistemas 69 Parámetros de mmap –descriptor_de_fichero Descriptor del fichero a mapear, nunca un terminal o un socket. –flag Diferentes opciones

70 Programación de Sistemas 70 Error en mmap –En caso de error la variable errno valdrá:

71 Programación de Sistemas 71 Señales asociadas al mapeo en 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.

72 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ñales asociadas al mapeo en memoria

73 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 fichero

74 Programación de Sistemas 74 Desmapeo del fichero #include 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

75 Programación de Sistemas 75 Parámetros de munmap –dirección Dirección de comienzo de la zona ya en memoria. –longitud Tamañ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.

76 Programación de Sistemas 76 Sincronización de la zona mapeada #include 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

77 Programación de Sistemas 77 Parámetros de msync –dirección Dirección de comienzo de la zona ya en memoria. –longitud Tamaño en bytes de la zona mapeada. –Se puede hacer con subconjuntos de la zona mapeada.

78 Programación de Sistemas 78 –flags Modo de sincronismo de la zona mapeada –MS_ASYNC y MS_SYNC son mutuamente excluyentes. Parámetros de msync

79 Programación de Sistemas 79 Parámetros de msync 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.

80 Programación de Sistemas 80 Remapeo #include 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

81 Programación de Sistemas 81 Parámetros de mremap –vieja_dirección y vieja_longitud Son los argumentos con los que se llamó a mmap con anterioridad. –nueva_dirección Nueva dirección de comienzo (puede no ser la misma que la anterior). –nueva_longitud Nuevo tamaño en bytes.

82 Programación de Sistemas 82 Parámetros de mremap 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.

83 Programación de Sistemas 83 Error en mremap –En caso de error la variable errno valdrá:

84 Programación de Sistemas 84 ¿Porqué usar ficheros 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.

85 Programación de Sistemas 85 ¿Porqué usar ficheros 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.


Descargar ppt "E/S Avanzada E/S Avanzada Programación de Sistemas."

Presentaciones similares


Anuncios Google