운영체제 2편 - 가상화

이 글은 학부 운영체제 수업을 듣고 정리한 글입니다.
맥락없이 운영체제에 대한 내용들이 불쑥 등장하니 양해부탁드립니다.

이번에는 Kernel Architecture에 대한 내용입니다.
크게 Monolithic kernel, Micro kernel, Hypervisor를 알아봅시다.

Monolithic Kernel

Monolithic Kernel은 우리가 주로 사용하는 운영체제들에서 볼 수 있는 방식이라고 생각하면 편하다. Monolithic Kernel에서는 사용자와 Kernel이 같은 주소공간에 위치한다. 즉 주소공간을 Kernel과 사용자가 나누어서 사용하는 것이다.
Monolithic Kernel에서는 kernel 코드가 큰 한덩어리로 구성된다. 흔히 말하는 Monolithic Server Architecture를 생각하면된다. (반대로 흔히 MSA라고 부르는 Micro Server Architecture가 있다)

Monolithic Kernel의 장점은 유저의 Application과 커널이 같은 주소공간에 위치하기 때문에 SystemCall 및 커널 서비스 간의 데이터 전달시 오버헤드가 적다. SystemCall 호출시간도 짧은 편이다.
다만 단점도 존재하는데 모든 서비스 모듈이 하나의 바이너리로 이루어져 있기 때문에 커널 개발자로서 일부분의 수정이 전체에 영향을 미친다. 또한 커널의 크기가 커질수록 유지보수가 어려워 진다.
이에 대한 대항마로 Micro Kernel이 있다.


Micro Kernel

Micro kernel은 kernel을 쪼개기 시작한다. 커널이 한개가 아니고 여러개로 독립된 주소공간을 갖는다.
Micro kernel은 kernel 서비스를 각 기능에 따라 모듈화 하여 각각 독립된 주소공간에서 실행한다고 보면 된다.
각각의 모듈화한 모듈을 서버라고 부르며 이 서버들은 다른 process로서 존재한다.
여러개의 kernel들의 address space가 다 다르기때문에 function call을 할 수 없다.
그래서 message를 보내야 한다. Micro kernel 에서는 IPC(서버들간의 통신)라든지, RPC(Remote Procedure Call) 이런 공통기능만 제공한다.
File write이 필요하면 “File을 써주세요”라고 message passing을 한다. 그러면 message passing으로 VFS를 호출하고 다시 message passing으로 결과를 반환하는 구조이다.

Micro Kernel의 장점은 각 커널 서비스가 따로 구현되어있어 독립적인 개발이 가능하며, 커널 유지보수가 상대적으로 용이하다는 장점이 있다.
다만 성능적으로 Monolithic Kernel 보다 낮은 점이 단점이다.

다음은 block I/O에 대해 Monolithic Kernel과 Micro Kernel의 처리를 비교한 그림이다.

block I/O 처리비교


가상화

이제는 가상화라는 것이 많이 보편화되었다.
기본적으로 가상화는 Monolithic vs Micro kernel과는 조금 다른 관점이다.
어떤 kernel이든 예전에는 OS와 하드웨어는 1대1로 매핑되어 존재했다.
하나의 하드웨어 위에 OS가 여러개 있으면 뭐가 문제인데? 라는 질문을 할 수 있다. 이에 대한 질문으로 가상화가 시작된다.
가상화의 시작은 Virtual Machine부터 시작했다. 하나의 하드웨어 위에 여러개의 OS를 올릴 필요가 있었다. 여러개의 OS를 올려야 하니까 OS의 OS가 필요하다. 이름하여 Hypervisor이다.
다만 성능이 문제였다. 성능이 매우 좋지않아 사용하지 못하는 수준이였다.
하지만 이후에 Xen이라는 논문이 발표되었는데, 논문에서 소개한 방식으로 구현을 하게 되면 machine에 OS를 1개만 올리는 것과 성능이 거의 동일하다는 내용이였다. 약 3% 정도의 성능하락만 있다.
이때부터 많은 것이 바뀌었고, Cloud라는 새로운 industry가 급성장하기 시작했다고 한다.

위 그림의 Virtualization Layer가 Hypervisor 이다.
옛날에는 OS마다 하드웨어를 분리해서 동작시켜야 했다. 이런 일련의 모든 작업들을 프로비저닝(provisioning)이라고 한다.
예전에는 모든 OS에 대해 프로비저닝을 해야 했다.
그러나 가상화는 하드웨어를 다 합친다음에 그 위에 여러개의 OS를 돌릴 수 있다.
즉 하드웨어를 합쳐서 프로비저닝을 쉽게할 수 있다.

자동차 하나에 CPU가 몇개가 있을까? 자동차에 CPU가 최소 100개가 넘게 들어간다. 만약 이들을 10개로 줄이려는 노력을 한다고 가정해보자.
그러러면 어떻게 해야할까? Micro CPU들을 조금 더 강력한 CPU들로 대체해야한다.
그런데 그냥 막 대체할 수가 없다. 왜냐하면 기존의 코드수정이 필요할 수 있기 때문이다. 하지만 코드수정하기가 쉽지 않은 상황이라면 어떻게 해야할까?
여기서 가상화를 사용하면 쉽게 문제를 해결할 가능성이 높다. 100개의 Application들을 10개의 cpu 위에서 돌리면된다.
가상화는 software와 hardware의 결합도를 낮추도록 도와준다.

