물리적인 메모리는 한개인데, 메모리를 사용할 프로세스가 많을 때 쓰이는 것이 바로 Virtual Memory이다!
OS는 물리적인 메모리를 가상화해서 각 프로세스에 메모리를 할당해주고,
실제로 메모리의 어느 부분에 저장되는 지는 OS만 알고 있다.
Process의 입장에서는 메모리를 혼자 점유하는 것으로 느끼고 있다!
Memory Virtualization의 목표
- Transparency(투명성)
- 프로세스들이 메모리를 공유 중인것을 몰라야 한다
- 프로그래밍을 위해 편리한 추상화를 제공해준다
- Efficiency(효율성)
- OS를 거치기 때문에 속도가 느릴 수밖에 없다
- 하지만, 메모리 공간을 효율적으로 사용할 수 있고, 시간적인 측면에서도 이점이 있다
- Protection(안정성)
- 다른 프로세스로부터 나의 프로세스들을 보호해준다
- OS가 중재자 역할을 해준다(다른 Process가 메모리 어디를 쓰고 있는지 모르기 때문에 공격할 수 없다)
- Isolation : 한 프로세스가 죽더라도 다른 프로세스에 영향을 미치지 않는다
- 프로세스간의 메모리 공유가 편리해진다
옛날의 OS
- 메모리에 하나의 프로세스만 사용했기 때문에 낭비가 심했다
Multiprogramming & Time Sharing
오늘날에는 여러개의 Process를 동시에 Memory에 올라오게 된다.
- CPU는 하나이기 때문에 모든 일을 동시에 처리할 수는 없고, 빠르게 Context Switching을 한다
- 따라서 효율성이 증가되었다
- 하지만, 다른 프로세스로부터의 메모리 침범으로 인한 protection issue가 발생하게 되었다
Address Space
OS가 만든 가상의 메모리 공간이다.
- Address Space는 현재 실행중인 Process의 모든 정보가 기록된다
- Address Space의 크기는 System마다 달라진다
- Address Space에 포함되는 것의 대표격은 다음과 같다
- Code : 명령어들의 위치를 담고 있다
- Heap : 동적 할당을 위한 메모리이다
- Stack : return address와 value, 지역변수와 매개변수를 저장한다
- 모든 Address Space의 주소는 실제 physical Memory 주소와는 연관이 없다
Address Translation
하드웨어가 Virtual Address를 Physical Address로 바꾸는 작업을 말한다.
- 우리가 필요로 하는 정보는 Physical Address에 저장되어있다
- OS는 하드웨어를 이용해 메모리를 관리하기 위한 작업을 한다
- 사실상 하는 일은 어떤 주소가 비어있고, 사용중인지만 관리해준다
Assumption
실제 동작을 이해하기 위한 3가지 가정이다
- User's Address Space가 Physical Memory에 연속적으로 존재해야 한다
- Physical Memory가 Address Space보다 크다
- 각각의 Address Space는 동일한 크기이다
Relocation Address Space
OS는 각 프로세스를 Physical Memory의 0번지부터 순서대로 넣는게 아닌,
임의의 곳에 집어넣는다.
Static Relocation(Software-Based Relocation)
OS가 직접 프로그램을 새로 작성해서 Memory에 집어넣는 방법
- OS가 각각의 프로그램을 Memory에 싣기 전에 Static data와 Function을 모두 바꿔버린다
- 장점
- 단점
- Protection이 보장되지 않는다(Process가 OS나 다른 Process를 침범할 수 있다)
- 모든 메모리 주소를 읽을 수 있다
- 한번 메모리에 올리게 되면 또 바꾸기 어렵다
- 중간에 빈 메모리들이 잘게 나눠져서 사용할 수 없다(공간이 낭비된다)
Dymanic Relocation(Hardware-Based Relocation)
MMU(Memory Management Unit)이 매 접근마다 Address Translation을 하는 방법
- 매 접근마다 MMU가 접근 가능한 공간인지 확인하기 때문에 Protection을 할 수 있다
- 잘못된 곳에 접근을 하면 Exception을 만들어낸다 (ex- Segmentation Fault)
- OS가 할당 가능한 영역을 MMU에게 전달하기만 하면 된다
Base & Bound Register
- Base Register
- Physical Address가 어디서 시작하는 지를 담는 Register이다
- Bound Register
- Address Space의 크기를 담는 Register이다
- Physical Address의 Base Register + Address Space의 크기가 될 수도 있다
- 실제 Physical Memory의 시작 주소는
Physical Address = Virtual Address + Base Register
로 정해진다
- 이 때, Virtual Address는 0 이상 Bound Register 미만이다
OS Issues for Memory Virtualizing
OS는 Base & Bounds Approach를 구현하기 위해 아래 세 가지 행동을 해야한다
- 프로세스가 시작될 때 : Physical Memory의 빈 공간을 찾아야 한다
- 프로세스가 종료될 때 : 사용한 Memory를 다시 반환해야 한다
- Context Switching이 일어날 때 : Base & Bound의 값이 바뀌어야 한다. 이 때, 저장은 Proc-Structure에 저장된다