2010-11-18 2 views
3

Windows에서 이름없는 공유 메모리를 언제 선택하겠습니까?Un-named shared memory는 언제 사용합니까?

스레드간에 전달되는 메시지가별로 유용하지 않은 것처럼 보입니다. 대신 구조체/변수에 대한 포인터를 작업자 스레드에 전달하고 CreateFileMapping 시스템 호출을 호출하는 대신 공유 메모리로 대신 사용할 수 있습니다.

답변

3

이름없는 공유 메모리를 사용하는 한 가지 이유는 파일 매핑에 대한 액세스를 생성 프로세스에서 핸들을 제공 한 프로세스로만 제한하는 것입니다. 이 서비스 거부 공격을 할 수 있습니다 -

  • 이름을 알고 예방 또는 정당한 사용을 방해 명명 된 객체에 쪼그리고 수있는 매핑 된 파일을 만들 수있는 액세스 권한이있는 모든 프로세스는이 두 가지 문제를 피할 수 있습니다.
  • 악의적 인 이름 충돌이 아닌 우발적 인 충돌.

이름을 사용하지 않으면 액세스 할 수있는 프로세스 만 가져올 수 있습니다. MSDN docs for CreateFileMapping에서 :

하나의 파일 매핑 오브젝트는 는 과정 작성시 핸들을 상속 핸들을 복제하거나 가 이름으로 파일 매핑 개체를 여는 를 통해 여러 프로세스에 의해 공유 할 수 있습니다.

3

섹션 개체 (일명 "파일 매핑 개체")는 프로세스간에 메모리를 공유하는 데 사용되지 않습니다. 섹션 객체를 가장 잘 사용하는 것은 I/O를 수행하기 위해 파일을 매핑하는 것이고 대부분의 경우 객체 이름을 지정하는 것은 그다지 유용하지 않을 것입니다. 이름이없는 pagefile-backed 섹션 ("공유 메모리")의 경우 하위 프로세스가 핸들을 상속하여 섹션을 사용할 수 있습니다.

+0

정확히 'I/O 할 파일 매핑'이란 무엇을 의미합니까? 텍스트 파일과 같은 것이 있다면, 우리는 파일에 대한 핸들을 LPVOID를 통해 필요한 스레드에 전달합니다. – aCuria

+0

나는 당신이 파일에서 매핑을 위해 명명 된 섹션 객체를 필요로하지 않는다고 말하고있다. 그게 당신의 질문에 답 하죠, 그렇죠? – wj32

3

프로세스 경계를 ​​넘어 이름없는 개체에 핸들을 전달할 수 있습니다. 즉, 실제로 응용 프로그램에서 이름이 지정되지 않은 메모리 맵을 만들고 에서없이 이름을 사용하여 액세스 할 수 있습니다!

DuplicateHandle 호출을 보면 프로세스 경계를 ​​넘어 이름없는 객체에 핸들을 전달하는 데 사용할 수 있습니다.

+0

왜이 경우 명명 된 객체를 사용하지 않는 것이 좋을까요? 이름이 지정되지 않은 것을 사용하면 이점이 있습니까? 우리는 공유 메모리의 이름을 아는 한 명명 된 공유 메모리에 대한 핸들을 얻을 수 있습니다. – aCuria

+0

* 실제 * 이유는 없지만 명명 충돌을 걱정하지 않고 핸들을 동적으로 만들 수 있습니다. 또한 'Golbal' 네임 스페이스에 개체를 배치 할 필요가 없으며 보안 권한이있는 개체에 액세스하여 다른 사람이 개체를 열 수 없도록 할 수 있습니다. –

+0

@aCuria - 우리는 클라이언트 - 서버 응용 프로그램에서이 작업을 수행합니다. 서버는 클라이언트가 찾을 수있는 공유 메모리의 이름 부분을 작성합니다. 각 연결에 대해 서버는 해당 연결에 대해 이름이없는 공유 메모리를 만들고이를 핸들에 전달합니다. 그런 다음 클라이언트와 서버는 이름없는 부분을 사용하여 통신 할 수 있습니다. 이렇게하면 동일한 서버에 여러 개의 연결을 허용 할 수 있으며 각 서버는 다른 서버에 영향을 미치지 않습니다. –