2010-12-20 3 views
2

저는 인터 프로세스 장벽에 대한 간단한 솔루션을 원했습니다. 여기에 솔루션 : solution프로세스가 공유 메모리를 처리하고 pthread_barrier가 어떻게 안전합니까?

하지만 나는 완전히 mmap과 함께 잃어버린 ... 내 첫 번째 시도와 함께, 그것은 10 번 (segfault 또는 교착 상태) 중 하나가 실패합니다.

내 문제는 동기화 문제에서 비롯된 것으로 알고 있지만 찾을 수 없습니다. 나는 mmaped 메모리 (example)를 설정하는 예제를 발견했다. 그러나 mmaped pthread_barrier에 대해 좋은지 확신 할 수 없다. 여기

내 코드의 추출 :

#define MMAP_FILE "/tmp/mmapped_bigdft.bin" 

void init_barrier() { 
    pthread_barrier_t *shared_mem_barrier; 
    pthread_barrierattr_t barattr; 
    pthread_barrierattr_setpshared(&barattr, PTHREAD_PROCESS_SHARED); 

    hbcast_fd = open(MMAP_FILE, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600); 
    result = lseek(hbcast_fd, sizeof(pthread_barrier_t)-1, SEEK_SET); 
    result = write(hbcast_fd, "", 1); 
    shared_mem_barrier = (pthread_barrier_t*) mmap(0, sizeof(pthread_barrier_t), PROT_READ | PROT_WRITE, MAP_SHARED, hbcast_fd, 0); 
    if (mpi_rank == 0) { 
    int err = pthread_barrier_init(shared_mem_barrier, &barattr, host_size); 
    } 
    MPI_Barrier(some_communicator); 
} 

질문 :

  • 내가 mmap에 초기화에 뭔가를 그리워합니까?
  • 어떤 작업이 모든 프로세스에서 수행되어야하며 하나만 있어야합니까?

의 pthread 장벽을 관리하기위한 safier 뉴 질문

? 아니면 같은 메커니즘을 기반으로합니까?

  • 하는 shmget
  • shm_open
  • mmap에
  • 다른

답변

1

당신은 모든 프로세스에 대한 O_TRUNC와 파일을 열 싶지 않아요. 그렇게 할 때마다 파일을 다시 자르고 수행 한 이전 mmap 작업을 무효화합니다 (이전 mmap의 파일 크기 변경시 일반적으로 정의되지 않은 영향).

그건 그렇고, 당신은 mmap'd 메모리에서 세마포어를 가질 수 있다고 생각하지 않으며 제대로 작동합니다 (OS 플랫폼에 따라 다를 수 있으므로 일반적으로 원하는 방식으로 작동하는 것이 확실합니다.).

정말로 사용하고 싶은 것은 공유 메모리입니다. 공유 메모리를 만들고 매핑하는 방법을 배우려면 "shmget"및 "shmat"에서 man을 수행하십시오. 아마도 공유 메모리 ID를 전달하기위한 파일이 필요할 것이고, 시그널 핸들러를 등록함으로써 애플리케이션이 충돌하는 동안 공유 메모리 ID를 해제하는 것에주의해야한다. 그렇지 않으면 좀비 공유 메모리 할당을 그대로두고 OS 리소스 제한을 초과 할 수 있습니다. 마스터 쓰레드에서 공유 메모리 세그먼트를 만들려고 할 때 ENOSPC을 얻으면 그 일이 일어난다는 것을 알 수있다.

+1

이 모든 것을 설명하는 포인터가 있습니까? 당신은 mmap이 pthread_barrier를위한 최선이 아니라고했습니다. shmget는 더 낫다? 다른 점이 있습니까? –

2

찰스 (Charles)가 언급했듯이, 잘린 부분이 여러분에게 전달되는 것 같습니다. 또한 pthread_barrierattr_init를 사용하여 속성을 초기화해야합니다.

다른 질문으로, 단 하나의 프로세스가 초기화를 수행해야하며 모든 프로세스는 pthread_barrier_wait (MPI와 마찬가지로)를 호출해야합니다.

나는 당신의 다른 질문을 보았습니다. 그래서 당신이 왜 MPI를 사용하고 싶지 않은지 압니다.그래서 당신은 아마과 같이, 당신의 pthread 장벽을 초기화 할 단 하나의 MPI 장벽을 할 거라고 :

if (rank == 0) 
{ 
    /* Create the shared memory segment, initialise the barrier. */ 
} 
MPI_Barrier(communicator); 
if (rank != 0) 
{ 
    /* Load the shared memory segment, cast it to a pthread_barrier_t* and store. 
    * It's already initialised */ 
} 
+0

어떤 공유 메모리 방법을 사용 하시겠습니까? –

+0

마지막으로 프로세스 간 장애물을 처리해야 할 때 MPI를 사용했습니다.) POSIX 공유 메모리가 잘되어 있어야하며, 이는 이미 사용하고있는 것입니다. 공유 메모리가 제대로 초기화되기 전에 다른 프로세스가 공유 메모리에 액세스하는 것을 막을 필요가 있습니다. – axw

+0

내 질문은 pthread_barrier에 어떤 공유 메모리 패러다임을 사용해야하는지에 관한 질문이었습니다 : mmap, shmget, 또 하나? –

1

당신은 공유 세그먼트를 만들 shm_open를 사용해야합니다. 프로세스 세그먼트를 만들 수있는 첫 번째 경우 감지 할 수 있어야한다 O_CREAT paramenter와

  • .
  • 해당 프로세스 만 세그먼트를 적절한 길이로 trunctate해야하며 을 매핑하고 장벽을 초기화하십시오.
  • 이 인 경우 잠을 자고 나머지는 충분해야한다는 것을 감지하는 다른 모든 것들은 세그먼트를 매핑해야합니다.
  • 모든 프로세스가 장벽을 동기화 할 수 있습니다.
관련 문제