[PintOS] Project 3 키워드 정리 (File-backed page, Direct Memory Access)

2024. 6. 2. 17:43크래프톤 정글 5기/공부

File-backed page

 

Page :

- 가상 메모리를 일정 크기로 나누는 단위
- 보통 4KB
- 프로세스 가상 주소 공간은 Page로 구성됨
- 각 Page는 연속적인 가상 주소를 가짐

Frame :

- 물리 메모리를 일정 크기로 나누는 단위
- 보통 4KB
- 물리 메모리는 이런 Frame으로 구성됨
- 각 Frame은 연속적인 물리 주소를 가짐

Relation :

- 가상 메모리의 Page는 실제 물리 메모리의 Frame과 Mapping됨
- Mapping 정보는 Page Table에 저장
- 프로세스가 특정 가상 주소에 접근하면, 해당 주소를 포함하는 Page를 찾음
- 해당 Page와 Mapping된 Frame을 알아내기 위해 Page Table 이용
- Mapping된 Frame의 물리 주소로 변환하여 실제 데이터에 접근
Definition :

- 프로세스의 가상 메모리 영역 중 특정 Page를 파일과 Mapping하여 관리하는 방식
- 프로세스가 해당 Page에 접근할 때, Page fault 발생 시 파일로부터 내용 읽어옴 (DMA 방식으로)
- Page의 내용이 변경 -> 변경된 내용은 다시 Mapping된 파일에 기록됨
- 프로세스 종료 후에도 파일에 데이터가 유지됨

Background :

- 초기 가상 메모리 시스템은 스왑 영역을 활용해 Page 관리
- 스왑 영역은 휘발성 -> 프로세스 종료 시 데이터 날아감
- 파일과 Page가 Mapping되어 있다면 프로세스 종료 후에도 데이터가 유지될 수 있음
- 프로세스의 특정 메모리 영역을 파일과 Mapping -> 프로세스 종료 이후에도 데이터 유지 가능케 함

pintOS에서 활용성 :

- mmap() 동작으로 파일을 가상 메모리 영역에 Mapping -> 매핑된 Page를 file-backed-page로 관리
- Page fault 발생 시 Page에 파일 내용을 읽어오고, 변경사항을 다시 파일에 쓰는 방식으로 구현해야 할듯
- munmap() 동작이 발생한다면 -> 변경된 내용을 파일에 반영하고 매핑을 해제하는 동작을 추가해야 할듯 

Function :

0) mmap 시스템 콜 호출 -> 파일을 가상 메모리에 mapping
1) mmap 시스템 콜 -> 프로세스의 가상 주소 공간 일부를 파일과 Mapping (=file-backed page)
2) Page <-> File 사이의 Mapping 정보가 생성됨
3) 프로세스가 file-backed page에 접근 시, Page Fault 발생함
	 -> Page가 물리 메모리와 Mapping 되어있지 않기 때문에
	 
4) Page fault handler 동작 -> 해당 Page와 연결된 File 찾음
5) File 내용을 Frame에 읽어옴
6) File과 Mapping 되어있던 Page <-> Frame 매핑을 생성
7) 이제 프로세스는 해당 file-backed page에 접근이 가능
8) Page 내용 변경 시 -> 실제 File 또한 변경

장점 / 단점 :

- 프로세스 종료 이후에도 파일 데이터 유지가 가능
- 대용량 파일을 가상 메모리에 Mapping하여 직접 접근 가능
- 대용량 파일도 page 단위로 load하기 때문에, 효율적인 메모리 사용 가능 (부분만 불러올 수 있음)

- Mapping된 파일의 과도한 I/O Overhead 발생 시 성능 저하 가능성
- 파일 접근 동기화 관리 작업이 필요함
- 구현이 복잡하다고 함
[mmap - file-backed page - munmap]

mmap

- 파일이나 디바이스를 프로세스의 가상 메모리에 매핑하는 시스템 콜
- mmap 호출 시 전달 인자는 [File Descriptor / 매핑할 가상 메모리 주소 / 매핑할 길이 / 플래그 등]
- 호출 성공 시 지정한 가상 메모리 영역이 파일과 Mapping -> 해당 영역이 file-backed page
- 이후 page <-> frame 매핑 시 프로세스는 page를 통해 파일에 접근 가능

munmap

