이 글의 코드와 정보들은 [스프링 핵심원리 기본편] 강의를 들으며 정리한 내용을 토대로 작성하였습니다.
이 글의 코드와 정보들은 [스프링 핵심원리 기본편] 강의를 들으며 정리한 내용을 토대로 작성하였습니다.
이 글의 코드와 정보들은 강의를 들으며 정리한 내용을 토대로 작성하였습니다.
이 글의 사진과 내용은 공룡책 과 컴퓨터학부 수업인 운영체제 강의자료를 기반으로 작성했습니다.
기존 가상 주소 공간에서는 Heap과 Stack 사이의 사용하지 않는 공간도 할당되므로 비효율성이 발생한다.
[1] 사용하지 않는 크기가 발생하므로 메모리 공간이 낭비된다.
[2] 위의 그림과 같이 (16KB 이상의) 메모리가 큰 주소 공간에는 프로세스를 지원할 수 없다.
[3] Code 공간에 여러 코드가 들어가서 중복이 발생할 수 있다.
이러한 문제점을 해결하기 위해 Segmentation
이라는 아이디어가 나오게 되었다.
세그먼테이션
은 가상 주소 공간을 세그먼트 단위로 실제 메모리 주소 공간에 독립적으로 각각 매핑하는 방식이다.이로 인해 heap과 stack 사이의 사용하지 않는 비효율성인 문제를 해결하게 되었다.
[1] 더이상 메모리 공간이 낭비되지 않는다.
[2] 이전보다 훨씬 더 많은 주소 공간을 지원할 수 있다.
[3] 세그먼트는 주소 공간 간에 Code를 공유하면서 메모리를 절약할 수 있다.
세그먼트(Segment)는 메모리에서 일정 부분을 의미하며 일반적인 주소 공간은 3개의 세그먼트(Code, Stack, Heap)으로 구성된다.
OS는 3개의 세그먼트를 메모리에 배치하여 heap과 stack 사이의 공간을 낭비하지 않도록 하는 것이다.
이 글의 사진과 내용은 공룡책 과 컴퓨터학부 수업인 운영체제 강의자료를 기반으로 작성했습니다.
이번 글의 목적은 주소 변환은 무엇이고,
base, bound 레지스터를 사용한 동적 재배치 기술로 가상화를 하는 방법,
base, bount 레지스터를 구현하기 위해서 OS가 언제 개입해야 하는지에 대해서 알아보자.
이전 Chapter13 Address space에서 말했던 것처럼 메모리를 가상화한다는 것은 OS가 프로세스에게 자신의 개인적인 메모리 공간이 있는 것처럼 착각하게 만드는 것을 의미한다.
효율성(Efficiency), 제어성(Controllability), 그리고 유연성(Flexibility)을 위해 LDE(Limited Direct Execution)와 비슷한 전략을 가진다.
LDE를 간단히 소개하면, 프로그램을 하드웨어에서 직접 실행하도록 하는데 특정 시점(디스크에 대한 I/O 요청이 발생하거나, CPU 혹은 메모리에서 더 많은 시스템 리소스에 대한 접근 권한을 획득하는 경우)에는 OS가 프로그램의 실행에 직접 관여하는 방식이다.
메모리를 가상화를 도입할 수 있는 방법은 하드웨어 지원을 받아서 OS가 virtual address(=logical address)를 physical address로 변환하는 주소 변환 기법을 사용한다.
메모리 가상화를 위한 매커니즘을 위해 하드웨어 기반 주소변환
에 대해 알아보자.
주소 변환
이란 CPU에 있는 가상 주소를 DRAM에 있는 실제 메모리의 주소로 변환하는 하드웨어의 지원을 의미한다. 주소 재배치
와 같은 말이다.
이를 통해 OS가 프로세스를 가상 주소에서 실제 메모리 주소로 착각하게 만드는 가상화를 수행하게 된 것이다.
주소 변환 기법을 사용하기 위해서는 CPU에 2개의 하드웨어 레지스터가 필요하다.
하나는 base 레지스터, 다른 하나는 bound 레지스터라고 한다.
base 레지스터
: 가상 주소 공간이 실제 메모리에 재배치되었을 때 주소 공간의 시작 부분을 가리킨다.
bound 레지스터
: 가상 주소 공간의 크기를 나타낸다.
참고로 base, bound 레지스터 모두 CPU에 존재하는 하드웨어(DRAM)라는 점을 잊지 말자.
위의 그림과 같이 bound register
는 16KB로 가상 주소 공간의 크기를 알려준다. 그리고 base register
는 32KB로 실제 메모리 주소 공간의 시작 부분을 가리킨다.
2개의 레지스터를 사용하면 실제 메모리의 원하는 위치에 가상 주소 공간을 배치할 수 있고, 프로세스가 자신의 주소 공간에 접근할 수 있게 해준다.
base, bound 레지스터를 이용하여 하드웨어 기반 주소 변환하는 방법인 동적 재배치 기술
에 대해 알아보자.
프로그램 실행이 시작했을 때 OS는 프로세스를 로드해야 하는 물리적 메모리 위치를 결정한다.
physical address = virtual address + base
0 <= virtual address < bound
이를 통해 주소변환 처리와 프로세스를 보호할 수 있고, 만약 base, bound 레지스터에 문제가 발생하게 되면 OS가 개입해서 문제를 처리할 수 있다.
다음은 단순한 MMU에 대해 알아보자.
MMU
는 Memory Management Unit의 약자로 메모리 관리 장치
라고 말하며, CPU가 메모리에 접근하는 것을 관리해 주는 하드웨어 장치이다.
가상 주소가 실제 주소로 주소 변환 기법을 사용할 때 도와주는 역할이다.
MMU는 bound 레지스터의 범위 안에 들어가면 가상 주소(virtual address)가 실제 주소(physical address)로 변환해 준다.
즉, 다른 physical address로 가는 것을 막아주면서 메모리를 보호해 준다.
정리하자면, MMU를 통해 가상 주소와 Base 레지스터의 합이 bound 레지스터(=Limit 레지스터)의 범위 안에 들었으면 실제 주소로 변환해 주고, 범위에 벗어나면 예외 처리를 해준다.
지금까지 하드웨어가 주소 변환에서 어떤 역할을 하는지 알아봤다면, 이제는 OS의 역할을 알아보자.
base 레지스터와 bound 레지스터를 구현하기 위해 OS가 개입해야 하는 상황들은 다음과 같다.
프로세스가 생성될 때(When a process start running), 주소 공간(address space)을 위해 실제 메모리(physical memory)에서 여유 공간이 있는지 찾아야 한다.
프로세스가 종료될 때(When a process is terminated), 종료된 프로세스가 사용하던 메모리 공간을 다른 프로세스가 사용할 수 있도록 확보해야 한다.
Context Switch가 발생할 때(When context switch occur), base 레지스터와 bound 레지스터의 정보를 저장하고 복원하는 작업을 해줘야 한다.
위에 설명한 3가지를 제외한 다른 예외가 발생했을 때 호출할 핸들러(exception handlers)나 함수(functions)를 제공해야 한다.
프로세스가 생성될 때, OS는 새로운 주소 공간을 위해 반드시 여유 공간을 찾아야 한다.
Free list
는 사용되지 않는 physical memory의 범위 목록을 의미한다. 쉽게 말해 사용할 수 있는 여유 공간이다.
즉, 왼쪽의 Free list가 가리키고 있는 (동그라미로 표시된) 16KB
, 48KB
는 사용되지 않는 여유 공간을 의미한다.
실제로 OS는 physical memory(DRAM)에서 어디에 빈 공간이 있는지 계속 추적하고 있어야 한다.