MEMORIA COMPARTIDA

Responder
Mensaje
Autor
Avatar de Usuario
Jawir
Mensajes: 50
Registrado: 16/02/2006 12:00 am

MEMORIA COMPARTIDA

#1 Mensaje por Jawir » 08/11/2008 5:09 am

Hola me gustaria saber si como en C existe lo de memoria compartida shmget, shmat, shmdt. Hay algo similar en Java para poder compartir una zona de memoria entre varios threads

Gracias

Avatar de Usuario
marioxcc
Mensajes: 170
Registrado: 17/10/2008 2:45 pm
Ubicación: México

Imposible :(

#2 Mensaje por marioxcc » 08/11/2008 4:13 pm

Yo programo en Java desde los 9 años, pero este lenguaje me desepcionó porque no permite el manejo de memoria a bajo nivel, es por eso que decidí aprender C. Si quieres manejar la memoria a bajo nivel (Como lo que mencionas), deberás aprender C.

dudusx
Mensajes: 19
Registrado: 05/11/2008 3:10 pm

#3 Mensaje por dudusx » 12/11/2008 1:55 pm

Hola Jawir,

Entiendo que quieres compartir memoria entre threads de distintos procesos, siendo de otro modo no necesitarias memoria compartida.

El problema es que la memoria compartida es un servicio del sistema operativo, como bien dices, en unix/linux se emplean las funciones shmget y shmat en Windows en cambio se emplearian CreateFileMapping y MapViewOfFile.

Estas funciones "mapean" paginas fisicas en el espacio de memoria virtual de un proceso. El problema es que Java no permite tener un manejo directo sobre el control de memoria como bien ha dicho arioxcc.

Salu2

Avatar de Usuario
scanfernan
Mensajes: 150
Registrado: 15/08/2005 11:00 pm
Ubicación: PUEBLA,PUE

#4 Mensaje por scanfernan » 22/02/2009 6:02 pm

Una posible solucion a esto es crear una clase Variabe_Compartida, y crear dentro los datos que quieres compartir con tus threads, el programa principal seria el encargado de crear una instancia de Variabe_Compartida, y pasarle la referencia a cada Thread, al crearlo o con algun metodo setVC(Variabe_Compartida v), eso es como lo hice para los clasicos problemas de concurrencia(Filosofos, Productor consumidor, Barbero, etc..).
Suerte :D :!:
- Si el Debuggear es el proceso de remover Bugs, entonces el programar debe ser el proceso de ponerlos.

igorlor
Mensajes: 2
Registrado: 23/10/2009 1:41 am

#5 Mensaje por igorlor » 23/10/2009 1:44 am

scanfernan escribió:Una posible solucion a esto es crear una clase Variabe_Compartida, y crear dentro los datos que quieres compartir con tus threads, el programa principal seria el encargado de crear una instancia de Variabe_Compartida, y pasarle la referencia a cada Thread, al crearlo o con algun metodo setVC(Variabe_Compartida v), eso es como lo hice para los clasicos problemas de concurrencia(Filosofos, Productor consumidor, Barbero, etc..).
Suerte :D :!:
A mi con eso me surge una duda, ¿Como paso esa istancia al hilo?Si lo paso vía constructor solo sería accesible en el "metodo" contructor y no en el run que es quien realmente ejecuta el hijo. Al metodo run no puedo pasarle la istancia porque no se referencia directamente sino vía hilo.start().
¿Como lo haces tú? ¿Podrias ponerme un ejemplo por favor?
Muchas gracias

Avatar de Usuario
scanfernan
Mensajes: 150
Registrado: 15/08/2005 11:00 pm
Ubicación: PUEBLA,PUE

#6 Mensaje por scanfernan » 23/10/2009 11:47 am

Código: Seleccionar todo

package Ejemplo;
import java.io.*;
public class Principal
{
private VariableCompartida vc;
private Hilo1 h1;
private Hilo2 h2;
public Principal()
{
vc=new VariableCompartida();
h1=new Hilo1(vc);
h2=new Hilo2(vc);
}
public void inicia()
{
	h1.start();
	h2.start();
}
public static void main(String args[])
{
	Principal p=new Principal();
	p.inicia();
}
}

Código: Seleccionar todo

package Ejemplo;
public class Hilo1 extends Thread{
private VariableCompartida vc;
public Hilo1(VariableCompartida vc)
{
	this.vc=vc;
}
public void run()
{

		for(int i=0;i<100;i++)
		{
		vc.decrementa();
		System.out.println(vc.lee());
		try{
			sleep((int)(Math.random()*1000));
		}catch(InterruptedException e){}
		}
		try{
			sleep(100);
		}catch(InterruptedException e){}
}
}

Código: Seleccionar todo

package Ejemplo;
public class Hilo2 extends Thread{
private VariableCompartida vc;
public Hilo2(VariableCompartida vc)
{
	this.vc=vc;
}
public void run()
{

		for(int i=0;i<100;i++)
		{
		vc.incrementa();
		System.out.println(vc.lee());
		try{
			sleep((int)(Math.random()*1000));
		}catch(InterruptedException e){}
		}
		try{
			sleep(100);
		}catch(InterruptedException e){}
	}
}

Código: Seleccionar todo

package Ejemplo;
public class VariableCompartida{
	private int x;
	public VariableCompartida()
	{
		x=0;
	}
	public void decrementa()
	{
		 x--;
	}
	public void incrementa()
	{
		 x++;
	}	
	public int lee()
	{
		return x;
	}
}
Un ejemplo rapido, falta el metodo de sincronizacion, ya que si lo ejecutas, notaras que aveces x termina con un valor diferente de 0
- Si el Debuggear es el proceso de remover Bugs, entonces el programar debe ser el proceso de ponerlos.

igorlor
Mensajes: 2
Registrado: 23/10/2009 1:41 am

#7 Mensaje por igorlor » 26/10/2009 3:35 am

Muchas gracias por tu respuesta,

Un saludo

me_llamo_david
Mensajes: 1
Registrado: 02/03/2018 9:34 am

Re: MEMORIA COMPARTIDA

#8 Mensaje por me_llamo_david » 02/03/2018 9:45 am

se podría usar JNI en java para hacer una librería escrita en c/c++ para poder usar la memoria compartida entre varios programas java :D

kspires223
Mensajes: 1
Registrado: 08/05/2018 4:35 am

Re: MEMORIA COMPARTIDA

#9 Mensaje por kspires223 » 08/05/2018 4:39 am

Este es un tutorial muy bueno
Definitivamente este tipo de ayuda nos ayuda a alentar Gracias

webxnil77
Mensajes: 1
Registrado: 25/05/2018 8:44 am

Re: MEMORIA COMPARTIDA

#10 Mensaje por webxnil77 » 25/05/2018 8:50 am

Obtuve la información. Gracias por el foro.




192168router

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados