안녕하세요. IT 엘도라도 에 오신 것을 환영합니다.
글을 쓰는 것은 귀찮지만 다시 찾아보는 것은 더 귀찮습니다.
완전한 나만의 것으로 만들기 위해 지식을 차곡차곡 저장해 보아요.   포스팅 둘러보기 ▼

컴퓨터 구조 (Architecture)/CSAPP

[CSAPP] Virtualization

피그브라더 2020. 2. 26. 23:22

1. 운영체제 (Operating System, OS)

1-1. 부팅 (Booting)

컴퓨터 전원을 켜면 어떠한 과정을 거쳐서 운영체제의 실행으로까지 이어지는 것일까? 컴퓨터의 전원을 켜는 순간, 실행할 명령어의 주소를 담고 있는 PC 레지스터의 값은 특정 값으로 초기화된다. 그 값은 ISA에서 정의하는 것으로, OS를 실행하기 전에 수행해야 하는 몇몇 초기화 작업들을 위한 루틴의 시작 주소가 된다. 그러한 루틴은 ROM 혹은 NOR 플래시 메모리와 같은 비휘발성 메모리에 저장되어 있어서, 컴퓨터의 전원이 꺼져 있을 때도 데이터가 계속 유지된다. 초기화 작업을 위한 루틴이 종료되면, 이제 하드 디스크에서 OS의 코드를 로드하여 실행한다. 이로써 부팅이 완료되는 것이다.


1-2. 운영체제의 역할

OS는 부팅이 완료된 순간부터 컴퓨터가 종료될 때까지 메모리에 상주하며 쉬지 않고 돌아가는 일종의 프로그램이다. 그래서 유저 프로그램을 실행하지 않고 가만히 있어도 기본적으로는 OS의 코드가 계속해서 돌고 있게 된다. 그러다가 유저 프로그램을 실행하면 그때 CPU의 제어를 유저 프로그램에게 넘겨주는 것이다. 그렇다면 OS의 역할은 무엇일까? OS는 컴퓨터 전반을 통제하는 지휘자이면서 동시에 여러 유저 프로그램들의 실행을 관리하는 중재자이다. 유저 프로그램은 매우 사악하다는 '성악설'을 전제로, 특정 유저 프로그램이 잘못된 동작을 하지 않는지 감시한다. 또한, 각 유저 프로그램들이 실행 시간과 여러 컴퓨터의 자원을 골고루 나눠서 할당받을 수 있게끔 한다. 예를 들어, 혼자서 CPU의 제어를 독차지하여 다른 유저 프로그램이 실행되지 못하게 하는 유저 프로그램이 있을 수 있다. 이러한 경우, 일정 시간이 지나 타이머 인터럽트가 발생하여 실행된 OS 코드가 CPU의 제어를 강제로 다른 유저 프로그램에게 넘겨주게 할 수 있다.


1-3. 운영체제의 주요한 기능

운영체제가 제공하는 주요한 기능으로는 다음과 같은 것들이 있다.

 

기능 설명
가상화
(Virtualization)
바로 뒤에 이어서 설명할 내용으로, 이번 포스팅에서 가장 중요한 주제이다. 간단히 말하자면 현실의 물리적 한계를 뛰어 넘어 그 이상의 기능을 제공하는 것처럼 보이게 하는 기법을 말한다. 프로세스 가상화, 메모리 가상화 등은 OS가 제공하는 아주 중요한 기능들에 해당한다.
자원 관리
(Resource Management)
프로그램이 실행하는 데 사용할 수 있는 시간, 또는 메모리나 레지스터와 같이 프로그램 실행 도중 사용하게 되는 여러 하드웨어 장치들을 여러 프로그램들에게 공정하고 효율적인 방식으로 분배해주고 관리하는 것을 말한다.
입출력
(Input and Output)
사용자가 다루기에는 상당히 복잡한 입출력 연산을 추상화함으로써 사용자가 편리하게 입출력 관련 동작을 수행할 수 있게 해준다. 예를 들어, 섹터(512 바이트) 단위로 이뤄진 하드 디스크를 '파일 시스템'이라는 것으로 추상화함으로써 사용자는 쉽게 읽고 쓰기가 가능해진다.

1-4. 운영체제로 제어가 넘어가는 경우

유저 프로그램이 실행되다가 CPU의 제어가 OS로 넘어가는 경우(OS의 코드를 실행해야 하는 경우)는 다음과 같이 정리할 수 있다.

 

제어가 OS로 넘어가는 경우 설명
① 시스템 콜 (System Call) OS의 도움이 필요하여 자발적으로 OS 코드를 호출하는 것을 말한다.

EX) C 언어의 printf 함수가 입출력 장치에 접근하여 입출력 연산을 수행하기 위해 내부적으로 OS의 입출력 루틴을 호출하는 것이 시스템 콜의 대표적인 예이다. 또한 LC-3에서의 TRAP 명령어도 시스템 콜에 해당한다.
② 인터럽트 (Interrupt) 외부 장치에서 특정 이벤트가 발생하여 CPU에게 신호를 보내는 것을 말한다.

