[WEEK 11] Three Easy Pieces - 16. 주소 공간의 개념

신호정 벨로그·2021년 10월 16일
0

Today I Learned

목록 보기
56/89

16. 주소 공간의 개념

16.1 초기 시스템

운영체제는 메모리에 (물리 주소 0부터) 상주하는 루틴의 집합이었다. 물리 메모리에 하나의 실행 중인 프로그램(프로세스)이 존재하였고 (물리 주소 64kb부터 시작하여) 나머지 메모리를 사용하였다.

16.2 멀티 프로그래밍과 시분할

멀티 프로그래밍은 여러 프로세스가 실행 준비 상태에 있고 운영체제는 그들을 전환하면서 실행하였다.

한 프로세스가 입출력을 실행하면, CPU는 다른 프로세스로 전환한다.

사용자들은 일괄처리 방식(batch computing) 컴퓨터의 한계를 인식하였고 시분할(time-sharing) 시대가 시작되었다.

시 분할을 구현하는 한 가지 방법은 하나의 프로세스를 짧은 시간 동안 실행시키는 것이다.

해당 기간 동안 프로세스에게 모든 메모리를 접근할 권한이 주어진다.

그런 후에, 이 프로세스를 중단하고 중단 시점의 모든 상태를 디스크 종류의 장치에 저장하고 다른 프로세스의 상태를 탑재하여 짧은 시간 동안 실행시키는 방식이었다.

이러한 방식은 전반적으로 느리게 동작하며 메모리가 커질수록 느려진다는 문제점을 가진다.

레지스터 상태를 저장하고 복원하는 것은 빠르지만 메모리 내용 전체를 디스크에 저장하는 것은 매우 느리다.

이러한 문제점을 극복하기 위해 프로세스 전환 시 프로세스를 메모리에 그대로 유지하면서, 운영체제가 시분할 시스템을 효율적으로 구현하는 것이 필요했다.

예를 들면 세 개의 프로세스(A, B, C)가 있고 각 프로세스는 512kb 물리 메모리에서 각각 작은 부분을 할당 받는다.

하나의 CPU를 가정할 때, 운영체제는 실행할 한 개의 프로세스(A)를 선택하고, 다른 프로세스들(B와 C)은 준비 큐에서 실행을 기다린다.

시분할 시스템이 대중화되면서 운영체제에게 프로그램이 메모리에 동시에 존재하기 위한 보호(protection)가 새로운 문제로 요구되었다.

16.3 주소 공간

한 프로세스가 다른 프로세스의 메모리를 읽거나 쓰여지는 상황을 대비하여 운영체제는 사용하기 쉬운 메모리 개념을 만들어야 한다.

주소 공간(address space)은 실행 중인 프로그램이 가정하는 메모리의 모습이다.

운영체제의 메모리 개념을 이해하는 것이 메모리를 어떻게 가상화할지를 이해하는 핵심이다.

주소 공간은 실행 프로그램의 모든 메모리 상태를 갖고 있다.

프로그램의 코드는 반드시 메모리에 존재해야 하고 따라서 주소 공간에 존재한다.

스택은 함수 호출 체인 상의 현재 위치, 지역 변수, 함수 인자와 반환 값 등을 저장하는 데 사용된다.

마지막으로 힙(heap)은 동적으로 할당되는 메모리를 위해 사용된다.

프로그램 코드는 주소 공간의 위쪽에 위치한다. 예를 들면 주소 0부터 시작하여 주소 공간의 첫 1kb를 차지한다.

코드는 정적이기 때문에 메모리에 저장하기 쉽다.

따라서 주소 공간의 상단에 배치하고, 프로그램이 실행되면서 추가 메모리를 필요로 하지 않는다.

다음으로 프로그램 실행과 더불어 확장되거나 축소될 수 있는 두 종류의 주소 공간이 존재한다.

주소 공간의 상단에 존재하는 힙과 하단에 존재하는 스택이다.

두 메모리 영역은 확장할 수 있어야 하기 때문에 두 영역 모두 확장하는 것이 가능하도록 주소 공간의 양 끝단에 배치한다.

두 영역은 확장 방향이 반대 방향일 수 밖에 없다.

힙은 코드 바로 뒤 1kb부터 시작하고 아래 방향으로 확장하고, 스택은 16kb에서 시작하고 위쪽 방향으로 확장한다.

그러나 주소 공간을 다른 방식으로 배치할 수도 있다.

주소 공간에 여러 쓰레드가 공존할 때는 이런 식으로 주소 공간을 나누게 되면 동작하지 않는다.

메모리를 어떻게 가상화하는가

운영체제는 물리 메모리를 공유하는 다수의 프로세스에게 어떻게 프로세스 전용의 커다란 주소 공간이라는 개념을 제공할 수 있는가?

운영체제가 이러한 작업을 수행할 때 운영체제가 메모리를 가상화(virtualizing memory)한다고 표현한다.

왜냐하면 실행 중인 프로그램은 자신이 특정 주소의 메모리에 탑재되고 매우 큰 주소 공간을 (32비트 또는 64비트) 가지고 있다고 생각하기 때문이다.

프로세스 A가 주소 0으로부터(가상 주소(virtual address)) load 연산을 수행할 때, 운영체제는 하드웨어의 지원을 통해 물리 주소 0이 아니라 물리 주소 320kb(A가 탑재된 메모리)를 읽도록 보장해야 한다.

16.4 목표

가상 메모리 시스템(VM)의 주요 목표 중 하나는 투명성(transparency)이다.

운영체제는 실행 중인 프로그램이 가상 메모리의 존재를 인지하지 못하도록 가상 메모리 시스템을 구현해야 한다.

VM의 또 다른 목표는 효율성(efficiency)이다.

운영체제는 가상화가 시간과 공간 측면에서 효과적이도록 해야한다.

VM의 또 다른 목표는 보호이다.

운영체제는 프로세스를 다른 프로세스로부터 보호해야 하고 운영체제 자신도 프로세스로부터 보호해야 한다.

프로세스가 탑재, 저장, 혹은 명령어 반입 등을 실행할 때 어떤 방법으로든 다른 프로세스나 운영체제의 메모리 내용에 접근하거나 영향을 줄 수 있어서는 안 된다.

보호(protection) 성질을 이용하여 프로세스들을 고립(isolation)시킬 수 있다.

16.5 요약

VM 시스템은 프로세스 전용 공간이라는 환상을 프로그램에게 제공할 책임이 있다.

가상 메모리 공간에 모든 프로그램 명령어와 데이터가 저장된다.

운영체제는 하드웨어의 도움(MMU)을 받아 가상 메모리 주소를 받아 물리 주소로 변환한다.

물리 주소는 원하는 정보를 반입하기 위하여 물리 메모리에 전달된다.

운영체제는 많은 프로세스를 대상으로 이러한 작업을 수행하여 프로그램과 운영체제를 보호한다.

0개의 댓글