|
|
C 언어의 조상 격인 1969년대의 Basic Combined Programming Language (BCPL)에도 같은 개념이 적용되었다. 이 때에는 컴파일러가 BCPL 코드를 O-code 라고 하는 중간 머신 코드로 컴파일 한다. 두 번째 단계로, O-code는 대상(target) 머신의 네이티브 언어로 컴파일 되었다. 이 모델은 현대적인 컴파일러에 의해 사용되어, 새로운 대상 아키텍처로 컴파일러를 이식할 때 유연하다. (중간 언어(intermediate language)에 의해 프론트엔드와 백엔드를 구별한다.)
최근의 가상화 추세는 명령어 가상화(instruction set virtualization) 또는 바이너리 변환이다. 이 모델에서, 가상(virtual) 명령어는 기반 하드웨어의 물리적 명령어로 동적으로 변환된다. 실행될 코드가 있을 경우 코드 세그먼트에 변환이 이루어진다. 분기(branch)가 발생하면, 새로운 코드 세트가 변환된다. 이것은 메모리에서 빠른 로컬 캐시 메모리로 명령어 블록을 이동하는 캐싱 연산과 매우 비슷하다.
이 모델은 최근 Transmeta에서 설계된 Crusoe CPU에서 사용되었다. 이 아키텍처는 Code Morphing 이라는 이름으로 바이너리 변환을 구현했다. 비슷한 예로 권한이 있는 명령어를 찾아서 리다이렉션 하는 전체 가상화(full virtualization) 솔루션에서 사용되는 런타임 코드 스캐닝이다. (특정 프로세스 명령어와 관련된 이슈를 해결한다.)
|
가상화 같은 경우, 단 한 가지 방법만 있는 것은 아니다. 사실, 다양한 레벨의 추상화(abstraction)를 통해서 같은 결과를 얻을 수 있다. 이 섹션에서는 리눅스의 가장 일반적인 가상화 방식 세 가지를 소개하고, 이들의 장단점을 비교해 볼 것이다. 가끔씩 같은 가상화 방식을 설명하는 경우에도 다른 용어를 사용한다. 이 글에서는 가장 일반적인 용어를 사용하도록 하겠다.
가장 복잡한 가상화는 그림 1처럼 하드웨어 에뮬레이션에 의해 제공된다. 이 방식에서, 하드웨어 VM은 호스트 시스템에서 생성되어 해당 하드웨어를 에뮬레이트 한다.
|
여러분도 잘 알겠지만, 하드웨어 에뮬레이션의 가장 큰 문제는 극도로 느려질 수 있다는 점이다. 모든 명령어들이 기반 하드웨어에 시뮬레이트 되어야 하기 때문에, 100배 정도 느려지는 것은 다반사이다. 사이클 정확성(cycle accuracy), 시뮬레이트 된 CPU 파이프라인, 캐싱 작동을 포함한 하이파이(high-fidelity) 에뮬레이션의 경우, 실제 속 차이는 1000배나 더 느려질 수도 있다.
하드웨어 에뮬레이션은 장점도 있다. 예를 들어, 하드웨어 에뮬레이션을 사용하면, PowerPC?용의 수정되지 않은 OS를 ARM 호스트에서 실행할 수 있다. 다른 프로세서를 시뮬레이트 하는 여러 개의 가상 머신들을 실행할 수도 있다.
전체 가상화(네이티브 가상화) 또한 가상화 방식이다. 이 모델은 게스트(guest) OS들과 네이티브 하드웨어 사이를 중재(mediate)하는 가상 머신을 사용한다. (그림 2) "중재(Mediate)"는 핵심적인 단어이다. VMM이 게스트 OS와 베어 하드웨어 사이를 중재하기 때문이다. 보호를 받고 있는 특정 명령어들은 하이퍼바이저 내에서 트랩핑(trap) 및 핸들되어야 한다. 기반 하드웨어는 OS가 소유한 것이 아닌, 하이퍼바이저를 통해서 공유되기 때문이다.
|
전체 가상화는 하드웨어 에뮬레이션 보다는 빠르지만, 하이퍼바이저 중재 때문에 실제 하드웨어 보다는 성능이 낮다. 전체 가상화의 가장 큰 장점은 OS를 수정하지 않고 실행될 수 있다는 점이다. 유일한 제한 사항은 OS가 기반 하드웨어(예를 들어, PowerPC)를 지원해야 한다는 것이다.
Paravirtualization은 전체 가상화와 약간 유사한 대중적인 기술이다. 이 방식은 기반 하드웨어로의 공유 액세스에 하이퍼바이저를 사용하지만, 가상화 인식 코드를 OS로 통합한다. (그림 3) 이 방식은 재컴파일이나 트래핑(trapping)을 할 필요가 없다. OS 그 자체로 가상화 프로세스에 협력하기 때문이다.
앞서 언급했던 것처럼, Paravirtualization은 게스트 OS들이 하이퍼바이저에 맞게 수정되어야 한다. 이것이 단점이다. 하지만, Paravirtualization은 가상화 되지 않은 시스템 성능에 가까운 성능을 보인다. 전체 가상화와 마찬가지로, 여러 다른 OS들이 동시에 지원된다.
P.S =VMWARE 옵션에 가면 kernel paravirtualization 이라는 옵션을 볼수 있다.
마지막 기술인 OS 레벨 가상화는 지금까지 다루어왔던 것과는 다른 기술을 사용한다. 이 기술은 그림 4처럼 OS에서 서버들을 가상화 한다. 이 방식은 하나의 OS를 지원하고, 서버들을 분리시킨다.
OS 레벨 가상화는 OS 커널을 수정해야 하지만, 장점은 성능이 우수하다는 점이다.
왜 가상화가 중요한가?
리눅스에서 사용할 수 있는 가상화 옵션들을 보기 전에, 가상화의 장점부터 살펴보도록 하자.
비즈니스 관점에서 볼 때, 가상화를 사용해야 하는 이유는 많이 있다. 대게는 서버 통합(server consolidation)이 주요한 이유이다. 사용도가 낮은 많은 시스템들을 하나의 서버에 가상화 할 수 있다면, 파워, 공간, 냉각, 서버 관리 등에서 뚜렷한 절감 효과를 볼 수 있다. 서버 활용도를 결정하는 것은 어렵기 때문에, 가상화 기술은 라이브 마이그레이션(Live migration)이라는 것을 지원한다. 라이브 마이그레이션으로 OS와 애플리케이션들은 새로운 서버로 마이그레이션 되어 가용 하드웨어에 대해 로드를 조정할 수 있다.
가상화는 개발자에게도 중요하다. 리눅스 커널은 하나의 어드레스 공간을 차지하는데, 커널 또는 드라이버의 오류가 전체 OS 충돌이라는 결과를 가져올 수도 있다는 의미이다. 가상화를 통해서 여러 OS들을 실행할 수 있고, 버그로 인해서 한 OS가 고장이 나더라도, 하이퍼바이저와 다른 OS들은 계속해서 실행될 수 있다. 이로서 사용자 공간(user-space) 애플리케이션을 디버깅 하는 것과 비슷한 커널 디버깅이 가능해진다.
출처 : http://www.ibm.com/developerworks/kr/library/l-linuxvirt/
첫댓글 요즘 정권이의 노력이 엄청난데.....
더욱더 열공.... 힘내...쩡권....
ㅎㅎ 감사합니다 ㅎ