cs
[크래프톤 정글] 메모리 관리 기법
하루이2222
2024. 10. 24. 02:11
1. 프로그램 실행
- 사용자가 쉘에
./hello
를 입력하여hello
프로그램을 실행한다.
2. Fork 호출
- 쉘 프로세스는 새로운 프로세스를 생성하기 위해
fork()
시스템 콜을 호출한다. - 이 호출로 인해 두 개의 프로세스가 존재하게 된다:
- 부모 프로세스: 쉘.
- 자식 프로세스:
hello
프로그램을 실행하기 위해 생성된 프로세스.
3. 메모리 공유
- 부모와 자식 프로세스는 처음에 같은 가상 메모리 주소 공간을 공유한다.
- 이때, 두 프로세스는 같은 물리 메모리를 참조하고 있어 메모리 사용이 효율적이다.
4. 쓰기 발생
- 부모 또는 자식 프로세스 중 하나가 가상 메모리에 쓰기를 시도할 경우 페이지 폴트가 발생하게 된다.
- 이때, COW(Copy-On-Write) 메커니즘이 개입하여 두 프로세스 간의 물리 메모리 공유를 분리한다.
5. COW 개입
- 자식 프로세스가 쓰기를 시도하면 운영 체제는 해당 페이지를 복사하여 새로운 물리 메모리 공간을 할당한다.
- 자식 프로세스는 이제 자신의 페이지 테이블을 사용하여 새로운 물리 메모리를 참조한다.
6. Exec 호출
- 자식 프로세스는
exec()
시스템 콜을 호출하여hello
실행 파일의 내용을 부모 프로세스의 가상 메모리를 덮어씌운다. - 이 과정에서 자식 프로세스의 가상 메모리 공간에 새로운 프로그램이 로드된다.
7. 물리 메모리 초기화 여부
exec()
호출 후, 물리 메모리는 아직 초기화되지 않은 상태일 수 있다.- 이때 메모리에는
hello
프로그램의 코드가 로드되지만, 필요한 스택이나 힙 메모리 공간은 아직 할당되지 않거나 초기화되지 않은 상태이다.
8. 메모리 접근
- 프로그램이 실행 되면서 스택이나 힙 영역에 접근하려고 할 경우 페이지 폴트가 발생한다.
- 이 시점에서 운영 체제는 해당 페이지를 물리 메모리에 로드하게 된다.
9. Demand Memory 개입
- 페이지 폴트가 발생하면 운영 체제는 필요한 페이지를 물리 메모리에 적재하고, 페이지 테이블을 업데이트한다.
- 사용자가 할당된 메모리 영역에 접근하기 전까지 실제 물리 메모리에 할당되지 않았던 페이지가 이 과정에서 로드된다.
10. 데이터 초기화
- 프로그램에서 할당된 메모리를 사용할 때, 초기화되지 않은 메모리에 접근하게 되면 정의되지 않은 동작이 발생할 수 있다.
- 따라서 사용자가 메모리를 초기화한 후 데이터를 적재해야 할 필요가 있다.
11. Demand Zero 개입 (선택적)
- 만약 Demand Zero Memory를 사용하는 경우, 페이지가 처음 참조될 때 운영 체제가 해당 페이지를 물리 메모리에 로드하면서 자동으로 0으로 초기화한다.
- 이렇게 초기화된 페이지는 안전하게 사용할 수 있다.