본문 바로가기
Delphi Tip/파일

프로그램간의 메모리공유

by MonoSoft 2023. 7. 5.
728x90
반응형

프로그램간의 메모리공유

728x90

 

 

파일 매핑(File Mapping)은 파일을 메모리에 매핑하여

여러 프로세스 간에 해당 메모리를 공유할 수 있도록 해주는 기술입니다.

 

파일 매핑을 사용하면 여러 프로세스가 동일한 데이터를 읽고 쓸 수 있으며,

이를 통해 프로그램 간 효율적인 통신 및 데이터 공유가 가능해집니다.

 

개념은 물리적인 주소공간을 예약하고 각 주소공간에서

그 물리적 주소의 논리적인 주소를 얻는것 입니다.

그리고 그 논리적 주소에 자료를 쓰고 읽는 것이지요.

 

 

예제1

 

물리적 주소를 예약하는 방법

hMap := CreateFileMapping ( $FFFFFFFF, nil, PAGE_READWRITE, 0, 1024, stMapNa me );

stMapName은 고유한 공유할 열쇠의 문자열입니다.

const stMapName = '김찬호'

 

논리적인 주소를 얻는 방법

aPointer := MapViewOfFile( hMap, FILE_MAP_WRITE, 0, 0, 0);

 

그 메모리에 데이타를 입력하는 방법

with aPointer^ do

begin

  member1 = 123;

  member2 = 'abc';

end;

 

다른 주소공간에서 논리적 주소를 얻는 방법

hMap1 := OpenFileMapping( FILE_MAP_READ, false, stMapName);

bPointer := MapViewOfFile( hMap1, FILE_MAP_ALLACCESS, 0, 0, 0);

 

끝으로 논리적 주소공간을 사용하고 나서는

CloseHandle( hMap1);

unMapViewOfFile( bPointer);

닫아 주면 끗!

 

 

 

예제2

uses

 

Windows;

 

const

  FILE_MAP_READ = $0004; FILE_MAP_WRITE = $0002;

var

  hFileMapping: THandle;

  pViewOfFile: Pointer;

  procedure CreateFileMappingExample;

 

var

  hFile: THandle;

begin

  // 파일 매핑을 생성할 파일 열기

  hFile := CreateFile('C:\SharedData.dat',

                                   GENERIC_READ or GENERIC_WRITE, 0, nil, CREATE_ALWAYS, 

                                   FILE_ATTRIBUTE_NORMAL, 0);

 

  if hFile = INVALID_HANDLE_VALUE then

    RaiseLastOSError;

 

  try

    // 파일 크기 설정

    SetFilePointer(hFile, 1024 * SizeOf(Integer), nil, FILE_BEGIN); SetEndOfFile(hFile);

 

    // 파일 매핑 생성

    hFileMapping := CreateFileMapping(hFile, nil, PAGE_READWRITE, 0, 0, 'SharedDataMapping');

    if hFileMapping = 0 then

      RaiseLastOSError;

  finally

    CloseHandle(hFile);

  end;

end;

 

procedure OpenFileMappingExample;

begin

  // 기존 파일 매핑 열기

  hFileMapping := OpenFileMapping(FILE_MAP_READ or FILE_MAP_WRITE, False, 'SharedDataMapping');

  if  hFileMapping = 0 then

    RaiseLastOSError;

end;

 

procedure MapViewOfFileExample;

begin

  // 파일 매핑된 메모리에 대한 뷰 생성

  pViewOfFile := MapViewOfFile(hFileMapping, FILE_MAP_READ or FILE_MAP_WRITE, 0, 0, 0);

  if pViewOfFile = nil then

    RaiseLastOSError;

end;

 

procedure UnmapViewOfFileExample;

begin

  // 메모리 뷰 언매핑

  if not UnmapViewOfFile(pViewOfFile) then

    RaiseLastOSError;

end;

 

procedure CloseFileMappingExample;

begin

  // 파일 매핑 닫기

  if hFileMapping <> 0 then

    CloseHandle(hFileMapping);

end;

 

 

위의 예제는 파일 매핑을 생성하고 열고,

파일 매핑된 메모리에 대한 뷰를 생성하고 해제하는 과정을 보여줍니다.

 

CreateFileMappingExample 프로시저는 새 파일 매핑을 생성하고,

OpenFileMappingExample   프로시저는 기존 파일 매핑을 엽니다.

MapViewOfFileExample       프로시저는 파일 매핑된 메모리에 대한 뷰를 생성하고,

UnmapViewOfFileExample  프로시저는 메모리 뷰를 해제합니다.

CloseFileMappingExample  프로시저는 파일 매핑을 닫습니다.

 

이 예제에서는 단일 프로세스 내에서 파일 매핑을 생성하고 사용하는 방법을 보여주지만,

여러 프로세스가 같은 파일 매핑에 접근하여 데이터를 공유할 수도 있습니다.

 

이 경우에는 프로세스 간에 동기화 메커니즘이 필요할 수 있습니다.

또한, 파일 매핑된 메모리에는 구조체나 데이터를 저장할 수 있으며,

여러 프로세스 간에 이를 공유할 수 있습니다.

 

실제 프로젝트에서는 파일 매핑의 생성, 열기, 메모리 뷰 생성, 해제, 파일 매핑 닫기 등을

적절한 시점에 호출하여 프로그램 간의 메모리 공유를 구현할 수 있습니다.

 

728x90
반응형

'Delphi Tip > 파일' 카테고리의 다른 글

델파이 리소스(Resource)의 활용 1  (0) 2023.10.13
델파이 리소스(Resource)  (0) 2023.09.26
DLL만들기와 사용방법  (0) 2023.06.28
DLL(Dynamic-link library)란 (5)  (0) 2023.06.27
DLL(Dynamic-link library)란 (4)  (0) 2023.06.26

댓글