코드로 우주평화
메모리 단편화를 해결하는 세 가지 방법 본문
배경 키워드
프로세스는 독립된 메모리 공간을 갖는다.
독립된 메모리이기 때문에 다른 프로세스의 메모리 공간에 일반적으로 접근할 수 없다.
운영체제는 운영체제 메모리 영역과 사용자 메모리 영역의 접근에 제약을 받지 않는다.
Swapping은 메모리의 관리를 위해 사용되는 기법이다.
예를 들어 CPU 할당 시간이 끝난 프로세스의 메모리를 HDD 같은 보조 기억장치로 내보내고 다른 프로세스의 메모리를 불러 들일 수 있다.
Swap-in은 주 기억장치(RAM)로 불러오는 과정
Swap-out은 보조 기억장치로 내보내는 과정
메모리 관리 문제
단편화(Fragmentation)는 메모리 적재 및 제거가 반복되면서 프로세스들이 차지하는 메모리 틈 사이에 사용하지 못할 만큼의 작은 자유 공간들을 의미한다.
단편화는 '외부 단편화', '내부 단편화' 두 가지 종류로 나뉜다.
외부 단편화는 물리 메모리(RAM)에서 할당할 수 없는 작은 공간들이 생기는 것을 말한다.
아래 표를 RAM(주 기억 장치의 물리 메모리)이라고 해보자.
프로세스A | free | 프로세스B | free | 프로세스B | free | 프로세스C |
free를 하나로 모으면 다른 프로세스를 할당할 수 있지만 각각 분산되어 있어 프로세스를 불러올 수 없다. 이 분산된 상태를 외부 단편화라 한다.
이를 해결하기 위해 압축을 하기도 한다.
압축이란 외부 단편화를 해소하기 위해 프로세스 사용 공간을 한쪽으로 몰아 자유공간을 확보하는 것이다. 하지만 작업효율이 좋지 않다.
내부 단편화는 프로세스가 사용하는 메모리 공간 안에 남는 부분을 말한다.
아래 표는 프로세스A의 내부 공간이다.
9,998B | 2B |
프로세스 내 메모리 공간이 10,000B일 때, 그 안에서 9,998B 사용하면 2B라는 남는 메모리가 존재하고 이 현상을 내부 단편화라 칭한다.
메모리 단편화를 해결하는 세 가지 방법
첫 번째, Paging(페이징)
페이징이란 프로세스를 일정 크기로 잘게 쪼개어 순서와 상관없이 적재하는 방식이다. 배치 순서는 상관없기 때문에 메모리 공간을 연속된 순서로 차지하지 않고 이 덕분에 외부 단편화 문제를 해결할 수 있다. (페이징은 외부 단편화 해소 방법 중 하나인 압축의 비효율을 보완하기 위해 생긴 방법이다.)
물리 메모리(Frame)안에 프로세스의 논리 메모리(Page)들이 고정된 크기의 블록으로 적재된다. 프로세스를 일정 크기인 페이지로 잘라서 메모리에 적재하는 방식이다.
단점은 내부 단편화 문제의 비중이 늘어난다.
예를 들어 페이지 크기가 1,024B이고 <프로세스 A>가 3,172B의 메모리를 요구한다면 3 개의 페이지 프레임(1,024 * 3 = 3,072) 하고도 100B 가 남기 때문에 총 4 개의 페이지 프레임이 필요하다. 결론적으로 4 번째 페이지 프레임에는 924B(1,024 - 100)의 여유 공간이 남는 내부 단편화 문제가 발생한다.
두 번째, Segmentation(세그멘테이션)
페이징과 다르게 고정된 크기가 아닌 서로 다른 크기의 논리적 단위인 세그먼트(Segment)로 분할하는 방식이다.
예를 들면 우리가 돼지를 잡아서 보관을 한다고 생각해보자. 페이징의 방법을 사용하면 돼지를 모두 같은 단위로 잘라서 보관을 하는 것이다. 반면에 세그먼테이션은 부위별로 다른 크기로 잘라서 보관하는 것이다.
page 처럼 크기가 동일하지 않기 때문에 세그먼트 번호와 시작 주소(base), 세그먼트 크기(limit)를 갖는다.
단점은 서로 다른 크기의 세그먼트들이 메모리에 적재되고 제거되는 일이 반복되다 보면, 작은 조각의 자유 공간들이 많아지면서 외부 단편화 문제가 발생한다.
세 번째, Memory Pool(메모리 풀)
고정된 크기의 블록을 할당하여 메모리 동적 할당을 가능하게 해 준다. memory pool이라고 불리는 동일한 사이즈의 메모리 블록들을 미리 할당해 놓고 프로세스들이 필요할 때마다 사용하고 반납하는 기법이다. (미리 할당하기 때문에 메모리 누수가 있다)
미리 공간을 할당해놓고 사용한 다음 반납하기 때문이 이로 인한 외부 단편화는 발생하지 않는다. 또한 필요한 크기만큼 할당을 하기 때문에 내부 단편화도 존재하지 않는다.
메모리의 할당, 해제가 빈번할 때 메모리 풀 방식이 효과적이다.
추가 학습
+ 동적 메모리 할당이란?
동적 메모리 할당은 프로그램 실행 중에 사용할 메모리 공간을 할당하는 것을 말한다. 사용이 끝나면 운영체제가 쓸 수 있도록 반납하고 다음에 요구가 오면 재 할당을 받을 수 있다. 이것은 프로그램이 실행하는 순간 메모리의 할당이 이루어지는 정적 메모리 할당과 대조적이다.
동적으로 할당된 메모리 공간은 프로그래머가 명시적으로 해제하거나 쓰레기 수집(garbage collection)이 일어나기 전까지 그대로 유지된다. C/C++와 같이 쓰레기 수집이 없는 언어의 경우, 동적 할당을 하면 사용자가 해제하기 전까지는 메모리 공간이 계속 유지된다.
+ 정적 메모리 할당이란?
정적 메모리 할당은 메모리의 크기가 하드 코딩되어 있기 때문에 프로그램이 실행될 때 이미 해당 메모리의 크기가 결정되는 것을 말한다.
장점은 할당을 해제하지 않음으로 인한 메모리 누수와 같은 문제를 신경 쓰지 않아도 된다. 정적 할당된 메모리는 실행 도중에 해제되지 않고, 프로그램이 종료할 때 알아서 운영 체제가 회수한다.
단점은 메모리의 크기가 하드 코딩되어 있어서 나중에 조절할 수 없다. 스택에 할당된 메모리이므로 동적 할당에 비해 할당받을 수 있는 최대 메모리에 제약을 받는다.
레퍼런스
'나는 이렇게 학습한다 > CS' 카테고리의 다른 글
HTTP(Hyper Text Transfer Protocol)를 알아보자 (0) | 2022.03.21 |
---|---|
TCP와 UDP 비교 (0) | 2022.03.20 |
동시성(병행성) vs 병렬성 (0) | 2022.01.16 |
컴퓨터 구조와 운영체제 기본 (2) | 2022.01.16 |
동기 vs 비동기 (0) | 2022.01.15 |