프로그램간의 메모리공유
파일 매핑(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 프로시저는 파일 매핑을 닫습니다.
이 예제에서는 단일 프로세스 내에서 파일 매핑을 생성하고 사용하는 방법을 보여주지만,
여러 프로세스가 같은 파일 매핑에 접근하여 데이터를 공유할 수도 있습니다.
이 경우에는 프로세스 간에 동기화 메커니즘이 필요할 수 있습니다.
또한, 파일 매핑된 메모리에는 구조체나 데이터를 저장할 수 있으며,
여러 프로세스 간에 이를 공유할 수 있습니다.
실제 프로젝트에서는 파일 매핑의 생성, 열기, 메모리 뷰 생성, 해제, 파일 매핑 닫기 등을
적절한 시점에 호출하여 프로그램 간의 메모리 공유를 구현할 수 있습니다.
'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 |
댓글