PDF de programación - Desarrollo de servidores concurrentes

Imágen de pdf Desarrollo de servidores concurrentes

Desarrollo de servidores concurrentesgráfica de visualizaciones

Publicado el 12 de Junio del 2019
175 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
  • Links de descarga
http://lwp-l.com/pdf16109

Comentarios de: Desarrollo de servidores concurrentes (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad

Revisar política de publicidad