1. Memory Management
- 이제까지 OS가 프로세스를 어떻게 관리하는지 알아보았다.
- 이번에는 OS의 중요한 역할 중 하나인 메모리 관리에 대해 알아본다.
- Relocation
- 프로세스는 실행될 준비가 되면 메모리에 올라온다. 잠깐 block되면 메모리 공간을 비워주었다가 ready상태가 될때 메모리에 올라온다.
- 이렇게 프로세스들이 swap되는 일은 매우 빈번하게 일어나기 때문에 항상 메모리의 같은 위치에 프로세스가 올라가도록 할 수는 없다.
- 프로세스가 메모리의 500 번지에 올라가 있다고 가정하자. branch명령으로 200번지를 건너뛴다면 700번지에 있는 명령어를 참조하게 된다.
- 만약 이 프로세스가 block되었다가 이번에는 1000번지에 올라가게 되었다고 해보자. branch명령으로 200번지를 건너뛰면 1200번지에 있는 명령어를 참조하게 된다.
- 이렇게 프로세스가 서로 다른 메모리 위치에 올라가게 되면 접근하는 명령어가 달라질 것인데 이를 어떻게 해결할 것인가?
- 즉 운영체제는 사용자 입장에서 항상 프로그램이 0번지에서 돌아가는 것 처럼 해주어야 한다.
- Protection
- 프로세스들은 서로 다른 프로세스의 메모리 영역에 접근할 수 없도록 해줘야 한다.
- 혹은 메모리의 보안영역을 접근할 수 없도록 해야한다.
- 이렇게 메모리 공간을 독립적으로 보호할 수 있는 방법이 필요하다.
- Sharing
- protection과는 반대로 여러 쓰레드가 같은 메모리 공간을 참조할 수 있도록 해주어야 한다.
2. Logical Address, Physical Address
- 위의 이슈들을 위해 고안된 방법이다.
- 프로그램이 실제로 올라간 메모리 공간의 주소는 physical address라고 한다.
- 하지만 프로그램 내부에서는 항상 0부터 시작하는 logical address를 사용한다.
- 운영체제는 physical address를 관리해서 프로세스에게 공간을 할당해주고 프로세스는 이 공간 위에서 프로그램이 0부터 시작한다고 생각하고 동작한다.
- 실제 프로세서가 명령어에 접근하려고 하면 논리주소를 물리주소로 변환하여 메모리 영영에 접근하도록 한다.
3. Memory Partitioning
- 운영체제가 프로세스에게 메모리를 나누어줄때 메모리를 겹치지 않는 작은 부분들로 partitioning 하여 나누어주는 것이다.
- 메모리 공간을 똑같이 8M으로 나누어서 프로세스들에게 나누어 줄 수도 있고 프로세스들의 크기가 다름을 고려하여 크기를 다양하게 파티셔닝할 수 도 있을 것이다.
- 이런 방식에서는 문제점이 하나 있다. 8M씩 메모리 공간을 할당 받았는데 프로세스들이 5M, 1M, 8M 만큼 메모리를 쓴다면 낭비되는 부분들이 생긴다. 이것을 internal fragmentation이라고 한다.
- 즉 크게 파티션하면 internal fragmentation이 발생하고 작게 나누면 메모리가 부족한 상황이 생길 것이다.
- 이런식으로 다양하게 파티션을 하여 크기에 맞는 프로세스들을 넣어주면 fragmentation을 줄일 수는 있다.
- 하지만 메모리를 적게 요구하는 프로세스들이 몰아쳐서 queue에 대기하는 상황을 가정해보면 메모리 공간이 많이 남아있음에도 불구하고 queue에서 대기하는 상황이 생긴다.
4. Dynamic Partitioning
- 그래서 생각한 방법이 프로세스 크기에 따라 동적으로 메모리 공간을 잡아서 제공하는 것이다.
- 하지만 메모리가 swap되는 과정에서 중간중간 사용하기 애매한 메모리 공간들이 생기는데 이를 external fragmentation이라고 한다.
- external fragmentation으로 인한 낭비를 줄이기 위해 compaction이라는 방법을 사용할 수 있다.
- compation은 프로세스들을 다 위로 올려서 파편들이 없도록 재배치 하는 것이다.
5. Replacement Algorithm
- 이제까지 메모리 공간의 크기를 결정하는 방법을 알아 보았다.
- 효율적으로 fragmentation을 최소화 하면서 메모리 공간을 활용하기 위해서는 프로세스들을 메모리 공간에 배치하는 방법이 큰 영향을 미친다는 것을 살펴볼 수 있었다.
- 이번에는 프로세스들에게 메모리 공간을 효율적으로 할당하는 방법을 알아 볼 것이다.
- 왼쪽 그림에서 가장 최근에 할당된 메모리 block의 위치를 가리키고 있다.
- 메모리 할당을 기다리는 프로세스(16M필요)가 들어갈 위치를 fisrt-fit, best-fit, next-fit방법으로 찾아보자.
- First-fit 방법은 메모리의 가장 위부터 천천히 들어갈 수 있는 공간을 찾는 것이다. 프로세스가 필요로하는 용량보다 크다면 바로 할당된다.
- Best-fit은 자기가 필요로 하는 메모리 공간에 최대한 근접한 공간을 찾는다.
- Next-fit은 가장 최근 할당된 위치를 시작으로 들어갈 수 있는 공간을 찾는다.
6. Buddy System
- 메모리를 2^k단위로 나누어서 프로세스에게 할당하는 방식이다.
- 이 방식에서는 compaction이 필요없다.
- 할당하는 방식은 그림을 참조하자
7. Address
- 위에서 프로그램 내에서는 논리주소로 동작하고 프로세서가 실제로 명령어에 접근할 때는 논리주소를 물리주소로 변환하여 사용한다고 했다.
- 그 과정이 어떻게 이루어지는지 확인해보자.
1. a[10] = 235라는 명령어를 수행하기 위해 10번지(논리주소)의 물리주소를 찾으러 Adder로 들어간다.
2. base register와 더해서 실제 물리주소를 반환한다.
3. 메모리에 바로 접근하기 전에 comparator를 통해 bounds register와 반환된 물리 주소를 비교한다. 할당된 메모리 영역을 벗어나지 않았는지 확인하는 것이다.
4. 이 과정을 거치면 비로소 메모리영역에 접근할 수 있게된다.
8. Paging
- 이제까지 공부한 개념들을 가지고 운영체제가 어떻게 프로세스들에게 메모리 공간을 할당해주고 프로세서는 어떻게 이 영역의 주소에 접근하게 되는지 알아본다.
- 다음 강의에서 중점적으로 다뤄보기 전에 간략하게 살펴보자.
- 메인메모리를 고정된 크기의 block으로 쪼개고 이를 page라고 한다.
- 프로세스에게 메모리를 할당해 줄때는 여러 pages를 제공한다.
- 논리주소를 가지고 실제 물리주소를 접근하기 위해 Page Table이란 것을 사용한다.
- 프로세스가 각각 메모리의 몇 번 페이지를 점유하고 있는지 기록하는 table을 말한다.
- 이렇게 각 프로세스가 표를 갖게 되면 아래 그림처럼 메모리 공간의 연속된 영역에 프로세스가 할당 될 필요가 없다. 얼마든지 페이지 테이블의 번호를 가지고 메모리 주소를 찾아갈 수 있기 때문이다.
- 참고로 아직 할당되지 않은 페이지를 Frame이라고 한다.
- 그럼 더 구체적으로 어떻게 논리주소가 물리 주소로 변환되는지 살펴보자.
- 페이지번호로 페이지 테이블에서 해당 페이지의 실제 시작주소를 찾는다.
- 이 주소와 offset을 뒤에 붙여서 실제 물리주소를 만들어 접근한다.
- 여기서 offset은 페이지 1번의 시작점을 0이라고 했을때 현재 위치와의 거리를 나타낸다.
- 즉 페이지1의 시작주소를 0번이라고 생각하고 참조하고자 하는 위치를 계산하는 것이다. 위 그림에서는 그 거리가 478이다.
- 정리하면 page#로 실제 페이지의 시작 주소를 찾고 거기에 offset만큼 이동하여 논리주소를 물리주소로 바꾸는 것이다.
9. Segmentation
- paging이 고정된 크기의 page로 메모리 공간을 나누어서 여러 페이지를 프로세스에게 할당하는 방식이였다면 segmentation은 동적으로 메모리공간을 나누어 할당하는 방식과 유사하다.
- 이렇게 나누어진 덩어리들을 segmentation이라고 하고 각 프로세스는 segmentation table을 만들어서 segmentation들을 관리한다.
- 세그먼트 번호로 세그먼트 테이블에서 해당 세그먼트의 실제 시작주소를 찾는다.
- 이 주소와 offset을 더해서 실제 물리주소를 찾는다.
'ComputerScience > Operating System' 카테고리의 다른 글
OS - 8.2 Virtual Memory (0) | 2021.07.29 |
---|---|
OS - 8.1 Virtual Memory (0) | 2021.07.29 |
OS - 6 Concurrency: Deadlock and Starvation (0) | 2021.07.20 |
OS - 5.2 Concurrency: Mutual Exclusion and Synchronization (0) | 2021.07.14 |
OS - 5.1 Concurrency: Mutual Exclusion and Synchronization (0) | 2021.07.13 |