Академический Документы
Профессиональный Документы
Культура Документы
Sistemas Operativos
Distribuidos
M.C. Juan Carlos Olivares Rojas
Agenda
• 2.1 Comunicación
• 2.2 Sincronización
• 2.3Nominación
2.1 Comunicación
• 2.1.1 Comunicación con cliente servidor
(sockets).
• rlogin jcolivar@antares.itmorelia.edu.mx
• rsh jcolivar@antares.itmorelia.edu.mx
Comunicación
• La comunicación entre procesos (IPC) es parte
fundamental de las primitivas de sincronización
de un sistema distribuido.
struct sockaddr {
u_shortsa_family_; /*Familia*/
char sa_data[14]; /*Dirección*/
};
Sockets
• Para utilizar sockets TCP/IP se debe emplear la
familia o protocolo Internet, la cual define sus
direcciones en <netinet/in.h> y son:
struct in_addr {
u_long s_addr; /*32 bits*/
};
Sockets
struct sockaddr_in {
short sin_familiy; /*AF_INET*/
u_short sin_port; /*16 bits*/
struct in_addr sin_addr; /*32 bits*/
char sin_zero[8]; /*8 bytes no usados*/
};
struct sockaddr_un {
short sun_family; /*AF_UNIX*/
char sun_family; /*Ruta*/
};
socket();
bind();
listen();
accept();
read();
write();
Primitivas de sockets en el cliente
• Las primitivas de sockets pueden ser
bloqueantes y no bloqueantes
socket();
connect();
write();
read();
close();
Diagrama de Sockets Stream
Primitivas de sockets en el servidor
• Las primitivas son para comunicación entre
procesos no orientada a conexión
(Datagramas).
socket();
bind();
recvfrom();
sendto();
Primitivas de sockets en el cliente
socket();
bind();
sendto();
recvfrom();
shutdown();
#include <arpa/inet.h>
listen(sfd, 5);
Servidor stream
for(;;){ /*Un servidor siempre está activo*/
tam_clie = sizeof(clie);
if((nsfd = accept(sfd, &clie, &tam_clie)) == -1) /*Error
al aceptar peticiones*/
send(); read(); ….
close(sfd);
Servidor datagrama
int sfd;
struct sockaddr_in ser, clie;
recvfrom(); sendto();
close(sfd);
Cliente datagrama
int sfd;
struct sockaddr_in ser, clie;
sento(); recvfrom(); …
close(sfd);
#include <netdb.h>
Otras funciones de sockets
struct hostent{
char *h_name;
char **h_aliasses;
char h_addrtype;
int h_length;
char **h_addr_list;
};
Otras funciones de sockets
struct hostent *host;
ser.sin_familiy =AF_INET;
ser.sin_addr.s_addr = *(long *) host-> h_addr_list;
ser.sin_port = htons(1000);
Sockets
• Algunas funciones trabajan en forma
bloqueante como accept(), recv(), revfrom(),
etc. Para cambiar el modo de trabajo se utiliza
la función: int fcntl(int fd, int cmd, long arg)
Conection.close();
Cliente stream
Socket c = new
Socket(InetAddress.getLocalHost(), 5000);
char c;
while((c = (char) entrada.read()) != ‘\n’)
System.out.println(String.valueOf(c));
Servidor datagramas
try {
DatagramSocket sS = new DatagramSocket();
DatagramSocket rS = new DatagramSocket(
5000);
} catch(SocketException SE) {
SE.printStackTrace();
System.exit(1);
}
Servidor datagramas
byte a = new byte [100];
DatagramPacket rP = new DatagramPacket( a,
a.length);
rS.receive(rP);
System.out.println(“Dirección:” + rP.getAddress()
+ “ Puerto” + rP.getPort + “ longitud:”
+rP.getLength());
Servidor datagramas
byte d[] = rP.getData();
sP = new DatagramPacket(d, d.length,
rP.getAddress(), 5001);
sS.send(sendPacket);
InetAddress comp =
InetAddress.getByName(“www.itc.edu.mx”);
Sockets Java
• Otras excepciones que se pueden capturar:
• UnknownHostException
• EOFException
• ConnectException
Sockets en Java
• Se recomienda la utilización en las nuevas versiones
de Java de los flujos ObjectInputStream y
ObjectOutputStream, los cuales son serializables.
while(in.hasNextLine()) {
String l =in.nextLine(); System.out.println(l);
}
2.1.2 RPC
• Las llamadas a procedimientos remotos (RPC)
fue el primer intento por obtener un middleware
para la construcción de sistemas distribuidos.
program RAND_PROG {
version RAND_VER {
void INICIALIZA_RANDOM(long) =1;
doble OBTEN_SIG_RANDOM(void) = 2;
} =1; /*No. de version*/
} = 0x31111111; /*No. de programa*/
RPC
• rpcgen -c -a rand.x
• rand_server.c servidor
• rand_svc.c stub del servidor (no se modifica)
• rand.h cabeceras
• rand_clnt.c stub del cliente (no se modifica)
• rand_client.c cliente
• rand_xdr.c manejo de estructuras
RPC
• 00000000-1FFFFFFF Definidos por sun
• 20000000-3FFFFFFF Definidos por el usuario
• 40000000-5FFFFFFF Transitorios
• 60000000-FFFFFFFF Reservados para usos
futuros
• rpcinfo -s
• portmap
RPC
const MAX = 100;
typedef int Longitud;
struct argumentos {
float salario;
Longitud tam;
};
• rmi://nombrecompu:puerto/nombreObjeto
grant {
permission java.net.SocketPermission
“*:1024-65535”, “connect”;
permission java.io.FilePermission
“directorio”, “read”;
permission java.security.AllPermission;
};
CORBA
• Common Object Request Broker Architecture
• Es un middleware para la construcción de
sistemas distribuidos utilizando el paradigma
de programación orientada a objetos.
• Una de las principales ventajas de CORBA
es que cada uno de los componentes de
CORBA se pueden implementar en una gran
variedad de lenguajes.
CORBA
//Ejemplo de IDL en CORBA
struct Persona {
string nombre;
long año;
};
interface ListaPersonas {
void añadePersona(in Persona p);
long damePersona(in string nombre, out
Persona p);
};
CORBA
• CORBA maneja un modelo asíncrono de
comunicación, aunque también se puede
manejar un esquema de polling.
interface Produto {
string getDescripcion();
}
CORBA
• El compilador de IDL a Java se llama idlj o
idltojava en versiones antiguas:
• idlj Producto.idl
module Aplicación {
interface producto {
attribute string isbn;
};
interface Almacen { …};
};
CORBA
• Al ejecutar idlj Producto.idl se crean:
• El cual genera:
• Producto.hh: Producto, Producto_Helper, y
POA_Producto
• ProductoSK.cc implementación
CORBA
• Para ejecutar el servicio de nombres se corre el
programa tnameserv (depreciado) o el orbd con
el parámetro –ORBInitialPort 2809
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
public class SysPropImpl extends SysPropPOA {
public String getProperty(String clave) {
CORBA
return System.getProperty(clave);
}
}
public class ServidorPropSis {
public static void main(String args[]) {
try {
ORB orb = ORB.init(args, null);
POA poaraiz = (POA)
orb.resolve_initial_references(“RootPOA”);
CORBA
poaraiz.the_POAManager().activate();
SysPropImpl impl = new SysPropImpl();
org.omg.CORBA.Object ref =
poa.raiz.servant_to_reference(impl);
org.omg.CORBA.Object objContDenom =
orb.resolve_initial_references(“NameService”);
NamingContext contexto =
NamingContextHelper.narrow(objContDenom);
CORBA
NameComponent[] ruta = { new
NameComponent(“SysProp”, “Object”)};
Contexto.rebind(ruta, ref);
orb.run();
} catch (Exception e) {
e.printStackTrace(System.out);
}
}
}
Modelo de servicios Web
Formularios Web
Lógica aplicación
Servicios SO
Servicios Web
• Los servicios Web van de la mano de las
tecnologías XML.
Proveedor de Servicios
Servicio Conectar
Publicar
Descripción Cliente
Servicios Web
• Los datos viajan envueltos en un protocolo llamado
SOAP (Simple Object Access Protcol) que hace el
marshalling de los datos.
Servicio web
Protocolo HTTP
Formato del mensaje SOAP
Descripción WSDL
Descubrimiento UDDI
Ventajas de los Servicios Web
• Basados en estándares.
– Fácil integración.
• Independencia de plataforma.
class ClienteFecha
{
public static void Main()
{
ServicioFecha s = new ServicioFecha();
• <operation name=“AuthorSearchRequest”/>
• <input
message=“typens:AuthorSearchRequest”/>
• <output
message=“typens:AuthorSearchResponse”>
• </operation> ….
Servicios Web
Los tipos de datos se definen en otra parte
<xsd:complexType name=“AuthorRequest”>
<xsd:all>
<xsd:element name=“autor” type=“xsd:string”/>
<xsd:element name=“sort” type=“xsd:string”
minOccurs=“0”/>
</xsd:all>
</xsd:complexType>
Servicios Web
• Cuando se traduce a Java queda:
• Utilizar cachés.
• 2.2 Sincronización
• 2.3Nominación
2.2 Sincronización
• 2.2.1 Relojes físicos.
• M = Filósofos
• C = Tenedores
• E =Pensando
Redes de Petri
Diseño
• Se pueden utilizar otros lenguajes de modelado
como UML para especificar las actividades que
realiza un sistema distribuido.
• Emplear paralelismo
• Comprimir datos.
• Minimizar la latencia.
• Poner el mayor procesamiento posible dentro
del cliente (clientes pesados).
Desarrollo
• Poner todas las actividades de cómputo
intensivo (audio, video, interfaces gráficas, etc.)
en el cliente.
• Localización de funciones
• Distribución de recursos
• Mapeo a la realidad
• Diseño completo
Localización de funciones
• Identificar funciones
8:06 8:12
8:05 8:13
Sincronización de relojes
• Hay 2 tipos de sincronización del reloj:
1 2
p1
a b m1
3 4
Phy s ic al
p2
ti me
c d m2
1 5
p3
e f
2.2.3 Usos de la sincronización
• La sincronización de procesos distribuidos tiene
una infinidad de aplicaciones a continuación se
muestran los principales usos.
Manejo de Caché
• La caché es un área de memoria utilizada para
agilizar los procesos de lectura-escritura.
• 2.2 Sincronización
• 2.3Nominación
2.3 Nominación
• 2.3.1 Características y estructuras.
• Protocolo://maquina.dominio/recurso?param
entros
Nombres
Nombres
Nombres
Referencias
• Liberty, Jesse, Horvarth, David (200).
Aprendiendo C++ para Linux en 21 Días.
México, Prentice Hall.