[OS] Chap13-05 : 파일 시스템 인터페이스_메모리 사상 파일
운영체제(Operating System Concepts) 를 읽고 정리한 정리본입니다.
📌 Chap13-04 : 파일 시스템 인터페이스_메모리 사상 파일
open(), read(), write() 와 같은 시스템 콜을 사용하여 파일에 액세스할 수 있다.
디스크에 있는 파일을 순차적으로 읽는다고 가정한다면, 파일이 매번 액세스될 때마다 시스템 콜을 해야 하고, 디스크 입출력을 유발하므로 오버헤드가 클 것이다.
이때 디스크 입출력을 메모리 참조 방식으로 바꾼다면 성능이 크게 향상될 것이다. 이 접근 방식을 “메모리 사상” 이라고 불린다.
🫧 메모리 사상 기본 기법
파일의 메모리 사상은 프로세스의 가상 주소 공간 중 일부를 관련된 파일에 할애함으로써 이루어진다.
첫 번째 접근은 페이지 폴트가 발생한다. 파일 내용 중 페이지 크기, 혹은 그 크기보다 더 큰 크기만큼의 부분이 파일 시스템으로부터 메모리 페이지로 읽혀 들어오게 된다.
이후 파일 read/write는 일반적인 메모리 액세스와 같이 처리되어 불필요한 디스크 입출력 시간을 줄일 수 있다.
✨ 메모리 사상 쓰임
☁️ 1. 파일 공유
여러 프로세스가 데이터 공유를 위해 파일을 공유하기도 한다. 한 프로세스가 공유 중인 메모리 사상 파일에 write를 하면 그 write는 즉시 다른 모든 프로세스도 볼 수 있게 한다.
메모리 사상 관련 시스템 콜들이 copy-on-write 기능을 지원하여 파일을 read-only로 공유할 때는 모든 프로세스가 한 개의 페이지를 공유하다가, 어떤 프로세스가 그것을 수정하기 시작하면 그 시점에 그 프로세스를 위해 별도의 페이지 복사본을 만들 수도 있다.
상호 배제 기법을 사용하여 동기화까지 진행이 가능하다.
☁️ 2. 메모리 공유
공유 메모리를 메모리 사상 파일을 이용하여 구현할 수도 있다. 동일한 파일을 프로세스들의 가상 주소 공간에 메모리 사상하게 함으로써 공유 메모리를 사용할 수 있다.
✨ Windows API에서 공유 메모리
- 사상될 파일(= 공유 메모리)에 대한 file mapping을 생성한다.
- 사상된 파일의 프로세스 가상 주소 공간 상의 뷰 생성
-> 여기서 다른 프로세스는 파일을 오픈한 뒤 사상된 파일의 뷰를 가상 주소 공간 상에 생성한다.
#include <windows.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
HANDLE hFile, hMapFile;
LPVOID lpMapAddress;
hFile = CreateFile(
"temp.txt", // 파일명
GENERIC_READ | GENERIC_WRITE, // 읽기/쓰기 접근
0, // 파일 공유 수
NULL, // default security
OPEN_ALWAYS // open new or existing file
FILE_ATTRIBUTE_NORMAL, NULL
);
hMapFile = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, TEXT ("SharedObject"));
lpMapAddress = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
sprintf(lpMapAddress, "Shared memory message");
UnmapViewOfFile(lpMapAddress);
CloseHandle(hFile);
CloseHandle(hMapFile);
}