2013-08-05 2 views
6

가능한 많은 주 공간에서 병렬 검색을 수행하는 프로그램을 작성해야합니다. 프로세스에서 새로운 영역이 발견되고 (탐색이 시작됨), 일부 지역은 중간 결과가 다른 곳에서 얻어진대로 일찍 종결 됨으로써 새로운 유용한 결과를 발견 할 가능성을 제거합니다. 검색은 중간 데이터의 재 계산을 피하기 위해 서로 무거운 협력 관계로 실행되는 여러 스레드를 사용하여 수행됩니다.전원/하드웨어/OS 장애에 대한 저항성이있는 프로그램

복잡한 내부 상태 (사용하는 여러 스레드 및 상태 동기화 프리미티브의 호출 스택 포함)는 전체 프로세스 동안 유지 관리되고 업데이트되어야하며 계산을 실행 가능한 격리 된 청크로 분할하는 명백한 방법이 없습니다 순차적으로 각각 작은 중간 결과를 저장하고 전달합니다. 또한 많은 양의 중간 데이터를 재 계산하기 때문에 엄청난 오버 헤드를 부과하지 않고 계산을 서로 통신하지 않는 독립적 인 병렬 스레드로 분할 할 방법이 없습니다.

큰 검색 도메인으로 인해 프로그램은 최종 결과를 산출하기 전에 수개월 동안 실행될 수 있습니다. 따라서 현재까지 수행 된 모든 작업이 완전히 손실 될 수있는 프로그램 실행 중 전원, 하드웨어 또는 OS 장애의 위험이 있습니다. 이 경우 프로그램은 모든 계산을 처음부터 다시 시작해야합니다.

이러한 경우 완전한 데이터 손실을 방지 할 수있는 솔루션이 필요합니다. 필자는 중복 디스크 어레이 나 데이터베이스와 같은 장애 방지 스토리지에 프로세스의 현재 상태를 지속적으로 저장하는 실행 엔진/플랫폼에 대해 생각했습니다. 그러나이 방법은 가능한 실패로 인한 재시작을 포함하여 예상 된 계산 시간과 비교할 때 이점이 없을 정도로 프로세스를 크게 늦출 수 있음을 이해합니다.

사실, 이 계속적으로 번 프로그램 상태를 저장하는 이상적인 솔루션이 필요하지 않으며, 수 시간 또는 며칠간의 작업 손실을 쉽게 감수 할 수 있습니다. 가능한 한 중금속 솔루션은 가상 시스템 내에서 프로그램을 실행하고 스냅 샷을 수시로 저장하며 최근 스냅 샷에서 가능한 호스트 장애가 발생한 후에 시스템을 복원하는 것입니다. 이 방법은 또한 임의 또는 예방 가능한 게스트 OS 장애가 발생한 후 프로그램 상태를 복구하는 데 도움이 될 수 있습니다.

단일 프로세스의 상태를 유지하는 것과 비슷하지만보다 가벼운 솔루션이 있습니까? 또는 내 문제를 해결할 수있는 다른 방법을 제안 할 수 있습니까?

+0

VM 솔루션은 개발자의 관점에서 생각하고 있지만 복잡한 상태 저장 및 다중 스레드 프로세스로 다시로드하는 기능으로 인해 부담 스럽습니다. 단순한 " VM이 스냅 샷을 저장하는 동안 탐험 프로세스에 "일시 중지"메커니즘을 추가하여 안전성을 높이는 것이 좋습니다. –

+0

거기에는 "체크 포인트"를 저장하는 다양한 소프트웨어가 있습니다 ...하지만 당신은 사용하고자하는 OS 또는 프로그래밍 언어를 언급하지 않습니다. – idfah

답변

1

많은 수의 스레드가 비교적 저렴한 비용으로 실행될 수 있도록하는 Erlang을 사용하는 것이 좋습니다. 스레드 비용이 낮기 때문에 안정성을 높이기 위해 중복성을 사용할 수 있습니다.

현재 문제에 대해서는 세 가지 이상의 시스템에서 동기화에 대한 주기적 검사가 실패한 투표자가 결정할 수있는 3 중 중복 구조가 있습니다.

+0

그리고'mnesia' 테이블을 사용하면 1 대가 넘는 머신에 중복 된 상태를 저장할 수 있습니다. – haavee

관련 문제