EX) 데이터를 교환할 준비가 된 입출력 장치가 CPU에게 신호를 보내는 것이 인터럽트에 해당한다. 또한, 일정 시간이 경과하였음을 감지하고 타이머 장치가 CPU에게 신호를 보내는 것도 인터럽트에 해당한다.
③ 예외 (Exception) 외부 장치가 아닌, 프로그램 실행 도중 CPU 내부에서 자체적으로 문제가 발생하는 것을 말한다.

EX) 프로그램이 0으로 나누는 연산을 수행하거나, 연산 도중 오버플로우가 생기거나, ISA에서 정의하지 않은 명령어를 실행하거나, 유저 모드에서 실행하면 안 되는 명령어를 실행하거나 하는 경우들일 때 예외가 발생한다.

 

2. 가상화 (Virtualization)

컴퓨터의 발전 역사는 가상화의 역사와 맥을 같이 한다고 해도 과언이 아니다. 앞서 간단히 언급했듯, 가상화(Virtualization)란 현실의 물리적 한계를 뛰어넘는 기능을 제공하는 것처럼 보이게 하는 기술을 말한다. 이것이 구체적으로 어떤 의미인지는 가상화 기술을 적용한 몇 가지 사례들을 살펴보며 이해해보도록 하자. 가상화 기술을 적용한 대표적인 사례로는 프로세스 추상화(Process Abstraction), 가상 머신(Virtual Machine), 캐시 메모리(Cache Memory), 가상 메모리(Virtual Memory), 동시 멀티스레딩(Simultaneous Multithreading, SMT) 등이 있다. 이것들은 모두 컴퓨터 분야에서 혁신적인 발전을 이끌어낸 기술들이라는 공통점이 있다. 참고로 가상화는 없는 것을 만들어낸다는 측면에서 논리적 중복(Logical Duplication)이라는 용어로 표현하기도 한다.


2-1. 프로세스 추상화 (Process Abstraction)

하나의 물리적인 CPU에 타이머 장치의 인터럽트를 이용한 OS의 시간 분할 다중화(Time Division Multiplexing) 기술을 더하여. 마치 여러 개의 CPU가 존재하는 듯한 착각을 만들어내는 것을 말한다. 시간 분할 다중화 기술은 각 프로세스에게 일정 시간을 할당하고 그 시간이 지나면 타이머 장치가 인터럽트를 발생시켜서 CPU의 제어를 또 다른 프로세서에게 넘겨주는 것을 말한다. 이때 그 시간 할당량을 작게 하면 여러 프로세스가 마치 동시에 실행되는 듯한 착각을 줄 수 있다. 결국, 실제 CPU의 개수보다 더 많은 CPU가 존재하는 것처럼 느껴지는 것이다. 물론 이를 위해서는 CPU의 상태를 백업 및 복원하기 위한 메커니즘이 필요할 것이다.


2-2. 가상 머신 (Virtual Machine)

하나의 OS를 구동하는 물리적인 컴퓨터에, 특정 소프트웨어의 도움을 받아 마치 여러 OS를 구동하는 듯한 착각을 만들어내는 것을 말한다. 프로세스 추상화가 CPU를 가상화한 것이라면, 이는 컴퓨터 시스템 전체를 가상화한 것이라고 볼 수 있다. 물론 이를 위해서는 컴퓨터 시스템 전체의 상태(CPU, 저장 장치, 네트워크 등의 상태)를 백업 및 복원하기 위한 메커니즘이 필요할 것이다.


2-3. 캐시 메모리 (Cache Memory)

DRAM으로 만들어진 메인 메모리에 SRAM으로 만들어진 캐시 메모리를 더하여, 마치 속도는 SRAM만큼 빠르고 가격은 DRAM만큼 저렴한 메모리 소자가 있는 듯한 착각을 만들어내는 것을 말한다. 메인 메모리에서 자주 참조되는 데이터들을 캐시 메모리에 저장하고 CPU는 메모리 접근 시 캐시 메모리를 먼저 확인함으로써 메모리 참조 속도를 혁신적으로 향상시킨 기술이다.


2-4. 가상 메모리 (Virtual Memory)

메인 메모리에 로드될 데이터를 하드 디스크에 저장하고 그중 프로세스가 자주 참조하는 부분만 메인 메모리로 로드함으로써, 마치 각각의 프로세스가 하나의 메인 메모리를 독차지하고 있는 듯한 착각을 만들어내는 것을 말한다. 이는 하드 디스크를 대상으로 공간 분할 다중화(Space Division Multiplexing) 기술을 적용한 사례라고 볼 수 있다. 캐시 메모리는 메인 메모리의 내용 일부를 저장하는 곳이라면, 가상 메모리 기술에서는 하드 디스크의 내용 일부를 메인 메모리에 저장하는 것이다.

 

