2011-08-27 5 views
1

Linux 또는 다른 최신 OS에서는 각 프로세스의 메모리가 보호되므로 한 프로세스의 와일드 라이트가 다른 프로세스를 중단시키지 않습니다. 이제 프로세스 A와 프로세스 B가 공유하는 메모리가 있다고 가정합니다. 이제 소프트 오류로 인해 프로세스 A가 실수로 해당 메모리 영역에 무언가를 씁니다. 프로세스 A와 프로세스 B 모두 해당 메모리에 대한 전체 쓰기 액세스 권한을 가지고 있기 때문에이를 보호 할 수있는 방법이 있습니까?Linux에서 프로세스간에 공유되는 메모리를 보호하는 방법

답변

2

shm_open으로 전화 할 때 O_RDONLY 플래그를 mode 매개 변수에 전달할 수 있습니다.

또는 mprotect을 사용하여 특정 페이지를 (예 : 읽기 전용으로) 표시 할 수 있습니다. 이렇게하려면 두 프로세스간에 협력과 신뢰가 필요합니다. A가 mprotect을 사용하여 쓸 수 없다고 B가 말할 수있는 방법은 없습니다.

다른 프로세스가 간섭을 일으키지 않도록하려면 파이프 또는 소켓을 통해 의사 소통을하는 것이 현명한 아이디어 일 수 있습니다.

mmap을 사용하여 무언가를 매핑 할 수도 있습니다 (예 : /dev/shm?). 파일 권한이 별도의 UID로 실행중인 경우 두 프로세스 중 하나에 쓸 수 없도록 만듭니다. 예를 들어, 사용자 생성자 및 그룹 소비자가 소유 한 /dev/shm/myprocess이 있고 해당 UID 및 GID로 실행중인 프로세스로 매핑하기 전에 파일 사용 권한을 0640으로 설정 한 경우 두 번째 프로세스가이 프로세스에 쓰지 못하게 할 수 있습니다.

+0

나는 mprotect에 대해 알고 있지만, 내가 말했듯이, 둘 다 전체 읽기 및 쓰기 액세스 권한이 있습니다. 이 문제를 해결하는 것은 불가능한 것처럼 보입니다. 안정성은 공유 메모리 시스템의 주요 문제 중 하나라고 생각합니다. 안 그래? – MetallicPriest

+1

@MetallicPriest가 오픈 콜을위한'O_RDONLY' 플래그를 추가하도록 업데이트되었습니다. 이것에 대한 다른 해결책도 있습니다. 나는 곧 다시 업데이트 할 것이다. – Flexo

+0

awoodland에게 감사드립니다. 한 가지 해결책은 공유 메모리에 액세스 할 때마다 뮤텍스를 사용하고 뮤텍스를 잠근 경우에만 프로세스에 대한 쓰기 액세스 권한을 부여하는 것입니다. 그러면 야생 작성 기회가 줄어 듭니다. 그러나 공유 메모리 액세스 빈도가 높을 때이 계획이 매우 비효율적이라고 생각합니다. – MetallicPriest

0

각 쓰기에 간단한 체크섬을 사용할 수 있습니다. 따라서 프로세스가 읽기 작업시 잘못된 체크섬을 감지하면 다른 프로세스가 실패했음을 표시합니다.

+0

체크섬을 사용할 수도 있지만 체크섬만으로는 어떤 형태의 동기화 없이는 끔찍한 해결책이 될 수 있기 때문에 세마포어를 사용하는 것도 고려해보십시오. 그러나 확실한 최상의 솔루션은 메모리를 쓰고 읽는 단일 마스터를 소켓을 통해 통신하여 각 쓰기를 검증 할 수 있도록하는 것입니다. – Martin

관련 문제