오늘의 질문
연속 메모리 할당 기법 (Continuous Memory Allocation)
운영체제가 프로세스에 연속적인 메모리 공간을 할당하는 방법을 말한다. 연속 메모리 할당 기법을 사용하면 하나의 프로세스는 메모리 주소 공간에서 연속적으로 존재하게 된다. ‘고정분할 할당 방식’ 과 ‘가변분할 할당 방식’ 으로 나눌 수 있다.
고정분할 할당 (Fixed-Partition Allocation)
메모리가 고정된 크기의 분할로 나뉘어서 각 분할에 하나의 프로세스가 할당된다. 이 방식에서는 메모리가 고정된 크기의 여러 분할로 나뉘는데, 분할의 크기는 시스템이 부팅될 때 결정되며, 실행 중에는 크기나 수를 변경할 수 없다.
메모리 관리가 상대적으로 단순하다는 장점이 있다.
프로세스의 크기가 고정된 분할 메모리 크기보다 클 경우 해당 프로세스는 메모리에 적재될 수 없어 유연성이 부족하다.
가변분할 할당 (Dynamic-Partition Allocation)
메모리가 프로세스의 크기와 수요에 따라 동적으로 분할된다. 다시 말해 프로세스가 메모리를 요청하면, 시스템은 프로세스의 크기에 맞게 메모리 공간을 할당한다. 프로세스가 종료되고 메모리가 회수되면 이 공간은 다시 메모리 풀에 반환된다.
고정분할 할당 방식과 다르게 유연성이 향상된다.
다만 시간이 지남에 따라 메모리의 할당과 회수 과정에서 작은 메모리 블록이 여러 곳에 분산될 수 있다. 이는 외부 단편화를 발생시키며, 조각조각으로는 충분한 메모리가 있음에도 불구하고 큰 메모리 요청이 들어오면 만족시키지 못할 수 있다.
외부 단편화 (External Fragmentation)
프로세스를 할당하기 어려울 만큼 작은 메모리 공간들로 인해서 메모리가 낭비되는 현상을 말한다. 예를 들어 신규 프로세스가 사용할 메모리 공간이 300MB 라고 가정했을 때, 흩어져 있는 빈 공간들의 합은 300MB 가 넘지만 연속적인 300MB 는 존재하지 않아 프로세스에 메모리를 할당하지 못하는 상황이 발생할 수 있다.
내부 단편화 (Internal Fragmentation)
고정분할 할당 방식을 사용할 때 발생할 수 있는 문제라 볼 수 있다. 메모리를 할당할 때 프로세스가 필요한 양보다 더 큰 메모리가 할당되는 상황에서 메모리 공간이 낭비되는 현상을 말한다. 예를 들어 신규 프로세스가 사용할 메모리 공간이 300MV 이지만 실제로 할당된 공간은 500MB 인 경우, 200MB 가 낭비되어 버린다.
😲 그래서 왜? 연속 메모리 할당 기법을 사용하는 것인가?
빠른 접근 속도
연속 메모리 할당은 데이터를 연속적인 공간에 배치하기 때문에 CPU 가 메모리에 접근할 때 속도를 높일 수 있다. (하드웨어는 연속된 주소를 처리하는 속도가 더 빠르다)
단순한 관리
메모리 할당이 연속적으로 이루어지면 관리가 상대적으로 간단해진다. 메모리를 할당할 때 한 번에 큰 덩어리를 할당하고, 사용 후 해제하는 방식이어서 시스템이 더 간단하고 효율적으로 동작할 수 있다.
분할 문제 방지
연속 메모리 할당 방식은 메모리 분할 (Fragmentation) 문제를 어느 정도 피할 수 있다. 메모리가 여러 작은 구간으로 나뉘어 관리되는 비연속 할당 방식에서는 메모리의 일부가 사용되지 않고 낭비되는 경우가 많지만, 연속적으로 할당하면 이런 낭비가 줄어든다.
메모리 연속 할당 방식의 구현
이러한 메모리 연속 할당 방식은 보통 운영체제 수준의 메모리 관리 기능에 의해 구현되며, 보통의 백엔드 개발(프레임워크) 에서 이를 직접 다루기 보다는 운영체제에서 제공하는 메모리 할당 기능을 사용하는 방식으로 구현된다.
예를 들어 C 언어에서는 malloc() 같은 함수로 메모리 연속 할당을 직접 제어할 수 있지만, Java 와 같은 고급 언어에서는 메모리 관리가 JVM 에 의해 자동으로 이루어진다. (JVM은 GC를 통해 메모리 할당과 해제를 자동으로 처리한다.)
🔖 참고자료