2. Qué pasa cuando varios clientes tratan de conectarse
al mismo tiempo a un servidor????
• Una forma es ir atendiéndolos de a uno en un ciclo: como en el
programa que atiende pedidos de archivos
– Se acepta una conexión
– Se lee la petición
– Se lee desde el archivo y se escribe en el socket hasta encontrar
una marca de fin de archivo
• A este tipo de servidores se les llama servidores iterativos
• El problema es que todo cliente tiene que esperar su turno para
ser atendido
• Si uno de ellos pide un archivo muy grande los demás tienen
que esperar
• La mayor parte de la espera es debido a operaciones de IO, hay
capacidad de CPU ociosa !
3. Introducción a la Concurrencia
• ¿Qué es la concurrencia?
– Programa Secuencial. Proceso
– Procesos Concurrentes. Programa y sistema concurrente
– Relaciones entre procesos: Competencia y Cooperación
– Actividades entre procesos: Sincronización y Comunicación
• ¿Dónde se usa la concurrencia?
• ¿Cómo se usa la concurrencia?
4. ¿Qué es la concurrencia?
• El paradigma de la programación
concurrente
• Paradigma
– Conjunto de teorías, estándares y métodos que
juntos representan una forma de ver el mundo
• Concurrencia
– Acaecimiento de varios sucesos al mismo
tiempo
5. ¿Qué es la concurrencia?
Paralelismo Solapamiento
Simultaneidad
Tiempo
Tiempo
Tiempo
• Los sucesos se
producen en un mismo
intervalo de tiempointervalo de tiempo
((diferentes recursos)
• Los sucesos se
producen en el mismo
instante de tiempoinstante de tiempo
• Los sucesos se
producen en intervalos deintervalos de
tiempo superpuestostiempo superpuestos
6. Un servidor secuencial (iterativo) atendiendo a
más de un cliente
A SERVER
A CLIENT
A CLIENT
A CLIENT
4444
7. Durante la conversación no puede oír por el puerto
4444
A SERVER
A CLIENT
A CLIENT
A CLIENT
4444
8. Sólo después de efectuar la transmisión se pone a
escuchar de nuevo por el 4444
A SERVER
A CLIENT
A CLIENT
A CLIENT
4444
9. Si el servicio consiste en transferir un archivo, el
cliente debe digitar el nombre
A SERVER
A CLIENT
A CLIENT
A CLIENT
4444
10. ¿Qué sucede si el servidor tiene que esperar mucho
para que un cliente escriba el nombre de un archivo?
A SERVER
A CLIENT
A CLIENT
A CLIENT
4444
Timeout
ArchServidor2
11. Un Servidor Concurrente
• Un servidor concurrente atiende a varios clientes al
mismo tiempo.
• Más aún, mientras está atendiendo sigue escuchando
• El problema es que todo cliente tiene que esperar su
turno para ser atendido.
• Si uno de ellos pide un archivo muy grande los
demás tienen que esperar
• La mayor parte de la espera es debido a operaciones
de IO, hay capacidad de CPU ociosa!
• Se trata de crear un nuevo proceso o línea de
ejecución cada vez que un cliente “llega” a pedir un
servicio.
12. Servidores Comcurrentes: hay procesos separados
para atender el puerto y para transferir el archivo
A SERVER
A CLIENT
A CLIENT
A CLIENT
4444
13. Después que el cliente contacta al servidor, éste crea
otro proceso para para atender al cliente y se queda
escuchando el puerto 4444 por otro
A SERVER
A CLIENT
A CLIENT
A CLIENT
4444
14. Mientras el nuevo proceso está atendiendo al primer
cliente, el segundo cliente puede contactar al
servidor en el puerto 4444
A SERVER
A CLIENT
A CLIENT
A CLIENT
4444
15. Y el servidor crea otro proceso
A SERVER
A CLIENT
A CLIENT
A CLIENT
4444
16. Ahora un tercer cliente contacta al servidor
A SERVER
A CLIENT
A CLIENT
A CLIENT
4444
17. Y un tercer proceso esclavo o thread es creado
A SERVER
A CLIENT
A CLIENT
A CLIENT
4444
18. 18
Tipos de Servidores según su forma de servicio
• Los servidores pueden clasificarse como servidores
concurrentes o servidores iterativos.
• Los servidores iterativos reciben y atiende de a un
requerimiento a la vez. Poseen un solo hilo de control (un
“program counter”)
• Los servidores concurrentes pueden atender a mútiples
clientes en forma concurrente.
– Éstos poseen un hilo que espera por conexiones y crea un hilo
ante la llegada de un nuevo cliente.
– Éste hilo se hace cargo de los requerimiento del cliente y luego
termina (“exit”) cuando el cliente se va.
– Éstos requieren capacidad de ejecución de tareas concurrentes.
19. Cómo (y por qué) crear procesos paralelos
• Si existe sólo una CPU, ¿Por qué crear procesos paralelos?
– Porque algunos programas se escriben más fácilmente así. De hecho, la
programación de un servidor es a veces más fácil si se hace de esta
manera.
– Porque sí hay más de un procesador !!!!! (¿dónde?)
• El concepto de procesos paralelos implentados a nivel de S.O.
aparecen con UNIX y C.
• La forma de crearlos es ejecutando una función llamada fork()
• int i = fork() provoca que se cree un proceso exactamente igual al
que se está ejecutando.
• La única diferencia es que en el proceso hijo (el nuevo creado) la
variable i vale cero. Esto se usa para saber quién soy yo.
• En programación de servidores concurrentes, si soy el hijo ejecuto la
parte que corresponde al proceso esclavo.
• Si soy el padre (i tiene un valor distinto de cero y es el id del
proceso hijo creado) sigo recibiendo peticiones