빙응의 공부 블로그

[OSTEP 가상화(virtualization)]메모리 가상화 본문

CS/운영체제

[OSTEP 가상화(virtualization)]메모리 가상화

빙응이 2025. 1. 10. 20:36

 

📝16 주소 공간의 개념

 

초기에는 컴퓨터 시스템 구현이 쉬웠다. 왜냐하면 사용자가 많은 것을 기대하지 않았기 때문이다.

이 모든 문제를 만든 사람들은 바로 "사용의 편이", "고성능", "신뢰성" 등을 기대한 사용자이다. 

 

CPU에 대한 효율성 개선을 위한 시분할 시스템이 등장하면서 운영체제에서 새로운 요구 사항이 생기기 시작했다.

여러 프로그램이 메모리에 동시에 존재하려면 보호가 중요한 문제가 된 것이다. 

 

 

 

📝16.1 주소 공간

운영체제는 사용하기 쉬운 메모리 개념을 만들어야 한다. 이 개념을 주소 공간이라 한다.

실행 중인 프로그램이 가정하는 메모리의 모습이며 실행 프로그램의 모든 메모리 상태를 갖고 있다. (코드, 스택, 힙 등)

 

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

 

우리는 이러한 일을 할 때, 운영체제가 메모리를 가상화한다고 말한다. 왜냐하면 실행 중인 프로그램은 자신이 특정 주소의 메모리에 탑재되고 매우 큰 주소 공간을 가지고 있다고 생각한다. 그러나 현실은 다르다. 

예를 들어 프로세스 A가 자신의 주소 공간에서 주소 0을 읽으려 하면, 운영체제는 실제 물리 주소 0이 아니라 A가 매핑된 물리 주소를 읽도록 조정한다. 이를 통해 프로세스마다 독립적인 메모리 공간을 보장하는 것이다. 

 

📝16.2 가상화 목표 

운영체제 메모리 가상화에 대해 논의해보자

가상 메모리 시스템의 주요 목표는 크게 3가지이다.

투명성(transparency)
  • 운영체제는 실행 중인 프로그램이 가상 메모리의 존재를 인지하지 못하도록 구현해야 한다.
  • 프로그램은 메모리가 가상화되었다는 사실을 인지해서는 안된다.
  • 오히려 프로그램은 자신이 전용 물리 메모리를 소유한 것 처럼 행동해야 한다.
효율성(efficiency)
  • 운영체제는 가상화가 시간과 공간 측면에서 효율적이도록 해야 한다.
  • 시간적으로는 프로그램이 너무 느리게 실행되서는 안된다.
  • 공간적으로는 가상화를 지원하기 위한 구조를 위해 너무 많은 메모리를 사용해서는 안된다.
보호(protection)
  • 운영체제는 프로세스를 다른 프로세스로부터 보호해야 한다.
  • 운영체제 자신 또한 프로세스로부터 보호해야 한다.
고립(isolate)의 원칙

고립은 신뢰할 수 있는 시스템을 구축하는 데 중요한 원칙이다. 두 개체가 서로 적절하게 고립되면 한 개체가 실패하더라도 상대 개체에 아무 영향이 안간다.

운영체제는 프로세스를 서로 고립시키기 위해 노력하고 이런 방식으로 한 프로세스가 다른 프로세스에게 피해를 주는 것을 방지한다.

더 나아가 메모리 고립을 사용하여 운영체제는 프로그램이 운영체제 동작에 영향을 줄 수 없다는 것을 보장한다.

 

이는 보호의 성질을 이용하여 프로세스들을 서로 고립시킬 수 있다. 

 

더보기

여담 : 당신이 보는 모든 주소는 가상 주소이다.

포인터를 출력하는 C 프로그램을 작성한 적이 있으면 주소 값을 본적이 있을 것이다. 이것들은 모두 가상 주소이다.

메모리 가상화의 기술 때문에, 명령어와 데이터가 탑재되어 있는 물리 메모리 주소를 알 수 있는 것은 오직 운영체제 분이다. 

 

