메모리 단편화가 뭐지?
먼저 컴퓨터를 공부하는 사람이라면 주기억장치에 대해 들어본 적 있죠? 주기억장치는 CPU가 직접 접근하여 처리할 수 있는 고속의 기억장치 (Memory) 로, 현재 수행되는 프로그램과 데이터를 저장하고 있습니다. 종류로는 ROM과 RAM이 있죠.
이 주기억장치에서 메모리의 공간이 작은 조각으로 나뉘어져 사용가능한 메모리가 충분히 존재하지만 할당이 불가능한 상태를 메모리 단편화가 발생했다고 합니다. 그리고 이 메모리 단편화는 내부 단편화와 외부 단편화로 구분할 수 있습니다.
- 내부 단편화 (Internal Fragmentation)
- 메모리를 할당할 때, 프로세스가 필요로 하는 크기보다 더 큰 메모리가 할당되어서 프로세스에서 사용하는 메모리 공간이 낭비되는 상황을 말합니다.
- 예를 들어, 메모장을 실행시켰는데 OS가 4kb를 할당해줬습니다. 그런데 사실 저는 1kb만큼만 사용하고 있다면, 3kb만큼의 메모리가 낭비되고 있죠? 이렇게 필요 이상으로 프로세스가 메모리를 할당받았으므로 내부 단편화가 3kb 생겼다고 할 수 있습니다.
- 외부 단편화 (External Fragmentation)
- 메모리가 할당되고 해제되는 작업이 반복되면서 중간중간 작은 메모리가 존재하게 됩니다. 이때 중간중간 생긴 사용하지 않는 메모리가 발생하면서 메모리의 총 공간은 충분하지만 실제로는 할당할 수 없는 상황을 말합니다.
- 예를 들어, 처음에 어떤 프로그램을 실행하는데 8mb짜리 프로세스가 할당되었습니다. 그리고 나서 다른 프로그램을 실행하는데 16mb짜리 프로세스가 할당되었습니다. 그리고 처음 실행했던 프로세스를 종료시키고 나면 메모리 처음 주소부터 8mb만큼의 공간이 생기겠죠? 이런 식으로 중간중간 비어있는 메모리 공간이 생기면서 메모리 공간은 여유롭지만 막상 막 10mb짜리 프로세스가 할당받을 공간은 없는 그런 상황에 외부 단편화가 생겼다고 할 수 있습니다.
그럼 어떻게 메모리를 관리할 수 있는지 알아보겠습니다.
1. 페이징 (Paging) - 가상메모리 사용, 외부 단편화 해결, 내부 단편화 존재
먼저 페이지(Page)는 보조기억장치를 이용한 가상메모리를 같은 크기의 블록으로 나눈 것을 말합니다. 그리고 주기억장치를 페이지와 같은 크기로 나눈 것을 프레임(Frame)이라고 하죠.
페이징 기법은 사용하지 않는 프레임을 페이지에 옮기고, 필요한 메모리를 페이지 단위로 프레임에 옮기는 기법입니다. 페이징 기법을 사용하면 연속적이지 않은 공간도 활용할 수 있기 때문에 외부 단편화 문제를 해결할 수 있습니다. 하지만 페이지 단위에 알맞게 꽉채워 쓰지 않을 때도 있을 수 있기 때문에 내부 단편화 문제는 여전히 존재합니다. 페이지 단위를 작게 하면 내부 단편화 문제도 해결할 수 있겠지만, 대신 Page Mapping 과정이 많아지기 때문에 오히려 효율이 떨어질 수 있습니다. 그래서 페이지 단위도 적절하게 나눌 수 있어야 합니다.
2. 세그멘테이션 (Segmentation) - 가상메모리 사용, 내부 단편화 해결, 외부 단편화 존재
페이징 기법에서 가상메모리를 같은 크기의 단위로 분할했다면, 세그멘테이션 기법에서는 가상메모리를 서로 크기가 다른 논리적 단위인 세그먼트로 분할하고 메모리를 할당하여 실제 메모리 주소로 변환을 하게 됩니다.
각 세그먼트는 연속적인 공간에 저장되어 있고, 세그먼트들의 크기가 다르기 때문에 미리 분할해 둘 수 없고 메모리에 적재될 때 빈 공간을 찾아 할당하는 기법입니다. 프로세스가 필요한 메모리만큼 할당해주기 때문에 내부 단편화 문제는 일어나지 않지만, 중간에 프로세스가 메모리를 해제하면 생기는 외부 단편화 문제는 여전히 존재합니다.
3. 메모리 풀 (Memory Pool) - 외부 단편화 해결, 내부 단편화 해결
메모리 풀은 동적 할당과 비슷한 개념이지만, 필요한 메모리 공간을 필요한 크기, 개수만큼 사용자가 직접 지정하여 미리 할당받아놓고 필요할 때마다 사용하고 반납하는 기법입니다. 메모리 풀 없이 동적할당과 해제를 반복하면 메모리의 랜덤한(실제로는 알고리즘에 의한) 위치에 할당과 해제가 반복되면서 단편화를 일으킬 수 있지만, 미리 공간을 할당해놓고 가져다 쓰고 반납하기 때문에 할당과 해제로 인한 외부 단편화가 발생하지 않습니다. 그리고 필요한 크기만큼 할당을 해놓기 때문에 내부 단편화 또한 생기지 않습니다.
하지만 메모리 단편화로 인한 메모리 낭비량보다, 메모리 풀을 만들었지만 쓰지 않았을 때 그 할당된 메모리의 낭비량이 더 커질 경우 사용하지 않아야 합니다. 즉, 메모리 풀은 메모리의 할당과 해제가 잦은 경우 사용하면 효율적이지만 미리 할당해놓고 사용하지 않는 순간에도 계속 할당되어 있기 때문에 메모리 누수가 있을 수 있는 방식입니다.
Reference
'스터디 > CS & Network' 카테고리의 다른 글
프로세스 (Process) (0) | 2021.05.19 |
---|---|
메모리 구조에서 Stack과 Queue의 역할 (0) | 2021.04.14 |
OSI 7계층이 뭐지?? (0) | 2021.02.07 |
RESTful API란? (0) | 2021.01.28 |
TCP 동작 방식 (3-way handshake, 4-way handshake) (0) | 2021.01.08 |
댓글