공유 객체 (Shared Objects)

- 공유되는 object 가 어떤 VM에 올라갈 지는 모르지만 같은 물리 주소에 올라갈 것이란는 것은 안다. → 물리 메모리에 한번만 로드

- Copy-on-Write (COW) 객체
- 일단 공유한 채로 데이터를 가지고 write 연산이 실행될 때 copy를 하여 따로 데이터를 가진다.
- PTEs 안에 private COW 는 read-only 다.
- write 일어나면 page fault → handler → copy 발동 : 공유하면 안된다.
- 장점: 메모리 사용량 감소, 프로세스 생성 속도 향상 등의 이점을 제공합니다.
fork 함수
- 실제로 복사가 일어나는 것이 아니라 매핑만 하나 늘어나는 것이다.
- 현재의
mm_struct
, vm_area_struct
, 페이지 테이블의 정확한 복사본을 생성합니다.
mm_struct
는 프로세스의 메모리 관리 정보를 담고 있는 구조체입니다.
vm_area_struct
는 가상 메모리 영역의 정보를 담고 있는 구조체입니다.
- 페이지 테이블은 가상 주소를 물리 주소로 매핑하는 테이블입니다.
- 두 프로세스의 각 페이지를 읽기 전용으로 설정합니다.
- 새로운 프로세스가 생성되면, 부모 프로세스와 자식 프로세스는 동일한 물리 메모리 페이지를 공유합니다. 이때 페이지는 읽기 전용으로 설정됩니다.
- 각
vm_area_struct
를 두 프로세스 모두에 대해 private COW(사본-쓰기)로 설정합니다.
- 페이지가 읽기 전용으로 설정되었기 때문에, 프로세스가 해당 페이지를 쓰려고 할 때 페이지 폴트가 발생합니다. 이때 COW 메커니즘이 동작하여 해당 페이지의 사본이 생성되고, 새로운 페이지에 쓰기가 이루어집니다.
fork()
함수
- 메모리 매핑과 COW:
fork()
함수는 가상 메모리와 메모리 매핑을 사용하여 각 프로세스에 독립적인 주소 공간을 제공합니다. 자식 프로세스는 부모 프로세스의 mm_struct
, vm_area_struct
, 페이지 테이블을 복사하지만, 실제 메모리 내용은 COW 방식으로 공유합니다.
execve()
함수

- 메모리 매핑:
execve()
함수는 새로운 프로그램을 실행하기 위해 기존 프로세스의 메모리 공간을 재구성합니다. 이때 메모리 매핑을 사용하여 프로그램 코드와 데이터를 메모리에 로드합니다.
- a.out 이라는 프로그램을 새로 올린다.
- 오래된 구역들을 free 시켜준다. (vm_area_struct)
- 구역을 잡아주고 (vm_area_struct)
- 로딩시켜주고
- 프로그램 카운트 늘려준다.
사용자 수준 메모리 매핑 (mmap()
)
void *mmap(void *start, int len, int prot,
int flags, int fd, int offset)
// start: 시작점을 기준으로 매핑 -> 안될 수도 있다.
// 매핑된 주소의 시작주소를 반환
- mmap() 함수: 파일이나 장치를 메모리에 매핑하는 시스템 호출입니다.