📝18 주소 변환의 원리

CPU 가상화 부분에서, 제한적 직접 실행 기법을 알아보았다. LDE의 아이디어는 간단하게 프로그램을 하드웨어에서 직접 실행하고 운영체제의 주도권을 위해 시스템 콜을 호출하거나 타이머 인터럽트를 일으킨다. 이 기법은 중요한 순간에 운영체제가 관여하여 하드웨어를 직접 제어하여 효율성과 제어를 챙기는 것이다.

 

메모리 가상화에서 비슷한 전략을 추구한다. 가상화를 제공하는 동시에 효율성제어 모두 추구한다. 

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

 

우리가 다룰 기법은 하드웨어-기반 주소 변환 또는 짧게 주소 변환이다.

주소 변환을 통해 하드웨어는 명령어 반입, 탑재, 저장 등의 가상 주소를 정보가 실제 존재하는 물리 주소로 변환한다.

  • 프로그램의 모든 메모리 참조를 실제 메모리 위치로 재지정하기 위해 하드웨어가 주소를 변환하는 것이다.

물론, 하드웨어에 의해 제공되는 저수준 기능들은 변환을 가속화 시키는 도움을 주지만, 하드웨어 만으로는 메모리 가상화 구현은 불가능하다. 운영체제의 관여가 있어야 한다. 

운영체제는 메모리의 빈 공간과 사용 중인 공간을 항상 알고 있어야 하고, 메모리 사용을 제어하고 관리한다.

 

이 모든 작업의 목표는 다음과 같다.

  • 프로그램이 자신의 전용 메모리를 소유하고 그 안에 자신의 코드와 데이터가 있다는 환상을 만드는 것이다

 

여기에 몇 가지 가정이 필요하다.

  • 사용자 주소 공간은 물리 메모리에 연속적으로 배치되어야 한다.
  • 주소 공간의 크기는 너무 크지 않고, 물리 메모리 크기보다 작다.
  • 각 주소 공간의 크기는 같다.

프로그램 관점에서 주소 공간은 주소 0부터 시작해서 최대 16KB까지이다. 프로그램이 생성한 모든 메모리 참조는 이 범위 내에 있다.

 

메모리 가상화를 위해 운영체제는 프로세스를 물리 메모리 주소 0이 아닌 다른 곳에 위치시키고 싶어한다.

어떻게 하면 프로세스 모르게 메모리를 다른 위치에 재배치 하느냐가 우리가 해결해야할 문제이다.

 

이 프로세스의 주소 공간이 메모리에 배치되었을 때 가능한 물리 메모리 배치의 예는 다음과 같다. 

  • 물리 메모리의 첫 번째 슬롯은 운영체제 자신이 사용한다.
  • 위 예시의 프로세스는 물리 주소 32KB에서 시작하는 슬롯에 재배치 되었다.

 

📝18.1 동적(하드웨어-기반) 재배치

하드웨어 기반 주소 변환을 이해하기 위해서는 예시를 봐야한다.

1950년대 후반의 첫 번째 시분할 컴퓨터에서 베이스와 바운드 라는 간단한 아이디어가 채택되었다. 이 기술은 또한 동적 재배치라고한다.

각 CPU마다 2개의 하드웨어 레지스터가 필요하다. 하나는 베이스 레지스터, 하나는 바운드 레지스터이다.

베이스와 바운드 쌍은 우리가 원하는 위치에 주소 공간을 배치할 수 있게 한다. 배치와 동시에 프로세스가 오직 자신의 주소 공간에만 접근하게 한다. 

  • 베이스(base) 레지스터
    • 원하는 위치에 주소 공간을 배치할 수 있게 한다.
    • physical address = virtual address + base
    • 프로세스가 생성하는 메모리 참조는 가상 주소(virtual address) 이다.
    • 하드웨어는 베이스 레지스터의 내용을 이 주소에 더하여 물리 주소(physical address) 를 생성한다.
  • 바운드(bound) 레지스터 - 한계(limit) 레지스터
    • 보호를 지원하기 위해 존재한다.
    • 메모리 참조가 합법적인지 확인하기 위해 가상 주소가 바운드 안에 있는지 확인한다.
    • 프로세스가 오직 자신의 주소 공간에만 접근한다는 것을 보장한다.

 