이것 말고도 isolation 관점에서의 장점도 있다. Guest OS들은 서로 독립되어 있다. Guest OS를 2개 돌렸을때 한개가 죽었을때 다른 한개에 영향을 주지 않는다.
즉, Hardware의 abstract를 guest os가 하는게 아니라 하이퍼바이저가 한다.
각각의 guest OS는 독립적인 virtual machine으로 작동한다.


Hypervisor

Hypervisor는 쉽게말해 Guest OS와 Hardware 사이에 위치하며 virtualize된 컴퓨터 Hardware 자원을 제공하기 위한 관리계층이다.
Hypervisor는 hardware의 자원을 분배하는 역할을 한다. 이는 기존의 os가 하던 일이다. Guest OS는 Hypervisor가 제공하는 가상화된 Hardware 자원을 이용한다.

Hypervisor 구조

간단하게 Hypervisor의 장단점을 보자.

Hypervisor 장점

  • 하나의 Physical Machine에서 여러 종류의 Guest OS가 운용이 가능하다.
  • 실제 컴퓨터가 제공하는 것과 다른 형태의 명령어 집합구조(Instruction Set Architecture)를 제공할 수 있다. 다른 Hardware 환경으로 compile된 Guest OS 및 Application도 구동이 가능하다는 것이다.

Hypervisor 단점

  • Hardware를 직접 사용하는 OS에 비해 성능이 떨어질 수 밖에 없다. 이 문제는 밑에서 설명할 반가상화(Para-virtualization)으로 성능저하 문제를 해결한다.

Hypervisor가 device를 emulation 해준다고 볼수있다. Guest OS의 역할은 결국 hardware를 제어하는 것이다.
결국 guest OS는 hypervisor위에 있다는 것을 모른다.
실제 하드웨어는 intel 칩인데 application은 ARM일 수 있다. 가상화 환경에서 돌리려다 보니까 instruction이 다르다. 그러나 이것도 돌려줄수 있다. Hypervisor가 emulation으로 ARM instruction을 흉내를 낸다.

가상화 자체는 좋은 아이디어지만 성능때문에 처음에는 쓸 수 없다고 생각했다. 그러나 Para virtualization(반가상화)라는 것이 나오면서 생각이 바뀌게 된다.
반가상화는 Guest OS를 본인이 Hypervisor 위에서 돌아가는 OS라는 것을 알게한다. 이것이 가상화 성능을 확 끌어올렸다.
이를 Hypervisor-aware 라고 한다. OS가 Hypervisor 위에 올라가는 걸 알게하려면 Kernel 코드를 뜯어 고쳐야했고 쉽지않았다.
결국 Para-virtualization은 Hypervisor와 협력을 해서 성능을 끌어올린 것이다.
반가상화는 가상화를 안한것과 성능이 거의 비슷하도록 발전했다.

하드웨어에서도 virtualization에 대한 큰 발전이 있었는데, Memory Management도 MMU라는 하드웨어가 CPU안에 들어가면서 Memory management가 확 발전하기 시작한 것처럼, intel에서도 가상화 자체를 CPU가 지원하면서 가상화가 확 발전하기 시작했다.

현재 자주 사용하는 경량화된 Hypervisor로서 KVM과 Container가 있다.
KVM 이라는 것은 리눅스에 포함된 hypervisor이다. KVM에서는 Xen의 Para-virtualization을 제거하고 intel에서 제공하는 가상화(VT-x) 하드웨어를 사용하여 가속할 수 있다.

더 최근에는 오히려 더 잘알려진 개념인 Container를 많이 쓴다.
Container는 OS를 우리가 올리지 말고 경량화해서 사용하자는 개념이다. Container는 Guest OS가 없다.
Container는 root file system을 공유하고 라이브러리들을 공유한다. 그러므로 KVM보다 가볍다.

Container

Hypervisor에는 Type 1과 Type 2가 있다.
지금까지 설명한 것은 Type 1 Hypervisor이고 Bare-metal Hypervisor라고도 한다.
Host OS위에 Guest OS가 올라가있는 것을 Type 2 hypervisor라고 한다.
성능은 당연히 Type 1이 빠르다. 밑의 그림은 Type 1과 Type 2의 비교이다.

Hypervisor Type 1 vs 2(https://www.techtarget.com/searchitoperations/tip/Whats-the-difference-between-Type-1-vs-Type-2-hypervisor)


정리

  • Monolithic Kernel의 단점을 보완하기 위한 Micro Kernel도 있다.
  • Hypervisor의 존재로 한개의 Physical Machine 위에 여러개의 OS를 구동할 수 있었다.
  • 요즘은 intel 가상화의 도움을 받을 수 있는 KVM이나 Container 기반의 기술들을 주로 사용한다.

Reference




댓글