[운영체제/OS] 가상머신(Virtual Machine)과 Linux OS에 대해
kindof
·2021. 6. 14. 19:46
1. 가상머신(Virtual Machine)의 필요성
과거에는 하나의 어플리케이션 프로그램이 특정한 플랫폼에서만 실행 가능한 종속 관계를 가지고 있었습니다.
예를 들어 i386 ISA는 linux 운영체제를 사용했고 x86은 Window 운영체제를 필요로 했죠. 하드웨어와 운영체제 간 결합이 강했기 때문에 그 관계가 맞지 않으면 프로그램 작동을 원활하게 할 수 없었던 때였습니다.
이러한 문제 의식에서 출발하여 "아무 컴퓨터에서나 내 응용 프로그램을 돌리고 싶다"라는 목표가 생겼고, 이를 위해 가상머신(Virtual Machine)이 등장하게 되었습니다. 즉, 가상 머신이 등장하게 된 슬로건은 "Software for Cross-platform Compatibility"이었죠.
그리고 이로부터 파생되고 발전하게 된 가상 머신은 현재 아래와 같은 목적을 위해 사용되고 있습니다.
- 하나의 컴퓨터로 서로 다른 두 개 이상의 운영체제를 실행하기 위해
- 하나의 컴퓨터 자원을 여러 사용자에게 나누어 주는 상황에서 상호 간섭을 없애기 위해
- 컴퓨터의 다른 부분에 영향을 주지 않는 독립 환경을 만들기 위해
2. 가상머신이란 무엇인가?
그렇다면 가상 머신이란 정확히 무엇을 의미할까요? 가상 머신은 컴퓨터 안에 또 다른 컴퓨터를 동작시키는 개념입니다. 이를 위해 컴퓨터의 주된 부품들인 CPU, RAM, HDD 등의 기능을 소프트웨어적으로 구현해 가상으로 만들어내는 것이죠.
가상 머신을 구현하는 개념에는 크게 세 가지가 있습니다.
첫번째는 애뮬레이션(Emulation) 이라는 개념입니다. 애뮬레이션은 컴퓨터 부품들의 기능을 소프트웨어적으로 구현하는 방식으로 속도는 가장 느리나 범용성은 가장 뛰어난 방식입니다.
두번째는 가상화(Virtualization)라는 개념입니다. CPU 등 주요 부품의 기능에서 하드웨어의 기능을 지원받습니다. 속도는 빠르나 해당 하드웨어에 종속되므로 범용성이 떨어질 수밖에 없죠. 예를들어 CPU를 가상화하면 실제 CPU가 처리하는 기계어 세트에서 크게 벗어날 수 없는 것처럼 말입니다.
반가상화(Paravirtualization)는 기반이 되는 하드웨어, 소프트웨어와 동일하지는 않지만 비슷한 가상 머신에 대한 소프트웨어 인터페이스를 제공하는 기술입니다. 완전한 에뮬레이션/가상화를 포기한 방법이라고 이해할 수 있습니다. 가상 머신에 설치되는 OS에 수정을 가하거나 전용 드라이버를 이용하여 하드웨어에 직접 접근하는 방식을 이용하여 속도는 가장 빠르지만, 운영체제와 드라이버에 종속되어서 범용성은 가장 떨어집니다.
3. 가상 머신의 분류
가상 머신은 크게 다음 두 가지로 나눌 수 있습니다.
1) Process VM
Process VM은 플랫폼에 독립적인 환경에서 컴퓨터 프로그램을 실행하기 위해 고안되었습니다. x86 application을 Alpah CPU에서 돌렸던 것이나 JVM(Java Virtual Machine)을 사용하는 것처럼 말이죠. 아마 Process VM을 이해할 때 JVM을 떠올려보면 가장 직관적으로 이해가 될 것 같습니다.
Process VM은 호스트의 운영체제 내에서 단일 프로세스를 지원하는 일반 어플리케이션으로 실행됩니다. 프로세스가 시작될 때 생성되고, 프로세스가 끝나면 소멸하게 되죠. 또한 프로세스에 플랫폼 독립적인 프로그래밍 환경을 제공하여 어플리케이션이 다른 플랫폼에서 동일한 방식으로 실행할 수 있게 합니다. - Runtime 방식의 VM이라고도 합니다.
2) System VM
System VM은 실제 기계를 대체해서 제공하며, 전체 운영체제를 실행하기 위한 기능들을 제공합니다. Windows 운영체제에서 Linux 운영체제를 실행하기 위해 Oracle VM을 사용하는 것을 떠올려보면 좋을 것 같습니다.
System VM은 전체 운영체제를 실행하기 위한 기능을 제공하기 때문에 무겁기도 하고 하드웨어 리소스는 동일 물리적 호스트에 존재하게 됩니다.
4. 왜 Linux OS를 선호하는가?
가상 머신 이야기를 하다가 잠깐 Linux OS에 대한 이야기를 하려고 합니다. 저같은 경우도 처음 가상 머신을 사용하게 된 게 학교 전공 과제로 리눅스를 사용해야 했기 때문인데요.
컴퓨터가 윈도우 운영체제였기 때문에 가상 머신을 이용해 리눅스 OS환경을 세팅했고, 과제를 했던 경험이 있습니다.
그런데 어떤 이유에서 Linux OS는 개발하기 좋은 환경이 되었을까요? 간단하게 그 이유를 알아보려고 합니다.
첫째, 리눅스는 공개 코드 상에서 보안상 문제가 지적되는 경우가 있지만 리눅스 커널은 상당히 오랜 기간 동안의 연구, 전세계의 개발자들로부터 지속적인 피드백을 거쳐 완성되었기 때문에 기본적인 완성도가 높습니다.
둘째, 리눅스 커널이 공개되어 있고 전세계의 다양한 분야의 개발자들이 참여하여 왔으며 하드웨어 관련 기업들의 참여가 확산되어 있습니다. 이에 따라 리눅스 커널은 폭넓은 하드웨어 장치들을 지원하는 드라이버들을 포함하고 있죠.
셋째, 리눅스는 거의 대부분의 C언어와 어셈블리 언어로 작성되어 있습니다. C언어 자체가 특정 기계에 비의존적이기 때문에 프로그램을 다른 기계의 시스템으로 Porting하는 것이 용이합니다. 이런 이유로 OS자체도 하드웨어에 적합하게 변형이 가능합니다.
넷째, UNIX 시스템과 리눅스 시스템은 거의 모든 프로그래밍 언어를 제공합니다. 특히 GNU 소프트웨어가 무료로 제공되면서 수백, 수천만원의 프로그래밍 툴을 사용하지 않아도 되죠. 또한 모든 시스템의 소스가 개방되어 있기 때문에 소프트웨어 개발에 개방적입니다.
한편, 이전 시간에 운영체제의 구조에 대해 알아봤었는데요. 리눅스 운영체제는 모놀리틱(Monolithic) 커널을 사용합니다. 이는 프로세스, 메모리, 파일 시스템, I/O 관리, 네트워크의 모든 커널의 기능을 커널의 내부에 System call과 Interrupt 처리 부분으로 포함하여 제공하는 것이죠. 따라서, System Call에 의한 서비스가 빨라지는 장점이 있었습니다.
이러한 이유로 우리는 Linux OS를 적극적으로 활용하고 있습니다. 많이 쓰는 만큼 이런 이유는 한 번 알아두면 좋을 것 같습니다.
'CS > OS' 카테고리의 다른 글
[운영체제/OS] 멀티쓰레드 구현해보기 (0) | 2021.06.14 |
---|---|
[운영체제/OS] 프로세스 모델의 한계과 멀티쓰레드의 필요성 (0) | 2021.06.14 |
[운영체제/OS] OS 자체는 어떻게 구현할까? (0) | 2021.06.14 |
[운영체제/OS] 프로세스와 컨텍스트 스위칭(Context Switching) (0) | 2021.06.14 |
[운영체제/OS] 운영체제의 이중 동작 모드(Dual Mode Operation)와 인터럽트(Interrupt) (0) | 2021.06.14 |