Virtual Machine ~= Hypervisor
하이퍼바이저란 무엇인가요?- 하이퍼바이저 설명 - AWS
하이퍼바이저(Hypervisor)는 호스트 컴퓨터에서 여러 개의 운영 체제를 동시에 실행하기 위한 논리적 플랫폼입니다. 가상화 머신 모니터 또는 가상화 머신 매니저(Virtual Machine Monitor 또는 Virtual Machine Manager, 줄여서 VMM)라고도 부릅니다.
하이퍼바이저는 하드웨어의 자원을 가상화하여 여러 운영 체제에 동적으로 할당하고 관리할 수 있습니다. 또한 각 운영 체제를 독립된 가상 머신으로 분리시킴으로써 안정성과 보안성을 향상시킵니다.
하이퍼바이저의 종류로는 Type 1 하이퍼바이저와 Type 2 하이퍼바이저가 있습니다. Type 1 하이퍼바이저는 하드웨어 바로 위에 위치하며, 하드웨어를 제어하는 OS 역할과 VM들을 관리하는 역할을 모두 담당합니다. 별도의 호스트 OS가 없기 때문에 호스트형 가상화에 비해 오버헤드가 적고 하드웨어를 직접 제어하기 때문에 효율적으로 리소스를 사용할 수 있습니다. 하지만 자체적으로 머신에 대한 관리 기능이 없기 때문에 관리에 필요한 컴퓨터나 콘솔(CLI)이 필요하여 Type 2보다 사용성이 낮습니다.
qemu
QEMU는 가상 머신과 에뮬레이션 환경을 만들기 위한 오픈 소스 소프트웨어로, Quick EMUlator의 약자입니다. QEMU는 프로세서와 가상 주변 기기들을 포함한 완전한 컴퓨터 시스템을 에뮬레이트하며, 한 컴퓨터에 여러 개의 가상 컴퓨터를 호스팅할 수 있습니다. QEMU는 리눅스, 윈도, 도스, BSD 등 다양한 게스트 운영 체제를 시동할 수 있으며, x86, amd64, alpha, mips, sparc 등 다양한 하드웨어 플랫폼을 에뮬레이트할 수 있습니다.
QEMU는 일반적으로 Linux의 KVM 기술과 함께 사용되며, 웹서버나 클라우드 서버를 운영하는 호스팅 업체나 데이터 센터에서 다수의 가상 머신을 운용하기 위해 사용됩니다. QEMU는 가상화보다는 에뮬레이터라고 말하는 것이 더 정확한 표현입니다.
Common bugs
Memory leak
메모리 누수(Memory Leak)는 더 이상 사용하지 않는 객체들이 힙(Heap) 영역에 남아 있어 불필요하게 메모리를 차지하고 있는 상황을 의미합니다. 응용 프로그램에서 데이터를 메모리에 올렸다가, 이것이 쓸모없어지는 시점에서 적절하게 제거되지 않는 것을 '누수'에 빗댄 말입니다.
메모리 누수는 부주의 또는 일부 프로그램 오류로 인해 더이상 사용되지 않는 메모리를 해제하지 못하는 것으로 발생합니다. 할당된 메모리를 사용한 다음 반환하지 않는 것이 누적되면 메모리가 낭비됩니다. 누적된다면 시스템 전체의 메모리 부족 현상이 발생 할 수 있습니다.
메모리 누수의 예로는, fread함수에서 파일 읽기가 실패하면 return NULL을 하고 read_buffer함수가 종료되는 경우가 있습니다. 이때 바로 메모리 누수가 발생하는데, Heap메모리 할당을 받은 buf변수가 free를 통해 메모리가 해제되지 않았기 때문입니다.
Race condition
레이스 컨디션(race condition)은 공학 분야에서 둘 이상의 입력 또는 조작의 타이밍이나 순서가 결과값에 영향을 줄 수 있는 상태를 말합니다. 입력 변화의 타이밍이나 순서가 예상과 다르게 작동하면 정상적인 결과가 나오지 않게 될 위험이 있는데 이를 경쟁 위험이라고 합니다.
레이스 컨디션은 프로그램이나 시스템 등의 실행/출력 결과가 일정하지 않고, 입력의 타이밍, 실행되는 순서나 시간 등에 영향을 받게 되는 상황입니다. 결과가 매번 달라지므로 버그를 불러오기 딱 좋습니다.
레이스 컨디션은 여러 스레드 또는 프로세스가 적절한 동기화 없이 공유 리소스에 액세스하면 발생할 수 있습니다. 또한, 프로그래머가 강제하지 않고 특정 실행 순서를 가정할 때 실제 실행 순서가 다를 경우에도 발생할 수 있습니다.
레이스 컨디션과 같은 동시성 문제를 해결하기 위해 임계 구역을 효과적으로 사용하는 것이 중요합니다. 임계 구역에 접근하기 전에 락(Lock)이나 세마포어(Semaphore)와 같은 동기화 메커니즘을 사용하여 한 번에 하나의 실행 흐름만이 임계구역에 들어갈 수 있도록 합니다.
- 임계 구역critical section임계구역은 다음과 같은 영역으로 구성됩니다:
- entry section: 임계구역에 진입하기 위해 진입 허가를 요청하는 영역으로 접근을 제어(lock)합니다.
- critical section: 하나의 프로세스 혹은 스레드만 접근할 수 있는 영역입니다.
- exit section: 제어(lock)을 해제하는 등, 더 이상 임계구역에 존재하지 않을 때 알리는 역할을 하는 영역입니다.
- remainder section: 입력, 중요, 종료 세션을 제외한 나머지 코드 부분의 영역입니다.
- 임계구역(Critical Section)은 병렬컴퓨팅에서 둘 이상의 스레드가 동시에 접근해서는 안 되는 공유 자원(자료 구조 또는 장치)을 접근하는 코드의 일부를 말합니다. 임계구역은 지정된 시간이 지난 후 종료되며, 어떤 스레드가 임계구역에 들어가고자 한다면 지정된 시간만큼 대기해야 합니다. 스레드가 공유자원의 배타적인 사용을 보장받기 위해서 임계구역에 들어가거나 나올 때는 세마포어 같은 동기화 매커니즘이 사용됩니다.
- 락lock https://velog.io/@qkrdbqls1001/OS-28.-Locks
- OS에서 mutex lock은 공유 자원을 동시에 하나의 프로세스 또는 스레드가 사용할 수 있도록 동기화하는 기능입니다. mutex는 mutual exclusion의 약자로, 상호 배제라는 의미입니다. 프로세스가 자원에 접근하려면 락(lock)을 획득하고 접근 허용 권한을 얻어야 합니다. 이미 다른 프로세스가 락을 통해 접근 권한을 허용받으면, 다른 프로세스는 자원 사용이 불가합니다. 락을 받은 프로세스가 Unlock을 통해 권한을 반환한 이후에만 다른 프로세스도 공유 자원을 이용할 수 있습니다.
- OS Lock은 코드의 특정 영역을 감싸서 한 순간에 오로지 한 스레드만 이 영역에 접근할 수 있도록 해주는 것입니다. 즉 Mutual Exclusion을 위해 존재합니다.
- 세마포어semaphore세마포어의 종류는 이진형 세마포어와 계수형 세마포어가 있습니다:
- 이진형 세마포어는 0 또는 1을 가질 수 있으며, 1개의 공유 자원을 상호배제합니다.
- 계수형 세마포어는 0과 양의 정수값을 가질 수 있으며, 여러 개의 공유 자원을 상호배제할 수 있습니다.
- 세마포어의 사전적인 의미는 "수기신호"이며, 철도 용어로도 쓰입니다. 여러 대의 기차가 하나의 철로를 공용하여 쓸 때, 오직 하나만 지나갈 수 있도록 하기 위해 양쪽 끝 선에 깃발 표시를 하여 사고가 안나게 하였던 장치가 세마포어입니다.
- 세마포어(Semaphore)는 멀티프로그래밍 환경에서 공유 자원에 대한 접근을 제한하는 방법으로 사용되는 동기화 기법입니다. 에츠허르 데이크스트라가 고안한 세마포어는 두 개의 원자적 함수로 조작되는 정수 변수로, 음이 아닌 값을 가질 수 있습니다. 세마포어는 세마포어 다운(P)과 세마포어 업(V)라는 두 가지 기본 연산을 지원합니다.
Deadlock
데드락(Deadlock)은 운영체제나 소프트웨어의 자원 관리 문제로 인해 두 개 이상의 프로세스나 스레드가 서로 영원히 대기하는 상태를 말합니다. 데드락은 남아있는 자원이 없는 상황에서 자원을 점유한 프로세스들이 희생을 하지 않고 다른 자원을 요청하면서 발생합니다. 예를 들어, 트랜잭션 A와 트랜잭션 B가 모두 상대 트랜잭션의 종료를 기다리고 있게 되어 서로의 블로킹을 영원히 해결할 수 없는 상태가 되면 데드락이 발생합니다.
데드락은 시스템적으로 한정된 자원을 여러 곳에서 사용하려고 할 때 발생할 수 있습니다. 데드락을 방지하기 위해서는 프로세스 실행에 필요한 모든 자원을 한꺼번에 요구하고 허용할 때까지 작업을 보류해야 합니다. 또한, 이미 다른 프로세스에게 할당된 자원이 선점권이 없다고 가정할 때, 높은 우선순위의 프로세스가 해당 자원을 선점할 수 있도록 해야 합니다.
Use after free
Use After Free(UAF)는 메모리 참조에 사용한 포인터를 메모리 해제 후에 적절히 초기화하지 않거나, 해제한 메모리를 초기화하지 않고 다음 청크에 재할당해주면서 발생하는 취약점입니다. UAF는 메모리 참조에 사용한 포인터를 초기화하지 않아서 Dangling pointer라고도 합니다.
UAF는 프로그램 수행 중 이미 free 된 메모리 위치에 접근하려고 할 때 발생하는 temporal memory error의 일종으로, 브라우저 및 커널에서 자주 발견되고 있으며, 익스플로잇 성공률도 다른 취약점에 비해 높아 상당히 위험하다고 알려져 있습니다.
UAF는 다음과 같은 상황에서 발생할 수 있습니다:
- 한번 사용하고 프리를 했다가 동일한 크기의 메모리 할당을 요청할 때
- heap을 병합하거나 분할하는 시간을 절약하고자 free 된 heap을 남겨뒀다가 reuse 할 때
UAF는 메모리 손상 결함의 일종으로, 해커들이 악용할 수 있습니다.
'크래프톤 정글 일지' 카테고리의 다른 글
[PintOS] 이 OS, 핀토스는 어디가 시작점인가 (0) | 2024.05.13 |
---|---|
[PintOS] Project 1 - Threads - Alarm clock (0) | 2024.05.11 |
[PintOS] 카이스트 전산학과 권영진 교수님 OS 특강 (0) | 2024.05.11 |
ubuntu 18.04 환경 세팅하기 (0) | 2024.05.10 |
week7 day1 왜 과정 중간에 뜬금없이 맥북을 사서 사서 고생을 하는가? (0) | 2024.05.10 |