Professional Documents
Culture Documents
DITEC
Facultad de Informática
◮ INTRODUCCIÓN
◮ Aspectos especı́ficos de diseño para aplicaciones distribuidas
◮ Eficiencia y escalabilidad en sistemas distribuidos
◮ PATRONES PARA EFICIENCIA Y ESCALABILIDAD
◮ Diseño de interfaces remotas (fat operations, coarse object
models, wrapper)
◮ Escalabilidad en el número de objetos y clientes
◮ Manejo de threads de ejecución
◮ Patrón Evictor
Bibliografı́a: F. Bellas (§3.5), Henning & Vinoski (§12.6), Schmidt
(POSA2)
◮ Granularidad
◮ Algunos ORBs optimizan las llamadas locales
◮ Los objetos de granularidad baja pueden ser útiles
◮ Sin embargo, en general
◮ Los objetos pueden estar en remoto
◮ Para obtener los datos de un objeto, hacen falta varias
llamadas remotas
◮ Patrón “Fat Operations”
interface SensorAire {
readonly attribute float temperatura;
readonly attribute float presión;
readonly attribute float humedad;
readonly attribute float velocidad_viento;
};
◮ Mismo proceso: 0.01 µs
◮ Distintos procesos, mismo sistema: 24 µs (mem. compartida)
◮ Distintos procesos, mismo sistema: 60 µs (TCP)
◮ Distintos procesos, diferente sistema: 220 µs (TCP+Ethernet)
◮ 1000 invocaciones: 220.000 µs
◮ 250 llamadas con todos los parámetros: 460 µs (x478!!)
◮ Se puede convertir:
interface SensorAire {
struct DatosSensor {
float temperatura;
float presión;
float humedad;
float velocidad_viento;
};
DatosSensor getDatos();
};
interface SensorAire {
typedef sequence<float> FloatSeq;
struct DatosSensor {
FloatSeq temperatura;
FloatSeq presión;
FloatSeq humedad;
FloatSeq velocidad_viento;
};
DatosSensor getDatos();
};
◮ Arrays vs. secuencias
◮ Las secuencias son de tamaño variable
◮ Sólo se envı́an los elementos que hay
Diego Sevilla Ruiz DITEC Facultad de Informática
Sistemas Distribuidos
Diseño de IDL eficiente
interface Sensor
{
void addListener(in SensorListener listener);
void removeListener(in SensorListener listener);
};
interface Identifiable
{
readonly attribute string id;
};
◮ Default Servant
◮ Patrón Evitor
◮ Con ServantLocators:
◮ Ineficiente: Creación de sirvientes en cada petición,
fragmentación del heap
◮ Evictor:
◮ En memoria los sirvientes más usados (LRU)
◮ Aprovecha la localidad temporal
◮ Necesidades:
◮ Creación de referencias
◮ Creación del ServantLocator (Objeto CORBA local)
◮ Obtención del Object ID (Interfaz Current, POACurrent)
◮ El ServantLocator debe reconocer la operación destroy del
objeto CORBA (interesante diseñar interfaces que la
contengan para limpiar la memoria del servidor lo máximo
posible)
1
Cliente POA
Sirvientes
2
5 4 3 2 1
3
Servant Locator 4
5 4 3 2 1
Cola Cabeza
Cola del Evictor
◮ Introducción
◮ Modelos de un único thread
◮ Patrón reactor/proactor
◮ Modelos de threads:
◮ Thread per request
◮ Thread per client (per connection)
◮ Thread pool
◮ Configuración del ORB