NAS에서 파일에 액세스하는 두 프로세스를 동기화하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/472329

문제

다음은 다음과 같습니다. C ++로 작성되고 다른 OS (Linux 및 하나의 창)이있는 두 개의 기계에서 실행되는 두 개의 응용 프로그램이 있습니다. 이 프로세스 중 하나는 NAS (네트워크 첨부 스토리지)에서 XML 파일을 업데이트하는 반면 다른 하나는이 파일을 읽습니다.

파일이 수정되는 동시에 파일을 읽지 않기 위해이 두 프로세스를 동기화 할 수 있습니까?

도움이 되었습니까?

해결책

쓰기를하기 전에 생성 된 서버에서 잠금 파일을 만들 수 있습니다. 기다렸다가 작성하고 완료시 삭제하고, 파일을 읽기 전에 토큰에 대한 읽기 프로세스 점검을받을 수 있습니다.

편집하다: 주석을 다루기 위해 두 번 확인 된 잠금 유형 패턴을 구현할 수 있습니다. 독자와 작가 모두 잠금 파일을 갖도록하고 작업하기 전에 다음과 같은 것과 같은 작업을 수행하십시오.

Reader : 쓰기 잠금 파일을 확인하고, 읽기 잠금 파일을 만들고, 쓰기 잠금 파일을 확인하고, 파일을 삭제하고 중단하는 경우.

Writer : 읽기 잠금 파일을 확인하고, 쓰기 잠금 파일을 만들고, 읽기 잠금 파일을 확인하고, 삭제 잠금 파일을 삭제하고 중단하는 경우.

이렇게하면 프로세스가 서로 짓밟히는 프로세스가 중단되지만 잠재적 인 레이스 조건은 잠재적으로 두 프로세스를 확인할 수 있다는 점에서 발생할 수 있습니다. 이로 인해 데이터가 일관되지 않은 상태에서 읽지는 않지만 두 가지 읽기가 발생합니다. 지정된 지연을 위해 중단하는 프로세스를 작성합니다

다른 팁

답변 해 주셔서 감사합니다.

마침내 우리는 OS의 잠금 명령을 사용하는 것이 아니라 (NAS 헤드의 OS로 올바르게 전파 될 것이기 때문에) 잠금 파일 대신 잠금 디렉토리를 만들어 문제를 해결했습니다. 디렉토리 생성은 원자 연산이며 폴더가 이미 존재하는 경우 오류 값을 반환합니다. 따라서 잠금 장치를 획득하기 전에 잠금 존재를 확인할 필요가 없습니다. 두 작업은 한 단계로 이루어집니다.

알겠습니다. 액세스를 제어하려면 어떤 형태의 잠금 메커니즘이 필요합니다.

대부분의 *닉스 파일 시스템이이를 제공합니다. Windows 파일 시스템에서도 사용할 수 있다고 생각하지만 (이 메커니즘은 PERL에서 사용하므로) 다른 이름을 가질 수 있습니다.

Flock ()을 살펴보십시오.
이것은 파일 잠금 메커니즘입니다. 자문 잠금 장치이므로 실제로 파일을 잠그지 않고 사용량을 방지하지는 않지만 파일을 표시하는 메커니즘을 제공합니다. 두 응용 프로그램 모두 메커니즘을 사용하면 파일에 대한 액세스를 제어 할 수 있습니다.

Flock ()은 공유 잠금 장치 (또는 읽기 잠금) 및 독점 잠금 (또는 쓰기 잠금)을 제공합니다. Flock은 사용자가 파일을 잠금 해제 할 때까지 (바쁜 방식으로) 스레드를 차단합니다 (또한 차단 비 블로킹 점검을 제공하므로 대기 중에 다른 작업을 수행 할 수 있습니다).

Man Pages의 섹션 2에서 플록을 확인하십시오.

int     flock(int fd, int operation);

Flock() applies or removes an advisory lock on the file associated with the file
descriptor fd.  A lock is applied by specifying an operation parameter that is
one of LOCK_SH or LOCK_EX with the optional addition of LOCK_NB.  To unlock an
existing lock operation should be LOCK_UN.

파일이 NFS 공유에 상주하면 사용할 수 있습니다. fcntl (2) 파일을 잠그려면. 질문을 확인하십시오 D10 에서 Linux NFS FAQ. 나는 Windows API에 대한 경험이 거의 없지만 내가 들었던 것에 따르면 posix 지원이 양호하므로 posix.1-2001을 지원하는 한 FCNTL을 사용할 수 있어야합니다.

다른 프로토콜 (IE AFS 또는 SMB)을 사용하여 파일에 액세스하는 경우 IPC 인터페이스를 통해 잠금을 관리하는 간단한 동기화 서버를 설정할 수 있습니까?

파일에서 데이터베이스로 전환 할 수 있습니까?

이러한 유형의 동시성은 DBMS가 매우 잘 관리하는 것입니다. 비싸거나 설치하기가 어려울 필요는 없습니다. MySQL, Postgress 또는 Javadb는 모두 비용 으로이 우아하게 처리 할 것입니다.

데이터베이스 옵션에 실패하면 작성 프로세스가 "hidden"파일 이름 ".upDateInprogress.xml"과 같은 "Hidden"파일 이름으로 작성하고 업데이트가 완료되면 파일의 이름을 바꿉니다. 대부분의 시스템에서 "MV"또는 "Ren"은 원자 연산이므로 읽기 프로세스는 이전 파일 또는 최신 파일을 선택하지만 절반은 절반으로 작성되지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top