본문 바로가기

기본/운영체제

[OS] 메모리 가상화 (Memory Virtualization): 2. Address translation

*이 글은 Operating Systems: Three Easy Pieces(운영체제 아주 쉬운 세 가지 이야기)를 바탕으로 작성되었습니다. 첨부한 모든 그림은 해당 도서에서 가져온 자료입니다. 내용 중 잘못된 부분이 있다면 알려주세요 :)

 

 

지난 번 글에서 메모리 가상화의 시작을 다루어보았다.

이번 시간엔 virtual address와 physical address를 어떻게 매핑해주는지 자세히 알아보자!

 


🧐 현대 운영체제의 목표

 

효율성(efficiency) & 제어 (control)

 

효율성을 높이기 위해 하드웨어 활용이 필수적이다.

제어는 자기 메모리 이외의 다른 메모리에 접근하기 못하도록 OS가 보장하는 것이다.

 

가상화를 제공하는 동시에 효율성과 제어를 추구한다면

  • 어떻게 효율적인 메모리 가상화를 구축할 수 있을까?
  • 프로그램이 필요로 하는 유연성을 어떻게 제공하는가?
  • 프로그램이 접근할 수 있는 메모리의 위치에 대한 제어를 어떻게 유지하는가?
  • 메모리 접근을 어떻게 적절히 제한할 수 있는가?
  • 어떻게 이 모든 것을 효율적으로 할 수 있는가?

위와 같은 질문들을 해볼 수 있다.


🧐 Address translation

 

주소변환(Address translation)을 통해

  • 하드웨어는 명령어 반입, 탑재, 저장 등의 가상 주소를 정보가 실제 존재하는 물리 주소로 변환한다.
  • OS는 메모리의 빈 공간과 사용 중인 공간을 항상 알고 있어야 하고, 메모리 사용을 제어하고 관리한다.

주소 공간에 대해 몇 가지 가정을 하고 여러 경우들을 생각해보자

  1. 주소 공간이 물리 메모리에 연속적으로 배치되어야 한다.
  2. 주소 공간의 크기가 물리 메모리 크기보다 작다.
  3. 각 주소 공간의 크기가 같다.

간단한 코드부터 살펴보자

C언어 코드 / 어셈블리 코드

C언어 코드는 간단하다.

  • 메모리에 값을 load하고, 3을 더하고, 다시 메모리에 저장한다.

어셈블리 코드도 비교적 간단하다.

  • 128: 0+ebx를 eax에 저장한다.
  • 132: eax 레지스터에 3을 더한다.
  • 135: eax를 메모리에 다시 저장한다.

이때 메모리 상에서는 어떤 일이 일어날까?

 

 

  • 주소 128의 명령어 반입
  • 이 명령어 실행 -> 주소 15KB에 값 load
  • 주소 132의 명령어 반입
  • 이 명령어 실행 -> 메모리 참조 없음
  • 주소 135의 명령어 반입
  • 이 명령어 실행 -> 15KB에 저장

 

 

 

 

 

 

 

 

 

위 그림은 주소 0에서 16KB까지의 가상화된 메모리이다.

 


 

 

🧐 Static Relocation

 

Software-based relocation으로

고정된 데이터와 함수들의 주소를 바꾸고 rewrite한다.

하드웨어 지원없이 가능하다는 장점이 있지만,

다른 프로세스의 메모리에 접근이 가능하며, rewrite이후 메모리 공간 이동이 불가능하다는 단점이 있다.

 


 

🧐 Dynamic Relocation

 

Hardward-based relocation으로

  • MMU(Memory Management Unit)가 모든 메모리 참조 시 주소 변환 수행한다.
  • Protection은 하드웨어에 의해 지켜진다. (가상 주소가 invalid하면, MMU는 exception 발생)
  • OS는 현재 프로세스의 valid한 주소 공간에 대한 정보만 MMU에게 보낸다.

가상 메모리가 물리 메모리 32KB~48KB에 재배치 된 것을 확인할 수 있다.

 

base는 address space의 physical 시작 위치이다.

위 그림에서 32KB이다.

 

boundaddress space의 크기이다.

(아키텍처에 따라 address space의 physical 끝 위치인 경우도 있지만, 전자의 경우로 가정하고 사용하겠음 )

위 그림에서 16KB이다.

 

base, bound를 사용하여 원하는 위치에 주소 공간을 배치할 수 있게 한다. 또한, 자신의 주소 공간에만 접근할 수 있게 한다.

 

프로그램 시작 시, OS가 프로그램의 물리 메모리 위치를 결정하고, 베이스 레지스터를 주소로 지정한다.

프로세스가 실행 시, 하드웨어는 프로세스에 의해 생성되는 모든 주소를 아래와 같은 방법으로 변환한다.

physical address = virtual address + base

프로세스가 생성하는 메모리 참조는 가상 주소이다.

 

모든 virtual address는

0 <= virtual address < bound

 

앞에서 봤던 어셈블리 코드를 다시 살펴보자.

 

`128: movl 0x0(%EBX), %eax`



  • PC(프로그램 카운터)는 128로 설정한다.
  • PC 값을 base와 더해 물리 주소 얻는다.
    128 (PC) + 32KB (base) = 32896 (physical address)
  • 하드웨어가 해당 물리 주소에서 명령어 가져오고 실행한다.
  • 프로세스는 가상 주소 15KB의 값의 값을 탑재하는 명령어 내린다.
  • 물리 주소에 원하는 내용 탑재한다.
    15KB + 32KB = 47KB

 

 

 

 

 

 

 


🧐 운영체제 이슈

 

base, bound 방식으로 가상 메모리 구현을 위하여 OS가 개입되는 3가지 시점이 있다.

 

  1. When a Process Starts Running

    프로세스가 생성될 때, OS는 주소 공간이 저장될 메모리 공간 찾는다.
    • OS는 물리 메모리를 슬롯의 배열로 생각하여, 각 슬롯의 사용여부를 관리한다.
    • 새로운 프로세스 생성될 때, 새로운 주소 공간 할당에 필요한 영역 찾기 위해 자료 구조 검색한다.

 

  1. When a Process Is Terminated

    프로세스가 종료될 때, OS는 종료한 프로세스의 메모리를 다시 빈 공간 리스트에 넣고 연관된 자료 구조를 모두 정리한다.

    • 자료구조는 process structure / PCB(Process Control Block)

      When Context Switch Occurs

      context switch 시, OS는 base, bound를 저장, 복원한다.

 


 

dynamic allocation은 static allocation의 protection 문제를 해결하지만,

할당된 영역이 낭비될 수 있다. 

 

예를 들어, 위에서 본 그림을 다시 살펴보자

 

 

32KB와 48KB의 물리 메모리 중 프로세스의 heap, stack의 영역이 크지 않아 사이 공간이 낭비되고 있다.

이 낭비를 내부 단편화 (internal fragmentation)라고 한다.

 

물리 메모리의 이용률을 높이고 내부 단편화 방지를 위해 더 좋은 방법이 필요하다!!!

이 때문에 등장한 것이 segmentation인데, 이는 다음 글에서 설명하도록 하겠다.

 

↯ 다음글 ↯

https://koakwak.tistory.com/5

 

[OS] 메모리 가상화 (Memory Virtualization): 3. Segmentation

*이 글은 Operating Systems: Three Easy Pieces(운영체제 아주 쉬운 세 가지 이야기)를 바탕으로 작성되었습니다. 첨부한 모든 그림은 해당 도서에서 가져온 자료입니다. 내용 중 잘못된 부분이 있다면 알

koakwak.tistory.com