2013-06-14 4 views
7

여러 프로세스에서 사용할 공유 메모리를 만들려고합니다. 이러한 프로세스는 MPI 호출 (MPI_Send, MPI_Recv)을 사용하여 서로 통신합니다.더 나은 세마포어 또는 플록 이름 C linux

이 공유 메모리의 액세스를 제어하는 ​​메커니즘이 필요합니다. 어제 MPI가이를 수행 할 수있는 기능을 제공하는지 확인하기 위해 질문을 추가했습니다. Shared memory access control mechanism for processes created by MPI이지만 MPI는 그러한 조항이 없다고 생각합니다.

그래서 named semaphore 또는 flock 중에서 선택해야합니다.

sem_cloe()을 호출하지 않고 갑자기 프로세스가 중단되면 명명 된 세마포어의 경우 해당 세마포가 항상 남아 있고 ll /dev/shm/으로 볼 수 있습니다. 이것은 때때로 교착 상태가 발생합니다 (동일한 코드를 다시 실행하면!), 이런 이유로 저는 현재 flock을 사용하려고합니다.

flock이 이러한 유형의 작업에 가장 적합한 지 확인하고 싶습니까?

flock의 단점이 있습니까?

여기서 사용할 수있는 named semaphoreflock 이외의 것이 있습니까?

나는 리눅스에서 C로 작업하고있다.

답변

8

또한 공유 메모리에서 POSIX 뮤텍스를 사용할 수 있습니다. 먼저 "pshared"속성을 설정해야합니다. pthread_mutexattr_setpshared을 참조하십시오. 이것은 아마도 당신이 원하는 것을 할 수있는 가장 직접적인 방법 일 것입니다.

그렇다면 여전히 사용하고있는 동안에도 이름이 지정된 세마포어에 sem_unlink을 호출 할 수 있습니다. 그러면 파일 시스템에서 제거되지만 기본 세마포어 객체는 마지막 프로세스가 sem_close을 호출 할 때까지 계속 존재합니다 (프로세스가 종료되거나 충돌하면 자동으로 발생합니다).

flock을 사용하면 두 가지 사소한 단점이 있다고 생각할 수 있습니다. 첫째, 이것은 POSIX가 아니기 때문에 대부분의 Unixes가 실제로 구현한다고 믿지만 코드가 다소 덜 이식성있게 만듭니다. 둘째, 시스템 호출로 구현되므로 속도가 느려집니다. pthread_mutex_locksem_wait 모두 Linux에서 "futex"메커니즘을 사용합니다. 실제로는 기다려야 할 때만 시스템 호출을 수행합니다. 이것은 자물쇠를 잡고 잡아 당기고있는 경우에만 문제가됩니다.

+0

+1하지만 나는 그 '무리'를 추가하고 싶습니다. 비슷한 메커니즘이 확실히 좋은 선택이 아닙니다. 이들은 파일의 동시 사용을 보호하고 다른 용도로는 사용하지 못하도록 설계되었습니다. 특히, 파일에서 다른 것이 발생하지 않으면 파일 메타 데이터 (잠금과 같은)가 다른 프로세스에서 볼 수있을 때 지정되지 않습니다. 이것을 위해 설계되지 않은 목적으로 이것을 사용하지 마십시오. –