문제

내 서비스는 몇 비트의 정보를 저장해야합니다 (최소한 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와 같은)이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top