베이스와 바운드 레지스터는 CPU 칩 상에 존재하는 하드웨어 구조이다. 주소 변환에 도움을 주는 프로세서의 일부를 메모리 관리 장치(MMU)라고도 부른다. 

 

예제

위 예제에서 볼 수 잇듯이 물리 주소를 얻기 위해서 가상 주소에 16KB를 더한다.  이 16KB가 바로 베이스 주소이다. 

 

 

📝18.2 가상화의 하드웨어 지원 : 요약

필요한 하드웨어 지원을 요약해보자

CPU 가상화
  • 커널 모드 & 사용자 모드
    • 모드를 통한 컴퓨터 전체에 대한 접근 권한 제한
메모리 가상화 
  • 베이스와 바운더 레지스터
    • CPU의 메모리 관리 장치(MMU)로 주소 변환 지원

📝18.3 운영체제 이슈

동적 재비치 지원을 위해 하드웨어가 새로운 기능을 제공하는 것과 마찬가지로 운영체제도 개입해야하는 상황이 나왔다.

  1.  프로세스가 생성될 때 운영체제는 주소 공간이 저장될 메모리 공간을 찾아 조치를 취해야 한다.(빈 공간 리스트 자료 구조 검색)
  2. 프로세스가 종료될 때, 즉 정상적으로 종료될 때 또는 잘못된 행동을 하여 강제적으로 종료될 때 프로세스가 사용하던 메모리를 회수하여 다른 프로세스나 운영체제가 사용할 수 있게 해야 한다.
  3. 운영체제는 문맥 교환 시 몇 가지 추가 조치를 취한다.
    • 실행 중인 프로세스를 중단시킬 때, 프로세스 별 자료구조(프로세스 구조체(process structure) 또는 프로세스 제어 블럭(process control block, PCB)) 내에 베이스-바운드 레지스터의 값을 저장해야 한다.
    • 실행 중인 프로세스를 다시 시작할 때 또는 처음 실행시킬 때, 프로세스에 맞게 CPU의 베이스-바운드 값을 설정해야 한다.
  4. 운영체제는 예외 핸들러 또는 호출될 함수를 제공해야 한다.

 

📝요약

 

  • 주소 공간과 가상화: 운영체제는 프로세스가 독립적인 주소 공간을 가진 것처럼 보이게 하기 위해 물리 메모리에서 가상 주소를 물리 주소로 변환합니다.
  • 목표: 메모리 가상화의 주요 목표는 투명성, 효율성, 보호이며, 이를 통해 프로그램은 자신만의 전용 메모리가 있는 것처럼 행동하지만 실제로는 물리 메모리 상에서 여러 프로세스가 공유합니다.
  • 주소 변환과 하드웨어 지원: 베이스 레지스터와 바운드 레지스터를 사용한 주소 변환 기법을 통해 프로세스가 자신만의 주소 공간에만 접근할 수 있도록 보장합니다. 이를 위해 MMU(메모리 관리 장치)가 주소 변환을 지원합니다.
  • 동적 재배치: 프로그램이 자신의 주소 공간을 물리 메모리의 임의 위치에 배치할 수 있도록 하는 기술로, 하드웨어에서 주소 변환을 지원합니다.
  • 운영체제의 역할: 운영체제는 프로세스가 사용할 주소 공간을 관리하고, 프로세스가 종료되면 해당 메모리를 회수하여 다른 프로세스가 사용할 수 있도록 합니다. 또한, 문맥 교환 시 프로세스의 베이스-바운드 레지스터 값을 관리합니다.