Intro
- Virtual memory를 구현 할때, Level of indirection을 알아야 함.
- Level of indirection이란, pointer와 같이 간접적인 방법을 거쳐 이루어지 단계의 수이다
→ 코드가 더욱 유연해지 일반화될 수 있다 ! (but cost 발생)
- Ch2.Protection에서, 우리는 memory에 다양한 process를 Load하는 과정에서
Protection issue가 발생함을 알았음. 이러한 Protection issue를 해결하기 위해 다양한 메모링 기법이 탄생
Virtual Memory: Goals
- Protection
- 다른 Process들로부터 Process와 OS를 보호해야함
- Isolation 구현 : 다른 process들에게 영향을 미치지 않고 fail해야함
- Cooperating process : memory의 일부를 share할 수 있음
- Transparency
- Process는 지 메모리가 공유되는지 몰라야댐 ㅋㅋ
- Programming을 위한 편안한 abstraction을 제공해야 함
- i.e. a large, contiguous memory space를 지가 사용하고 있다고 생각하도록
- Efficiency
- 다양한 용량 사이즈로부터 발생하는 fragment 최소화
- hardware 도움 받아서 빨리빨리 처리
(Virtual) Address Space
- 이 그림은 Address Space의 모습이다.
- OS는 각 Process에게 Private address space를 사용한다는 illusion을 제공한다.
- Address space는 process의 모든 memory state를 포함한다.
- Static area
- exec()으로 할당된 공간으로, Code와 Data가 속한다.
- Dynamic area
- 동작에 따라 할당되고, 커지거나 줄어들 수 있다.
- Heap과 Stack이 속한다.
Virtual Memory
- 각각의 process는, 그들만의 virtual address space를 갖고있다.
- Large and contiguous : 연속적으로 보이는 메모리 공간이며, 물리 메모리 구조와는 독립적이다.
- memory reference를 위해서 virtual address를 사용한다 : 실제 물리 주소와 다르다.
- Virtual address는 다른 process들에게는 private하다.
- Address translation은 run time 동안 일어난다
- MMU에 의해서, 실제 물리 주소로 변환된다.
- Support lazy allocation
- Process 실제로 메모리를 필요로 하는 시점에만 물리적 메모리 할당, 즉 필요 없으면 할당 지연 가능 ( 너? 안쓸거면 메모리 안줌 ㅅㄱ 쓸때 오셈 약간 고등학교 선생님 style)
- 전체 주소 공이 물리적 메모리에 존재할 필요가 없다. : 물리 메모리에 없어도 실행은 가능
Virtual memory API
- 하나의 예시로, heap을 memory에 할당하는 방법을 알아보자.
- 이 과정은 C library가 진행한다.
이 API들에 대해서 자세히 알아보자.
Malloc & Free
- 두 함수 모두 <stdlib.h>에 존재한다.
- void* malloc(size_t size)
- heap 공간에 memory region을 할당하는 함수이다.
- Argument로는 size_t size: memory block의 사이즈 (bytes)를 받는다. ( size_t는 uint임 )
- Return으로는 만약 할당 성공시 malloc에 의해 할당된 memory block의 pointer 실패시 null pointer을 반환한다.
- void free(void* ptr)
- malloc에 의해서 할당되었던 memory 공간을 해제한다
- Argument로는 malloc으로 할당되었던 memory block의 pointer을 받는다.
- Return은 none
왼쪽위 ->왼쪽아래 ->오른쪽위 ->오른쪽 아래 순으로 읽으세요
Other memory Api
- calloc
- 메모리를 할당하고, return하기 전 할당한 메모리를 0으로 초기화하는 함.
- size_t num : 할당할 object의 수
- size_t size : object의 size(bytes)
2. realloc
- 할당한 memory block의 size를 바꾸는 함수
- void *ptr: Pointer to memory block allocated with malloc, calloc or realloc
- size_t size :memory block의 새로운 size
- 만약 실패하면 original point 반환
System calls: brk
- 만약 heap 공간이 부족하다면, OS에게 heap 확장해도 되는지 물어본다
- break: address space에서 end of the heap이 위치하는 공간
- malloc이 이 brk system call을 이용한다. brk는 이 break의 위치를 재조정하는 syscall !!
- Data segment의 끝 주소를 직접 지정해주는 것이 바로 brk
- sbrk 는 현재 끝 주소를 기준으로 increment만큼 공간을 증가시킴
- Programmer들은 절대로 direct하게 brk나 sbrk(brk랑 비슷)를 호출할 수 없다.
=> 나중에 주구장창 쓰이니 꼭 기억해라... 특히 sbrk 얘는 시(s)발(br)거(k)다 계속나옴 뒤에
Syscall : mmap
- Calling process의 새로운 mapping을 virtual address space에 만드는 것
- addr : new mapping의 시작 주소 (page boundary 안에 있어야함)
- 만약 NULL이면 kernel이 임의로 주소 선택
- 프로그래머가 제공한 주소가 꼭 사용되리라는 보장은 없으며, 시스템의 메모리 상태와 다른 제약사항을 고려하여 최종 매핑 주소가 결정
- length: mapping의 길이
- prot : protection 정보 (PROT_EXEC, PROT_READ, PROT_WRITE, PROT_NONE)
- flags:mapping flag ( Private, shared,anonymous 등)
- fd, offset : file descriptor & file offset
=>얘도 진 짜 미 친 죽 을 것 같음 얘 도 무 조건 깊이 공부해 과제하느라 1달 날리고 싶지 않으면
- Calling process의 새로운 mapping을 virtual address space에 만드는 것
- addr : new mapping의 시작 주소 (page boundary 안에 있어야함)
- 만약 NULL이면 kernel이 임의로 주소 선택
- 프로그래머가 제공한 주소가 꼭 사용되리라는 보장은 없으며, 시스템의 메모리 상태와 다른 제약사항을 고려하여 최종 매핑 주소가 결정
- length: mapping의 길이
- prot : protection 정보 (PROT_EXEC, PROT_READ, PROT_WRITE, PROT_NONE)
- flags:mapping flag ( Private, shared,anonymous 등)
- fd, offset : file descriptor & file offset
- mmap의 동작 과정은 다음과 같음
- mmap을 통해서 virtual address space에 해당 파일이나 data에 대한 매핑이 형성, but 실제 메모리 할당은 이루어지지 않음
- 프로그램이 매핑된 부분을 읽으려 할 때, 실제 메모리에는 존재하지 않기 때문에 페이지 폴트 발생
- 페이지 폴트 핸들러가 이를 감지하고 물리적 메모리에 필요한 파일이나 data 로
- MMU는 가상 주소를 새로운 물리적 주소로 매핑
- 이후 프로그램은 가상 주소를 통해서 해당 데이터에 접근할 수 있음.
⇒ 그럼 anonymous mapping은 뭐냐?
File vs Anonymous mapping
- File mapping
- Backing store으로 평범한 file을 가지고 있음.
- 즉 mapping한 공간이 real memory region임.
- Content of the file은 load/store을 통 읽고 쓸 수 있음.
- Anonymous mapping( 프로세스 개인의 메모리 영역 생성 )
- Virtual address space가 backing store을 갖고있지 않음
- mapping한 field가 0으로 채워짐
- Zero-page mapping
Shared vs Private mapping
- 몇몇 process들은 자신들만의 virtual address space에 같은 backing store을 설정해놓을 수 있음.
- Shared mapping
- shared page에 대한 수정이 모든 연관된 process에게도 보임
- Private mapping
- 수정한 것이 other process에게는 보이지않음
- Copy-on-write 기법
⇒ 차 page table 배운 후 mmap()에 대해 더 자세히 기술