Windows에서 SHM_OPEN을 모방하는 방법은 무엇입니까?
-
12-09-2019 - |
문제
내 서비스는 몇 비트의 정보를 저장해야합니다 (최소한 20 비트 이상이지만 더 쉽게 사용할 수 있음).
- 서비스가 충돌하거나 비정상적으로 종료 된 경우에도 서비스 재시작에 걸쳐 지속됩니다.
- 재부팅에서 지속되지 않습니다
- 오버 헤드가 거의없이 읽고 업데이트 할 수 있습니다
이 정보를 레지스트리 또는 파일에 저장하면 시스템이 재부팅 될 때 자동으로 비워지지 않습니다.
이제 현대 POSIX 시스템을 사용했다면 shm_open
, 프로세스 재시작을 통해 지속되지만 시스템 재부팅이 아닌 공유 메모리 세그먼트를 생성하면 사용할 수 있습니다. shm_unlink
지속적인 데이터가 어떻게 든 손상되면 정리합니다.
나는 찾았다 MSDN : 이름이 지정된 공유 메모리 생성 그리고 내 서비스 내에서 그것의 조각을 다시 구현하기 시작했습니다. 이것은 기본적으로 사용됩니다 CreateFileMapping(INVALID_HANDLE_NAME, ..., PAGE_READWRITE, ..., "Global\\my_service")
대신에 shm_open("/my_service", O_RDWR, O_CREAT)
.
그러나 특히이 페이지 파일 지원 매핑의 수명을 중심으로 몇 가지 우려 사항이 있습니다. MSDN 문서에서 이러한 질문에 대한 답변을 찾지 못했습니다.
- 매핑이 재부팅에 걸쳐 지속됩니까?
- 그렇지 않은 경우, 모든 열린 핸들이 닫히면 매핑이 사라 집니까?
- 그렇지 않은 경우 매핑을 제거하거나 지우는 방법이 있습니까? 사용 중에있을 필요는 없습니다.
재부팅에 걸쳐 지속되거나 참조되지 않으면 사라지거나 수동으로 재설정 할 수없는 경우이 방법은 나에게 쓸모가 없습니다.
이 점에서 결함을 확인하거나 찾거나 다른 접근법을 추천 할 수 있습니까?
재부팅시 정리 된 디렉토리가 있다면 임시 파일로 데이터를 저장할 수 있지만 여전히 이상적이지 않을 것입니다. 특정 시스템로드에서는 파일 열기/쓰기 실패 (희귀,, 희귀,)가 발생합니다. 시간의 0.01% 미만이지만 여전히 일어나고 있습니다),이 기능은 로깅 경로에서 사용됩니다. 여기에 더 이상 파일 작업을 소개하지 않기를 바랍니다.
해결책
공유 메모리 매핑은 재부팅 전체에서 지속되지 않으며 모든 핸들이 닫히면 사라집니다. 메모리 매핑 객체는 커널 객체입니다. 클로즈 핸들을 통해 명시 적으로 또는 참조가 포함 된 프로세스가 종료 될 때마다 마지막 참조가 사라질 때 항상 삭제됩니다.
레지스트리 키를 만들어보십시오 regcreatekeyex REG_OPTION_VOLATILE을 사용하면 해당 하이브가 언로드 될 때 데이터가 보존되지 않습니다. 이것은 HKLM의 시스템 종료 또는 HKCU의 사용자 로그 오프에 있습니다.
다른 팁
공유 메모리 대신 직렬화를 원할 것 같습니까? 그것이 실제로 당신의 응용 프로그램에 적합한 경우, 당신이 직렬화하는 방식은 당신의 언어에 따라 다릅니다. C ++를 사용하는 경우 Boost :: Serialize를 확인하십시오. C#은 의심 할 여지없이 많은 직렬화 옵션 (Java와 같은)이 있습니다.