Publicado el 12 de Junio del 2019
588 visualizaciones desde el 12 de Junio del 2019
307,0 KB
57 paginas
SISTEMAS OPERATIVOS:
COMUNICACIÓN Y
SINCRONIZACIÓN ENTRE
PROCESOS
Desarrollo de servidores concurrentes
Contenido
2
¨ Servidores de peticiones.
¨ Solución basada en procesos.
¨ Solución basada en hilos bajo demanda.
¨ Solución basada en pool de hilos.
Sistemas Operativos - Servidores concurrentes
Contenido
3
¨ Servidores de peticiones.
¨ Solución basada en procesos.
¨ Solución basada en hilos bajo demanda.
¨ Solución basada en pool de hilos.
Sistemas Operativos - Servidores concurrentes
Servidor de peticiones
4
¨ En muchos contextos se desarrollan servidores de
peticiones:
¤ Servidor Web.
¤ Servidor de Base de datos.
¤ Servidor de aplicaciones.
¤ Programa de intercambio de ficheros.
¤ Aplicaciones de mensajería.
¤ …
Sistemas Operativos - Servidores concurrentes
Servidor
5
SERVIDOR
CLIENTE
CLIENTE
CLIENTE
CLIENTE
CLIENTE
CLIENTE
Sistemas Operativos - Servidores concurrentes
Problema:
Servidor de peticiones
6
¨ Un servidor recibe peticiones que debe procesar.
¨ Estructura de un servidor genérico:
¤ Recepción de petición:
n Cada petición requiere un cierto tiempo en operaciones de
entrada/salida para ser recibida.
¤ Procesamiento de la petición:
n Un cierto tiempo de procesamiento en CPU.
¤ Envío de respuesta:
n Un cierto tiempo de entrada/salida para contestar.
Sistemas Operativos - Servidores concurrentes
Una biblioteca para pruebas
7
¨ Para poder evaluar las soluciones hoy vamos a usar
una biblioteca sencilla como base.
¨ Ideas:
¤ Simular la recepción de peticiones.
¤ Simular el procesamiento de peticiones.
¤ Simular el envío de respuestas.
Sistemas Operativos - Servidores concurrentes
Biblioteca base
8
#ifndef PETICION_H
#define PETICION_H
struct peticion {
long id;
/* Resto de campos necesarios */
int tipo;
char url[80];
/* ... */
};
typedef struct peticion peticion_t;
void recibir_peticion (peticion_t * p);
void responder_peticion (peticion_t * p);
#endif
Sistemas Operativos - Servidores concurrentes
Recepción de peticiones
9
static long petid = 0;
void recibir_peticion (peticion_t * p)
{
int delay;
fprintf(stderr, "Recibiendo petición\n");
p->id = petid++;
/* Simulación de tiempo de E/S */
delay = rand() % 5;
sleep(delay);
fprintf(stderr,"Petición %d recibida después de %d segundos\n",
p->id, delay);
Sistemas Operativos - Servidores concurrentes
}
Recepción de peticiones
10
static long petid = 0;
void recibir_peticion (peticion_t * p)
{
int delay;
fprintf(stderr, "Recibiendo petición\n");
p->id = petid++;
/* Simulación de tiempo de E/S */
delay = rand() % 5;
sleep(delay);
Aquí iría alguna llamada
bloqueante para recibir la
petición (por ejemplo de
la red)
fprintf(stderr,"Petición %d recibida después de %d segundos\n",
p->id, delay);
Sistemas Operativos - Servidores concurrentes
}
Envío de peticiones
11
void responder_peticion (peticion_t * p)
{
int delay, i;
double x;
fprintf(stderr, "Enviando petición %d\n", p->id);
/* Simulación de tiempo de procesamiento */
for (i=0;i<1000000;i++) { x = 2.0 * i; }
/* Simulación de tiempo de E/S */
delay = rand() % 20;
sleep(delay);
fprintf(stderr, "Petición %d enviada después de %d segundos\n",
p->id, delay);
}
Sistemas Operativos - Servidores concurrentes
Envío de peticiones
12
void responder_peticion (peticion_t * p)
{
int delay, i;
double x;
fprintf(stderr, "Enviando petición %d\n", p->id);
/* Simulación de tiempo de procesamiento */
for (i=0;i<1000000;i++) { x = 2.0 * i; }
/* Simulación de tiempo de E/S */
delay = rand() % 20;
sleep(delay);
fprintf(stderr, "Petición %d enviada después de %d segundos\n",
Aquí iría alguna llamada
bloqueante para responder
a la petición
Aquí iría el
procesamiento
de la petición
p->id, delay);
}
Sistemas Operativos - Servidores concurrentes
Una primera solución
13
¨ Ejecutar de modo
indefinido la
secuencia:
¤ Recibir una petición.
¤ Procesar la petición.
#include "peticion.h“
int main()
{
peticion_t p;
for (;;)
{
recibir_peticion(&p);
responder_peticion(&p);
}
return 0;
}
Sistemas Operativos - Servidores concurrentes
Problemas
14
¨ Llegada de peticiones.
¤ Si dos peticiones llegan al mismo tiempo …
¤ Si una petición llega mientras otra se está procesando
…
¨ Utilización de los recursos.
¤ ¿Cómo será la utilización de la CPU?
Sistemas Operativos - Servidores concurrentes
Solución inicial con medición
15
#include "peticion.h"
#include <stdio.h>
#include <time.h>
int main()
{
int i;
const int MAX_PETICIONES
=
5;
time_t t1,t2;
double dif;
peticion_t p;
t1
=
time(NULL);
for (i=0;i<MAX_PETICIONES;i++)
{
recibir_peticion(&p);
responder_peticion(&p);
}
t2
=
time(NULL);
dif =
difftime(t2,t1);
printf("Tiempo:
%lf\n",dif);
return 0;
}
Sistemas Operativos - Servidores concurrentes
Ejecución
16
$ time ./ej1
Recibiendo petición
Petición 0 recibida después de 0 segundos
Enviando petición 0
Petición 0 enviada después de 13 segundos
Recibiendo petición
Petición 1 recibida después de 3 segundos
Enviando petición 1
Petición 1 enviada después de 2 segundos
Recibiendo petición
Petición 2 recibida después de 4 segundos
Enviando petición 2
Petición 2 enviada después de 0 segundos
Recibiendo petición
Petición 3 recibida después de 3 segundos
Enviando petición 3
Petición 3 enviada después de 12 segundos
Recibiendo petición
Petición 4 recibida después de 1 segundos
Enviando petición 4
Petición 4 enviada después de 16 segundos
Tiempo: 54.000000
real 0m54.164s
0m0.061s
user
sys
0m0.046s
Sistemas Operativos - Servidores concurrentes
Comparación
17
Normal
54 seg.
Procesos
Hilo x petición
Pool de hilos
Sistemas Operativos - Servidores concurrentes
Contenido
18
¨ Servidores de peticiones.
¨ Solución basada en procesos.
¨ Solución basada en hilos bajo demanda.
¨ Solución basada en pool de hilos.
Sistemas Operativos - Servidores concurrentes
Primera idea
19
¨ Cada vez que llega una petición
se crea un proceso hijo:
¤ El proceso hijo realiza el procesamiento de la petición.
¤ El proceso padre pasa a esperar la siguiente petición.
Sistemas Operativos - Servidores concurrentes
Servidor basado en procesos
20
SERVIDOR
P1
P2
HIJO 1
HIJO 2
Sistemas Operativos - Servidores concurrentes
Implementación (1/3)
21
#include "peticion.h"
#include <stdio.h>
#include <time.h>
#include <sys/wait.h>
int main()
{
const int MAX_PETICIONES
=
5;
int i;
time_t t1,t2;
peticion_t p;
int pid,
hijos=0;
t1
=
time(NULL);
Sistemas Operativos - Servidores concurrentes
Implementación (2/3)
22
for (i=0;i<MAX_PETICIONES;i++)
{
recibir_peticion(&p);
do
{
fprintf(stderr,
"Comprobando
hijos\n");
pid =
waitpid(-‐1,
NULL,
WNOHANG);
if (pid>0)
{
hijos-‐-‐;
}
}
while (pid >
0);
pid =
fork();
if (pid<0)
{
perror(“Error
en
la
creación
del
hijo");
}
if (pid==0)
{
responder_peticion(&p);
exit(0);
}
/*
HIJO
*/
if (pid!=0)
{
hijos++;
}
/*
PADRE
*/
}
Sistemas Operativos - Servidores concurrentes
Implementación (3/3)
23
fprintf(stderr,
"Comprobando
%d
hijos\n",
hijos);
while (hijos>0)
{
pid =
waitpid(-‐1,
NULL,
WNOHANG);
if (pid>0)
{
hijos-‐-‐;
}
}
;
t2
=
time(NULL);
double dif =
difftime(t2,t1);
printf("Tiempo:
%lf\n",dif);
return 0;
}
Sistemas Operativos - Servidores concurrentes
Ejecución
24
$ time ./ej2
Recibiendo petición
Petición 0 recibida después de 0 segundos
Comprobando hijos
Recibiendo petición
Enviando petición 0
Petición 1 recibida después de 3 segundos
Comprobando hijos
Recibiendo petición
Enviando petición 1
Petición 2 recibida después de 3 segundos
Comprobando hijos
Petición 1 enviada después de 3 segundos
Recibiendo petición
Enviando petición 2
Petición 3 recibida después de 2 segundos
Comprobando hijos
Comprobando hijos
Recibiendo petición
Enviando petición 3
Petición 2 enviada después de 2 segundos
Petición 4 recibida después de 4 segundos
Comprobando hijos
Comprobando hijos
Comprobando 3Enviando petición hijos4
Petición 4 enviada después de 0 segundos
Petición 0 enviada después de 13 segundos
Petición 3 enviada después de 9 segundos
Tiempo: 17.000000
real 0m17.311s
user
0m0.872s
0m3.092s
sys
Sistemas Operativos - Servidores concurrentes
Comparación
25
Normal
54 seg.
Procesos
17 seg.
Hilo x petición
Pool de hilos
Sistemas Operativos - Servidores concurrentes
Problemas
26
¨ Hace falta arrancar un proceso (fork)
por cada petición que llega.
¨ Hace falta terminar un proceso (exit)
por cada petición que termina.
¨ Excesivo consumo de recursos del sistema.
¨ No hay control de admisión.
¤ Problemas de calidad de servicio.
Sistemas Operativos - Servidores concurrentes
Soluciones con hilos
27
¨ Hilos bajo demanda.
¤ Cada vez que se recibe una petición
se crea un hilo.
¨ Pool de hilos.
¤ Se tiene un número fijo de hilos creados.
¤ Cada vez que se recibe una petición se busca un hilo
libre ya creado para que atienda la petición.
n Comunicación mediante una cola de peticiones.
Sistemas Operativos - Servidores concurrentes
Contenido
28
¨ Servidores de peticiones.
¨ Solución basada en procesos.
¨ Solución basada en hilos bajo demanda.
¨ Solución basada en pool de hilos.
Sistemas Operativos - Servidores concurrentes
Hilos bajo demanda
29
¨ Se tiene un hilo receptor encargado de recibir las
peticiones.
¨ Cada vez que llega una petición se crea un hilo y
se le pasa una copia la petición al hilo recién
creado.
¤ Tiene que ser una copia de la petición porque la
petición original se podría modificar.
Sistemas Op
Comentarios de: Desarrollo de servidores concurrentes (0)
No hay comentarios