Memory Virtualiziation
OS는 physical memory를 가상화한다.
OS는 각각의 프로세스에 가상 메모리 공간을 제공한다.
각각의 프로세서에게는 자기가 모든 메모리를 사용하는 것처럼 보인다.
Process structure: struct thread
switch from user stack to kernel stack을 할 때 raise privilege level도 같이 해줘야 한다.
Motivation for Virtualization
Uniprogramming : 한 프로세스만 그 시간에 돈다.
p1과 p2가 가상 메모리를 위와 같이 할당받았다고 했을 때, 실제 physical memory에서 kernel영역을 공유하고 있고 user영역은 따로 사용하고 있다.
Abstraction : Address Space
Address space는 static 그리고 dynamic components를 가지고 있다.
Static : Code and some global variables
Dynamic : Stack and Heap
왜 processes는 메모리의 동적 할당을 필요로 할까?
1. complie time에 메모리를 얼마나 쓸지 모르기 때문에
2. 메모리를 statically하게 넣으면 좋지 않기 때문에
3. 최악의 상황에도 충분히 할당해주기 위해
dynamic allocation에는 Stack과 Heap 2가지 방법이 있다.
Stack allocation은 구현하기 쉽고 효과적으로 실행된다는 장점이 있다.
Heap allocation의 장점은 모든 data structures를 위해 사용될 수 있다는 것이고, 단점은 할당이 느려질 수 있고 공간을 낭비하며 끝난다는 것이다. 또, 용량마다 어디에다 할당할지를 정해야 한다.
Time Sharing of Memory
OS는 process가 일하지 않을 때, memory를 CPU register에 저장함으로써 많은 가상 CPU들을 제공한다.
process가 돌지 않을 때, disk에 memory를 저장하므로써 많은 가상 메모리들을 줄 수 있다.
위는 Time Sharing Memory의 동작을 표현한 것인데 직관적으로 봐도 얼마나 비효율적으로 돌아가고 있는지 알 수 있다. 이를 해결하기 위해서 사용하는 것이 space sharing 방식이다.
Static Relocation
OS가 process를 메모리에 loading을 하기 전에 각각의 program을 rewrite 한다.
다른 프로세서들이 다른 주소와 포인터를 사용할 수 있게 rewrite 해준다.
static relocation의 문제는 process가 OS나 다른 process영역을 침범하여 망가뜨릴 수 있다는 것이다.
또, 다른 프로세스의 source를 사용할 수 있기 때문에 privacy가 보장되지 않는다.
한번 사용된 주소공간은 다른 곳으로 이동 할 수 없다.
Dynamic Relocation
Dynamic relocation은 process들 끼리의 privacy를 보장해 준다.
Memory Management Unit(MMU)라는 hardware의 도움이 필요하다.
MMU는 모든 메모리 참조에 대해 동적으로 process address를 바꿔준다. process는 logical or virtual한 address를 만들어내고, Memory hardware는 physical or read address를 사용한다.
Dynamic Relocation을 하기 위해서는 두가지 operating mode로 나눠야 한다.
Privileged (protected, kernel) mode : OS runs
- OS가 모든 physical memory에 접근하는 것을 허락해준다.
User mode : User processes run
- logical address가 physical address로 translation이 일어난다.
Minimal MMU는 translation을 위해 base register가 필요하다.(base : start location for address space)
커널 영역이면 logical 주소가 physical 주소이므로 해줄 것이 없다.(syscall 또는 context switch가 일어날 때 os가 이미 바꿔놓았다.)
Dynamic Relocation with Base Register
virtual address를 fixed offset을 더함으로써 physical address로 바꾼다.
offset을 base register에 저장한다.
각각의 프로세스는 base register에 다른 value를 가지고 있다.
같은 코드를 가진 P1, P2가 physical address에 공간을 할당 받았다고 하자. P1의 base register는 1KB이고 P2의 base register는 4KB이다. 따라서 P1에서 load 100, R1이 발생하면 Physical 영역에서 1124(1024+100)번지를 참조하게 되고, P2에서 똑같이 load 100, R1이 발생하면 Physical 영역에서 4096+100번지를 참조하게 된다.
Dynamic Relocation의 문제점은 마지막 명령어 처럼 P1이 P2의 physical address를 침입할 수 있다는 것이다.
Dynamic with Base+Bounds
address space를 bounds register을 이용하여 제한한다.
MMU는 logical address와 bounds register을 비교하여 만약 logical address가 더 크다면 error를 발생시킨다.
만약 조건을 만족한다면 logical address에 Base를 더하여 physical address로 만든다.
P1에서 3072에 저장하려고 하면 Bound인 1024보다 크기 때문에 interrupt를 발생시킨다.
Context-switch가 발생하면 privilege mode가 되어 현재 running process의 base와 bounds를 register를 저장하고 new process의 base와 bounds register를 load한다. 그리고 user mode로 바뀌면서 new process로 jump하게 된다.
따라서 user process는 base와 bounds registers를 바꿀 수 없다.
'3-2 > 운영체제' 카테고리의 다른 글
Segmentation (0) | 2021.10.08 |
---|---|
Memory API (0) | 2021.10.08 |
Multiprocessor Scheduling (0) | 2021.09.24 |
Scheduling:The Multi-Level Feedback Queue (0) | 2021.09.17 |
Scheduling:Introduction (0) | 2021.09.17 |