문제:
메모리 병합(Memory Coalescing)과 압축(Compaction)의 차이점에 대해 설명하시오.
답변:
메모리 병합(Memory Coalescing)과 압축(Compaction)은 둘 다 메모리의 단편화(fragmentation) 문제를 해결하는 방법으로, 메모리 공간을 효율적으로 사용하도록 설계되었습니다. 그러나 두 기술의 적용 방법과 작동 방식에서 차이가 있습니다.
메모리 병합(Memory Coalescing):
• 개념: 메모리 병합은 인접한 빈 메모리 블록(free blocks)을 하나의 큰 빈 블록으로 합치는 작업입니다. 이는 주로 동적 메모리 할당 시스템에서 메모리 해제 시 발생하는 외부 단편화(external fragmentation)를 줄이는 데 사용됩니다.
• 작동 방식: 메모리 블록이 해제될 때마다 인접한 빈 블록과 확인하여 바로 병합하거나, 특정 시점에 병합하는 방식(즉시 병합 또는 지연 병합)으로 작동합니다.
• 적용 대상: 주로 인접한 빈 블록에 한정되어 적용되며, 분산된 메모리 블록을 한 곳으로 모으는 작업은 수행하지 않습니다.
• 장단점: 병합은 인접한 빈 블록에만 적용되므로 메모리 이동이 필요 없어 성능 오버헤드가 적은 장점이 있지만, 분산된 빈 공간들을 모두 활용하지 못한다는 단점이 있습니다.
압축(Compaction):
• 개념: 압축은 메모리 내에서 분산된 빈 블록을 하나로 모으기 위해 데이터를 이동하여 연속된 빈 메모리 공간을 만드는 작업입니다. 메모리 압축은 외부 단편화를 크게 줄이고, 연속된 큰 블록을 생성하여 더 큰 데이터를 할당할 수 있도록 합니다.
• 작동 방식: 메모리 압축을 수행할 때, 활성 메모리 블록(allocated blocks)을 이동하여 빈 블록들이 한 곳에 모이도록 합니다. 이를 위해 이동 대상 블록의 포인터나 참조를 업데이트해야 합니다.
• 적용 대상: 전체 메모리 공간에 걸쳐 분산된 빈 블록을 하나로 모으므로, 분산된 빈 공간까지 모두 사용할 수 있습니다.
• 장단점: 압축은 메모리의 단편화 문제를 해결할 수 있지만, 메모리 이동에 따른 오버헤드가 크고 포인터를 수정해야 하는 복잡성이 존재합니다.
차이점 요약:
• 작동 방식: 병합은 인접한 빈 블록만을 합치는 데 반해, 압축은 분산된 빈 블록을 모두 모으기 위해 활성 메모리 블록까지 이동합니다.
• 적용 범위: 병합은 인접한 빈 블록에만 국한되며, 압축은 메모리 전체에 걸쳐 적용할 수 있습니다.
• 성능 오버헤드: 병합은 오버헤드가 적지만, 압축은 메모리 이동과 포인터 수정으로 인해 오버헤드가 큽니다.
• 사용 목적: 병합은 상대적으로 작은 메모리 단편화를 줄이는 데 효과적이며, 압축은 대규모 메모리 단편화를 해결하기 위한 근본적인 해결책으로 사용됩니다.
이렇게 메모리 병합과 압축은 각각 특정 상황에 맞게 선택하여 사용되며, 메모리 단편화 문제를 해결하는 보완적 접근법이라 할 수 있습니다.