DESARROLLO DE SERVIDORES Iterativos Concurrentes
Servidores Iterativos socket(...) bind(...)listen(...)Accept(...)Transacción()
Servidores Concurrentes socket(...) bind(...)listen(...)Accept(...)fork() >0 Transaccion() =0
Costo de la concurrencia Sea S tiempo de duracion de la transaccion n.S tiempo para resolver n servicios que se puedan encolar en el backlog Sea C tiempo para crear un proceso hijo o un thread Debe ser S >> C
Entrada/Salida asíncrona A veces es necesario que nuestro programa reciba información desde más de una fuente simultáneamente. No podemos bloquear un proceso a la espera de una conexión por un puerto determinado si tambien debemos esperar conexiones por otro puerto Tambien podriamos tener que esperar simultaneamente una conexión y un dato de un driver. Podemos utilizar un Accepr no bloqueante mediante la system call ioctl() Podemos utilizar una funcion para bloquar al proceso por un set definido de file descriptors y que se desbloquee ante actividad I/O de alguno de ellos indicandonos por cual existio actividad
Funcion Select retcod=select ( maxfd, lect_fd, esc_fd, exc_fd, tiempo ); Descriptor de mayor valor +1 Set de escritura Tiempo de bloqueo Set de lectura Set de excepción -1: error N de descriptores listos #include Tipo fd_set struct timeval { long tv_sec; /* segundos */ long tv_usec; /* microsegundos */ };
Tipo fd_set Son arrays de enteros en los que cada bit representa un file descriptor Cuando se desbloquea por uno de ellos el bit correspondiente cambia a 1 Por suerte existen macros para operar sobre estos bits. FD_ZERO( &fdset ); /* Inicializa todos los bits a cero */ FD_SET ( fd, &fdset ); /* Pone a 1 el bit indicado por fd */ FD_CLR ( fd, &fdset ); /* Pone a 0 el bit indicado por fd */ FD_ISSET( fd, &fdset ); /* Comprueba si el bit indicado por fd está a 1 */