Windows에서 이름없는 공유 메모리를 언제 선택하겠습니까?Un-named shared memory는 언제 사용합니까?
스레드간에 전달되는 메시지가별로 유용하지 않은 것처럼 보입니다. 대신 구조체/변수에 대한 포인터를 작업자 스레드에 전달하고 CreateFileMapping 시스템 호출을 호출하는 대신 공유 메모리로 대신 사용할 수 있습니다.
Windows에서 이름없는 공유 메모리를 언제 선택하겠습니까?Un-named shared memory는 언제 사용합니까?
스레드간에 전달되는 메시지가별로 유용하지 않은 것처럼 보입니다. 대신 구조체/변수에 대한 포인터를 작업자 스레드에 전달하고 CreateFileMapping 시스템 호출을 호출하는 대신 공유 메모리로 대신 사용할 수 있습니다.
이름없는 공유 메모리를 사용하는 한 가지 이유는 파일 매핑에 대한 액세스를 생성 프로세스에서 핸들을 제공 한 프로세스로만 제한하는 것입니다. 이 서비스 거부 공격을 할 수 있습니다 -
이름을 사용하지 않으면 액세스 할 수있는 프로세스 만 가져올 수 있습니다. MSDN docs for CreateFileMapping에서 :
하나의 파일 매핑 오브젝트는 는 과정 작성시 핸들을 상속 핸들을 복제하거나 가 이름으로 파일 매핑 개체를 여는 를 통해 여러 프로세스에 의해 공유 할 수 있습니다.
섹션 개체 (일명 "파일 매핑 개체")는 프로세스간에 메모리를 공유하는 데 사용되지 않습니다. 섹션 객체를 가장 잘 사용하는 것은 I/O를 수행하기 위해 파일을 매핑하는 것이고 대부분의 경우 객체 이름을 지정하는 것은 그다지 유용하지 않을 것입니다. 이름이없는 pagefile-backed 섹션 ("공유 메모리")의 경우 하위 프로세스가 핸들을 상속하여 섹션을 사용할 수 있습니다.
프로세스 경계를 넘어 이름없는 개체에 핸들을 전달할 수 있습니다. 즉, 실제로 응용 프로그램에서 이름이 지정되지 않은 메모리 맵을 만들고 에서없이 이름을 사용하여 액세스 할 수 있습니다!
DuplicateHandle
호출을 보면 프로세스 경계를 넘어 이름없는 객체에 핸들을 전달하는 데 사용할 수 있습니다.
왜이 경우 명명 된 객체를 사용하지 않는 것이 좋을까요? 이름이 지정되지 않은 것을 사용하면 이점이 있습니까? 우리는 공유 메모리의 이름을 아는 한 명명 된 공유 메모리에 대한 핸들을 얻을 수 있습니다. – aCuria
* 실제 * 이유는 없지만 명명 충돌을 걱정하지 않고 핸들을 동적으로 만들 수 있습니다. 또한 'Golbal' 네임 스페이스에 개체를 배치 할 필요가 없으며 보안 권한이있는 개체에 액세스하여 다른 사람이 개체를 열 수 없도록 할 수 있습니다. –
@aCuria - 우리는 클라이언트 - 서버 응용 프로그램에서이 작업을 수행합니다. 서버는 클라이언트가 찾을 수있는 공유 메모리의 이름 부분을 작성합니다. 각 연결에 대해 서버는 해당 연결에 대해 이름이없는 공유 메모리를 만들고이를 핸들에 전달합니다. 그런 다음 클라이언트와 서버는 이름없는 부분을 사용하여 통신 할 수 있습니다. 이렇게하면 동일한 서버에 여러 개의 연결을 허용 할 수 있으며 각 서버는 다른 서버에 영향을 미치지 않습니다. –
정확히 'I/O 할 파일 매핑'이란 무엇을 의미합니까? 텍스트 파일과 같은 것이 있다면, 우리는 파일에 대한 핸들을 LPVOID를 통해 필요한 스레드에 전달합니다. – aCuria
나는 당신이 파일에서 매핑을 위해 명명 된 섹션 객체를 필요로하지 않는다고 말하고있다. 그게 당신의 질문에 답 하죠, 그렇죠? – wj32