Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
El paradigma cliente-servidor
F. Garca-Carballeira, M. Soledad Escolar,
Luis Miguel Snchez, Fco. Javier Garca
Sistemas Distribuidos
Grado en Ingeniera Informtica
Universidad Carlos III de Madrid
Contenido
Conceptos bsicos
Tipo de servidores
Sesin:
Ejemplo:
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
Participantes
Elementos de computacin:
Cliente
Servidor
Red de interconexin
1) Peticin
Red de interconexin
2) Respuesta
Mquina
cliente
Mquina del
servidor
Ejemplo: HTTP
1) Peticin:
http://www.arcos.inf.uc3m.es
2) Respuesta
Cliente
1)
Peticin:
Servidor
2)
Respuesta:
HTTP/1.1 200 OK
Date: Fri, 31 Dec 2003 23:59:59 GMT
Content-Type: text/html
Content-Length: 1221
<html>
<body>
<h1>Pgina www.uc3m.es</h1>
(Contenido) . . .
</body>
</html>
Cliente-Servidor
Servidor:
Ofrece un servicio
Elemento pasivo: espera la llegada de peticiones
Cliente:
Solicita el servicio
Elemento activo: invoca peticiones
...
Servidor
Cliente 1
Cliente 2
Peticin de servicio
Proceso cliente
Proceso servidor
Servicio
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
Conceptos previos
El modelo cliente-servidor es una abstraccin eficiente para
facilitar los servicios de red
La asignacin de roles asimtricos simplifica la sincronizacin
Implementacin mediante:
Sockets
Llamada a procedimientos remotos (RPC)
Invocacin de mtodos remotos (RMI, CORBA, ).
Paradigma principalmente adecuado para servicios
centralizados
Ejemplos: servicios de Internet (HTTP, FTP, DNS, )
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
servidor
Cliente
respuesta
10
Inicio de servicio
Aceptar peticin de
sesin
Servidor secuencial
F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
11
Inicio de servicio
Aceptar peticin de
sesin
Obtener el
resultado
+
Devolver la
respuesta al cliente
Servidor secuencial
F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
12
Cliente-Servidor secuencial
Servidor
while(){
aceptar_peticion()
tratar_peticion()
}
Cliente 1
Solicitud de
conexin
Cliente 2
Cliente n
13
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
Sesin de
servicio
Cliente-Servidor secuencial
Servidor
while(){
aceptar_peticion()
tratar_peticion()
}
Cliente 1
Solicitud de
conexin
Cliente 2
Cliente n
14
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
Sesin de
servicio
Cliente-Servidor secuencial
Servidor
while(){
aceptar_peticion()
tratar_peticion()
}
Cliente 1
Solicitud de
conexin
Cliente 2
Cliente n
15
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
Sesin de
servicio
servidor
Cliente
Crea un proceso
hijo
respuesta
Proceso
hijo
16
Procesar la peticin
del cliente 1
fin
Crear thread
Trabajador 2
Procesar la peticin
del cliente 2
fin
Crear thread
Trabajador n
Procesar la peticin
del cliente n
fin
17
Inicio de servicio
Aceptar peticin de
sesin
Crear thread
Trabajador 1
Procesar la peticin
del cliente 1
fin
Crear thread
Trabajador 2
Procesar la peticin
del cliente 2
fin
Crear thread
Trabajador n
Procesar la peticin
del cliente n
fin
18
Cliente-Servidor concurrente
Servidor
while(){
aceptar_peticion()
pthread_create()
}
Cliente 1
Solicitud de
conexin
Cliente 2
Sesin de
servicio
Cliente n
19
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
Cliente-Servidor concurrente
Servidor
while(){
aceptar_peticion()
pthread_create()
}
Cliente 1
Solicitud de
conexin
Cliente 2
Sesin de
servicio
Cliente n
20
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
Cliente-Servidor concurrente
Servidor
while(){
aceptar_peticion()
pthread_create()
}
Cliente 1
Solicitud de
conexin
Cliente 2
Sesin de
servicio
Hilo 1
Cliente n
21
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
Cliente-Servidor concurrente
Servidor
while(){
aceptar_peticion()
pthread_create()
}
Cliente 1
Solicitud de
conexin
Cliente 2
Sesin de
servicio
Hilo 1
Cliente n
22
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
Cliente-Servidor concurrente
Servidor
while(){
aceptar_peticion()
pthread_create()
}
Cliente 1
Solicitud de
conexin
Cliente 2
Sesin de
servicio
Hilo 1
Cliente n
Hilo 2
23
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
Cliente-Servidor concurrente
Servidor
while(){
aceptar_peticion()
pthread_create()
}
Cliente 1
Solicitud de
conexin
Cliente 2
Sesin de
servicio
Hilo 1
Cliente n
Hilo 2
24
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
Cliente-Servidor concurrente
Servidor
while(){
aceptar_peticion()
pthread_create()
}
Cliente 1
Solicitud de
conexin
Cliente 2
Sesin de
servicio
Hilo 1
Cliente n
Hilo 2
Hilo n
25
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
Cliente-Servidor concurrente
Servidor
while(){
aceptar_peticion()
pthread_create()
}
Cliente 1
Solicitud de
conexin
Cliente 2
Sesin de
servicio
Hilo 1
Cliente n
Hilo 2
Hilo n
26
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
Cada proceso ligero realiza las mismas tareas: aceptar peticiones, procesarlas y
devolver su resultado
Segmentacin: cada trabajo se divide en una serie de fases, cada una de ellas se
procesa por un proceso ligero especializado
E/S
Solicitudes
Ncleo
Ncleo
E/S
Ncleo
E/S
Solicitudes
Trabajador
Distribuidor
Solicitudes
@Fuente: Jess Carretero, Flix Garca, Pedro de Miguel y Fernando Prez. Mc Graw Hill
27
Ejemplo: TCP
28
29
Concepto de sesin
30
Protocolo de servicio
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
31
Tipos de servidores
32
Informacin de estado
33
Arquitectura de SW
34
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
Interfaz de usuario
Lgica de presentacin
Lgica de aplicacin
Lgica de servicio
35
36
Responsabilidades en el cliente
Cliente:
37
Responsabilidades en el servidor
Servidor:
Espera conexiones entrantes de los clientes
1.
2.
El thread de servicio:
1.
2.
3.
4.
Procesa la peticin
Calcula el resultado
Devuelve la respuesta al cliente
Finaliza su ejecucin
38
Modelo concurrente:
Procesa la peticin
Enva la respuesta al servidor
Modelo secuencial:
39
Mquina A
cliente
Mquina B
sumar(5,2)
servidor
5+2
NCLEO
Resultado = 7
NCLEO
@Fuente: Jess Carretero, Flix Garca, Pedro de Miguel y Fernando Prez. Mc Graw Hill
RED
40
256
{
int a;
/* operando 1 */
int b;
/* operando 2 */
char q_name[MAXSIZE];
};
41
attr.mq_maxmsg = 20;
attr.mq_msgsize = sizeof(struct peticion);
q_servidor = mq_open(SERVIDOR_SUMA, O_CREAT|O_READ, 0700, &attr);
while(1) {
mq_receive(q_servidor, &pet, sizeof(pet), 0);
res = pet.a + pet.b;
/* se responde al cliente abriendo previamente su cola */
q_cliente = mq_open(pet.q_name, O_WRONLY);
mq_send(q_cliente, &res, sizeof(int), 0);
mq_close(q_cliente);
}
}
F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
42
attr.mq_maxmsg = 1;
attr.mq_msgsize = sizeof(int);
q_cliente = mq_open(CLIENTE_UNO, O_CREAT|O_RDONLY, 0700, &attr);
q_servidor = mq_open(SERVIDOR_SUMA, O_WRONLY);
/* se rellena la peticin */
pet.a = 5;
pet.b = 2;
strcpy(pet.q_name, CLIENTE_UNO);
43
sumar(5,2)
Resultado = 7
Mquina B
NCLEO
servidor
RED
5+2
Mquina A
cliente
NCLEO
NCLEO
F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
44
Proceso cliente
Cola del
cliente
Cola del
cliente
peticin
peticin
Proceso servidor
respuesta
Cola del
servidor
respuesta
Creacin del
thread
Creacin del
thread
Thread que
sirve la peticin
Thread que
sirve la peticin
45
peticin
Proceso servidor
mensaje
respuesta
Proceso
ligero
principal
while (1)
{
mq_receive
se crea el proceso ligero
esperar la copia del mensaje
}
Copia del
mensaje
Copia el mensaje
despierta al principal
continua la ejecucin
responde al cliente
46
pthread_cond_t cond_mensaje;
int main(void)
{
mqd_t q_servidor;
/* mensaje a recibir */
/* atributos de la cola */
pthread_attr_t t_attr;
attr.mq_maxmsg = 20;
attr.mq_msgsize = sizeof(struct peticion));
F. Garca-Carballeira, M. Soledad Escolar, Luis Miguel Snchez, Fco. Javier Garca
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
47
48
}
}
49
Condicin de carrera
}
}
50
Seccin crtica
/* se espera a que el thread copie el mensaje */
pthread_mutex_lock(&mutex_mensaje);
while (mensaje_no_copiado)
pthread_cond_wait(&cond_mensaje, &mutex_mensaje);
mensaje_no_copiado = TRUE;
pthread_mutex_unlock(&mutex_mensaje);
}
/* FIN while */
} /* Fin main */
51
52
53
Proceso cliente
#include mensaje.h
#include <mqueue.h>
void main(void) {
mqd_t q_servidor; /* cola de mensajes del proceso servidor */
mqd_t q_cliente;
/* cola de mensajes para el proceso cliente */
struct peticion pet;
int res;
struct mq_attr attr;
attr.mq_maxmsg = 1;
attr.mq_msgsize = sizeof(int);
q_cliente = mq_open(CLIENTE_UNO, O_CREAT|O_RDONLY, 0700, &attr);
q_servidor = mq_open(SERVIDOR_SUMA, O_WRONLY);
/* se rellena la peticin */
pet.a = 5;
pet.b = 2;
strcpy(pet.q_name, CLIENTE_UNO);
54
2.
3.
4.
Este obra est bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Espaa.
55