2013-11-28 3 views
1

저는 병렬로 계산을 수행하는 Java 프로그램을 가지고 있습니다. 하나의 컴퓨터에서 실행하거나 여러 대의 다른 컴퓨터를 사용하여 실행할 수 있습니다.배리어와의 프로세스 간 동기화

단일 시스템에서 실행될 때 스레드 동기화는 java.util.concurrent.CyclicBarrier 패키지의 CyclicBarrier 클래스를 사용하여 성공적으로 수행됩니다. 아이디어는 계산을 계속하기 전에 모든 스레드가 다른 스레드가 같은 지점에 도착할 때까지 기다려야한다는 것입니다.

여러 대의 다른 컴퓨터에서 실행될 때 프로세스 간 통신은 RMI (Remote Method Invocation)를 통해 구현됩니다. 이 상황에서 같은 문제가 생겼고 계속 진행하기 전에 다른 프로세스가 같은 지점에 도착할 때까지 프로세스의 스레드가 기다려야합니다. 이 클래스는 직렬화되지 않기 때문에 서로 다른 프로세스간에 공유 된 CyclicBarrier 개체를 사용할 수 없습니다.

여러 컴퓨터에서 서로 다른 프로세스에서 실행되는 스레드에서이 장벽 동작을 얻으려면 어떻게해야합니까?

감사합니다.

+1

이 작업이 덜 복잡해 보이는 환경을 설정할 수 있습니다. 즉, 도착한 파티를 계산하기 위해 분산 된 'AtomicNumber'를 사용하는 [Hazelcast의 샘플 구현] (https://code.google.com/p/hazelcast/issues/detail?id=435)입니다. –

+1

직렬화가 가능하더라도 공유되지 않습니다. 이를 직렬화하면 공유 객체가 아닌 대상에 새로운 사본이 작성됩니다. – EJP

답변

3

프로세스간에 순환 고리를 전달하지 않아도됩니다. CyclicBarrier를 차례로 사용하는 RMI 호출을 수행 할 수 있습니다. 분산 된 Lock 및 기타 여러 컬렉션을 지원하는 HazelCast를 살펴 보시기 바랍니다.

IMHO 모든 프로세스가 실제로 확인해야하는지 여부와 처음부터이 프로세스가 필요하지 않도록하는 방법을 찾으십시오.

+0

CyclicBarrier를 사용하는 RMI 호출은 좋은 생각입니다! 또한이 문제를 해결하기 위해 비동기 기술을 (그리고이 프로세스 동기화 문제를 피하기 위해) 찾고 있습니다. HazelCast도 대단한 것 같습니다. 제 3 자 클러스터에서이 실험을 실행하고 있기 때문에 사용할 수 있을지 확신 할 수 없으며 시스템을 많이 제어 할 수 없습니다. 팁 주셔서 감사. –