사람들이 컴퓨터를 더 많이 사용하길 원하면서 시분할, 대화식 이용의 개념이 등장하였다.
시분할을 구현하는 가장 고전적인 방법은 프로세스를 짧은 시간동안 실행시키고, 중단한 후 중단 시점의 모든 상태를 디스크에 저장하고, 다른 프로세스를 또 탑재해서 실행시키는 것을 반복하는 방법이 있다.
하지만 알다시피 디스크 입출력은 엄청나게 느리기 때문에 이 방식은 비효율적이였다. 따라서 프로세스 전환 시 프로세스를 메모리에 그대로 유지하면서 운영체제가 시분할을 할 수 있도록 하는 개념이 등장하였다.
말은 좋지만, 결국 여러 프로그램이 메모리에 동시에 존재하려면 한 프로세스의 메모리를 다른 프로세스의 메모리로부터 보호해야하는 문제가 생겼다.
그런 위험에 대비해서 운영체제가 사용하는 메모리 개념이 주소 공간이다. 주소 공간은 실행 프로그램의 모든 메모리 상태를 가지고 있다.
그렇다면 운영체제는 물리 메모리를 공유하는 여러 프로세스에게 어떻게 프로세스의 전용 주소공간이라는 개념을 제공할까?
우리는 운영체제가 이 일을 할 때 메모리를 가상화한다고 말한다. 그 이유는 프로세스는 자신이 특정 주소의 메모리에 탑재되고, 자신만의 엄청 큰 주소공간을 가지고있다고 생각하지만, 현실은 그렇지 않기 때문이다.
메모리 가상화에서는, 프로세스 A가 자신의 메모리 영억의 주소 0을 읽었다고 할 때, 이 주소는 가상 주소이고, 이 가상 주소를 어떻게 실제 물리 주소로 변환하고, 운영체제는 이 메모리 가상화를 어떤 방식으로 진행하는지가 핵심이라고 할 수 있다.
하드웨어 기반 주소 변환(동적 재배치)
우리가 다룰 주소 변환 기법은 하드웨어 기반 주소 변환이라고도 하는 주소 변환이다. CPU 가상화 편에서도 봤던 제한적 직접 실행의 원리에 부가적으로 사용되는 기능이라고 보면 된다.
주소 변환을 통해 하드웨어는 명령어 반입, 탑재, 저장 등 가상 주소를 정보가 실제 존재하는 물리 주소로 변환한다.
(하드웨어만으로 메모리 가상화를 구현할 순 없고, 완벽한 구현을 위해선 메모리에 대한 정보를 알고있는 운영체제의 도움이 필요하다.)
CPU 가상화처럼 몇 가지 가정을 해보자.
- 사용자 주소 공간은 물리 메모리에 연속적으로 배치된다.
- 주소 공간은 물리 메모리 크기보다 작다.
- 각 주소 공간의 크기는 같다.
위 가정들을 완화하며 실제적인 메모리 가상화를 이끌어 낼 것이다.
이 하드웨어 기반 주소변환은 기본적으로 CPU당 한 쌍의 베이스 레지스터, 바운드 레지스터를 필요로한다.
두 레지스터에 대한 이해를 위해 간단한 그림을 보자. 여기서 과연 베이스 레지스터와 바운드 레지스터는 어떤 식으로 우리가 원하는 위치에 주소 공간을 배치할 수 있도록 하는 동시에 프로세스가 오직 자신의 주소공간에만 접근한다는 것을 보장할까 ?
위 그림에서는, 운영체제가 프로세스를 물리 주소 32KB에 재배치하기로 결정하고, 베이스 레지스터 값을 이 값으로 설정한다.
이후 프로세스가 실행되면, 프로세스에 의해 생성되는 모든 주소는 가상 주소 + 베이스 레지스터 값으로 변환된다.
프로세스가 생성하는 메모리 참조는 가상 주소이기 때문에, 실제 물리 주소를 생성하기 위해 베이스 레지스터 값을 더하는 것이다.
이러한 주소의 재배치는 프로세스의 실행 시에도 일어나지만, 프로세스가 실행을 시작한 이후에도 일어날 수 있다.
그렇다면 바운드 레지스터는 어디에 쓰는 것일까? 보편적으로 바운드 레지스터 값은 보호를 지원하기위해 존재한다.
프로세서는 먼저 메모리 참조가 합법적인가를 확인하기 위해 가상 주소가 바운드 안에 있는지 확인하는데, 이 때 바운드 레지스터 값을
주소 공간의 크기만큼 지정하여 이용한다. (위 그림의 경우 16KB가 될 것이다)
베이스 레지스터, 바운드 레지스터는 메모리 관리장치 (MMU)라고 부르기도 한다.
베이스 레지스터, 바운드 레지스터가 함께하는 주소 변환 과정을 개략적으로 보면,
하드웨어가 가상 주소를 베이스 레지스터에 더하기 전에 먼저 바운드 레지스터와 비교함으로써 만약 가상 주소가 너무 크거나 음수일 경우 예외를 발생시킨다.
동적 재배치는 비효율적이다. 위 주소공간 그림만 봐도 느낌이 오겠지만, 내부 단편화가 잔뜩 발생하고 있다.
따라서 물리 메모리 이용률을 높이고 내부 단편화를 해결하기 위해서는 더 정교한 기법이 필요한데,
흔히 들어본 동적 재배치를 일반화한 세그멘테이션 기법이 여기서 등장하게 된다.
'OS' 카테고리의 다른 글
[OS] IPC (0) | 2025.01.15 |
---|---|
[OS] 스케줄링 (1) | 2025.01.10 |
[OS] 추첨 스케줄링 (비례배분) (1) | 2025.01.04 |
[OS] MLFQ (1) | 2025.01.03 |