- mmap으로 매핑한 가상 메모리 영역을 해제하는 시스템 콜
- munmap 호출 시 전달 인자는 [해제할 가상 메모리 주소 / 해제할 길이]
- 호출 성공 시 지정한 가상 메모리 영역과 파일의 Mapping이 해제
- 가상 메모리에 변경한 내용이 있다면 파일에 동기화

file-backed page

- mmap을 통해 생성된 가상 메모리 영역 : file-backed page
- 프로세스가 이 영역에 접근 -> 파일에서 해당 부분을 읽어와 물리 메모리에 로드
- 변경 사항이 발생 -> '즉시 실제 파일에 변경 내용을 적용할 것인가 ?' 는 사용자가 지정할 수 있음
- mmap 호출 시 전달하는 인자 중 flag 선택에 따라 '실제 파일에 변경 사항이 적용되는 시점'이 달라짐

- 'MAP_SHARED' flag 사용 시 page에서의 변경 사항이 실제 파일에 즉시 반영
- 'MAP_PRIVATE' flag 사용 시 '실제 원본 파일'은 변경되지 않으나 '원본 파일 copy본' 에는 적용됨
	 munmap 호출 이후에도, '실제 원본 파일'의 내용은 변하지 않음

- 동일한 파일 데이터를 여러 프로세스에서 사용할 경우 'MAP_SHARED' flag 사용이 유리할 듯
- 프로세스 별 독립적인 파일 데이터가 필요할 경우 'MAP_PRIVATE' flag 사용이 유리할 듯

 


Direct Memory Access

 

PIO (Programmed Input Output) 방식
D MA (Direct Memory Access) 방식

 

Image from : https://www.quora.com/What-is-the-function-of-DMA-in-a-computer

 

Definition :

- CPU의 개입 없이 메모리 <-> I/O 디바이스 간 데이터를 직접 전송하는 기술
- PIO 방식에 비해 리소스를 절약할 수 있어, 자원 / 시간적 이득을 얻을 수 있음

Function :

- CPU는 DMA 컨트롤러에 데이터 전송 명령
- DMA 컨트롤러는 명령을 받아 독립적으로 데이터 전송 수행
- 데이터 전송 완료 -> DMA 컨트롤러는 Interrupt 발생 -> CPU에게 알림
- CPU는 데이터 수신 -> 이후 다른 작업 처리

- CPU는 데이터 수신까지 멈춰있지 않고 다른 작업을 처리함

Background :

- 초기 컴퓨터 시스템에서는 CPU가 모든 I/O 작업을 직접 처리했어야 함 (PIO 방식)
- [메모리 -> 디바이스], [디바이스 -> 메모리] 경로로 데이터가 전달되는 과정을 CPU가 전담
- 해당 방식은 CPU가 대기하는 시간이 많음 -> 비효율적

pintOS에서 활용성 :

- pintOS에서 파일 시스템은 디스크와 상호작용 해야 함
- 파일을 읽고 쓰는 과정에서 DMA를 활용한다면, 자원을 더 효율적으로 쓸 수 있음
- 또한 Page fault 처리 동작 중 'file과 관련된 동작' 수행 시 효율적으로 쓸 수 있음
- Ex) file-backed page에서 Page fault 발생 시, frame <-> file mapping 동작이 필요함
	해당 과정에서 DMA 방식으로 파일 데이터를 전송한다면, CPU 소모가 최소화 될 수 있음

장점 / 단점 :

- CPU를 더 효율적으로 사용할 수 있음
- PIO 방식보다 데이터 전송 속도가 빠름
- 시스템 전체 성능 향상

- DMA 컨트롤러 자체의 오버헤드가 있음
- 메모리와 디바이스 간 동기화 문제가 발생할 수 있음
DMA Controller

Type :

- DMA 컨트롤러는 칩셋의 일부에 통합된 형태로 메인보드에 위치한 하드웨어 요소

Function :

- CPU로부터 데이터 전송 명령을 받음
- 명령에는 [소스 주소 / 목적지 주소 / 데이터 크기 등] 포함
- 해당 명령을 통해 메모리 <-> I/O 디바이스 간 데이터 전송을 독립적으로 수행
- 데이터 전송을 위해 DMA 컨트롤러는 시스템 버스 제어권을 갖게 됨
- 시스템 버스를 이용해 데이터 전송이 완료되면 CPU에 Interrupt를 통해 전송 완료 알림

pintOS :

- DMA는 하드웨어 요소 -> pintOS에서는 코드화 시켜서 동작할듯
- project 2에서 MMU.c 파일의 함수처럼 사용할듯