실제로 공유 메모리에 대한 독립적인 동시 쓰기로 인해 발생하는 문제가 궁금합니다.
더 자세하게, 세 개의 프로세스(proc1, proc2, proc3)가 있다고 가정합니다. 이 3개 프로세스는 공유 메모리 IPC 기반 링 버퍼를 사용하려고 합니다. proc1이 링 버퍼에 동시 쓰기를 수행하고 잠금을 획득하면 잠금을 기다리는 proc2 및 proc3에 어떤 일이 발생합니까? proc1은 분명히 proc2와 proc3을 차단하여 다른 활동을 방지합니다.
위 시나리오에서 우리가 직면하고 있는 모든 문제는 무엇이며 효과적인 해결책은 무엇인지 설명하는 데 도움을 줄 수 있는 사람이 있습니까?
미리 감사드립니다!
답변1
이 세 가지 프로세스의 문제점은 서로의 데이터를 손상시킬 수 있다는 것입니다. 링 버퍼에는 읽기 인덱스 변수, 쓰기 인덱스 변수 및 10개의 위치가 있습니다.
인덱스 변수가 위치 #4를 가리킨다고 가정합니다.
프로세스 1이 버퍼에 추가하기를 원한다고 가정합니다. 따라서 프로세스 1은 쓰기 인덱스 변수를 검색하고 해당 데이터를 위치 4에 쓴 다음 쓰기 인덱스를 증가시켜 이제 #5가 됩니다. 여태까지는 그런대로 잘됐다.
이제 프로세스 2와 3 모두 버퍼에 추가하려고 합니다. 프로세스 2는 쓰기 인덱스를 검색하고 #5를 확인합니다. 프로세스 3은 쓰기 인덱스를 검색하고 #5도 확인합니다. 그런 다음 프로세스 2는 해당 데이터를 위치 5에 기록하지만 해당 데이터는 프로세스 3에 의해 즉시 삭제됩니다(결국 동일한 위치를 보게 됩니다!). 마지막으로 프로세스 2와 3 모두 쓰기 인덱스를 증가시킵니다. 타이밍과 특정 구현에 따라 쓰기 인덱스는 6 또는 7이 될 수 있습니다.
이 문제에 대한 한 가지 해결책은 전체 작업을 원자성으로 만드는 것입니다. 즉, 프로세스 3은 프로세스 2가 완료될 때까지 링 버퍼에서 어떤 작업도 수행할 수 없습니다. 그것이 바로 자물쇠의 목적입니다.