3. 가상 메모리 기술

가상 메모리 기술은 컴퓨터 구조에서 너무나도 중요한 내용이기 때문에, 여기서 가상 메모리 기술의 원리를 간단하게 짚고 넘어가려 한다. 물론 자세한 내용은 이후 포스팅에서 다룰 예정이다. 여기서 설명하는 내용을 전반적으로 이해하면 이후 포스팅의 내용도 더 쉽게 이해할 수 있을 것이다.


3-1. 가상 주소, 물리 주소 (Virtual Address, Physical Address) 

가상 메모리 기술을 이해하기 위해서는 먼저 가상 주소와 물리 주소의 개념을 알아야 한다. 가상 주소(Virtual Address)란 컴파일된 실행 파일 내에 표현되어 있는 메모리 주소들을 일컫는다. 그래서 실제로 CPU가 프로그램을 실행할 때 읽는 메모리 주소는 전부 가상 주소이다. 하지만 이름이 의미하듯이 가상 주소는 실제 메모리의 주소인 물리 주소(Physical Address)와 다르다. 따라서 CPU는 메모리에 접근하고자 할 때 반드시 가상 주소를 물리 주소로 변환하는 과정을 거쳐야 한다. 이에 대해선 뒤에서 알아보자.


3-2. 가상 메모리 기술 원리 (요약)

가상 주소 공간은 고정된 크기의 페이지(Page)로 나눠진다. 그중 일부 페이지들만 물리 주소 공간의 페이지에 대응이 되고 나머지 페이지들은 하드 디스크에 저장이 되는데, 이것이 가상 메모리 기술의 핵심이다. CPU가 가상 주소를 MMU(Memory Management Unit)라는 하드웨어 장치에 넘겨주면, MMU는 TLB(Translation Look-aside Buffer)라는 하드웨어 장치를 참조하여 가상 주소를 물리 주소로 변환한다. TLB가 물리 주소를 계산해 내지 못하는 경우가 있는데, 이 현상을 페이지 폴트(Page Fault)라고 부른다. 대부분의 경우에 이는 가상 주소 공간의 페이지가 물리 주소 공간에 없기 때문에 발생하는 것이다. 이렇게 되면 예외(Exception)가 발생하여 CPU의 제어가 OS에게 넘어가서 OS가 페이지 폴트를 해결하기 위한 작업을 시작한다. 참조하려는 페이지를 하드 디스크로부터 가져와서 비어있는 메모리 공간에 적재하거나, 이미 메모리가 꽉 차 있다면 메모리에서 하나의 페이지를 꺼내서 하드 디스크에 두고 새로운 페이지를 적재한다. 이 작업까지 끝나면 인터럽트 메커니즘을 통해 해당 작업이 끝났음을 다시 CPU에게 알려줌으로써 페이지 폴트에 대한 처리를 마무리하게 된다.


3-3. 가상 메모리 기술의 두 가지 측면

3-3-1. 어떤 원리로 구현하는가? (Functionality)

① 하드웨어 : MMU(Memory Management Unit) + 페이지 폴트(Page Fault)를 처리하는 예외(Exception) 메커니즘

소프트웨어 : 페이지 테이블에 근거하여 가상 메모리를 관리하는 OS 루틴

 

3-3-2. 어떤 원리로 최적화를 하는가? (Performance)

앞선 포스팅에서 살펴보았듯이, 메모리 참조는 두 종류의 지역성(Locality)을 활용하여 최적화할 수 있다. 첫째로 Temporal Locality는 최근에 참조된 데이터가 다시 참조될 확률이 높다는 것이었고, 둘째로 Spatial Locality는 주변에 있는 데이터가 다시 참조될 확률이 높다는 것이었다. 이 원리는 캐시 메모리에 활용될 뿐만 아니라, 페이지 테이블 참조를 최적화하는 데에도 활용이 된다. MMU가 가상 주소를 물리 주소로 변환하기 위해 참조하는 고속의 보조 기억 장치에 해당하는 TLB(Translation Look-aside Buffer)가 바로 그렇다. 캐시 메모리와 마찬가지로 지역성을 활용하여 자주 접근되는 페이지로 페이지 테이블을 구성함으로써, 페이지 폴트의 발생 확률을 현저하게 낮추게 된다.

'컴퓨터 구조 (Architecture) > CSAPP' 카테고리의 다른 글

[CSAPP] x86-64 - Procedures  (2) 2020.03.01
[CSAPP] x86-64 - Control  (7) 2020.02.29
[CSAPP] x86-64 - Basics  (4) 2020.02.28
[CSAPP] Overview  (0) 2020.02.24
[CSAPP] 포스팅을 시작하며..  (4) 2020.02.24