메모리 단편화 (Memory Fragmentation)

RAM에서 메모리 공간이 작은 조각으로 나눠져 사용 가능한 메모리가 충분히 존재하지만 할당(사용)이 불가능한 상태로 내부 단편화, 외부 단편화 2가지로 구분된다.

 

조각 모음 사진

 

내부 단편화

메모리 할당시 프로세스가 필요한 양보다 더 큰 메모리가 할당되어 메모리 공간이 낭비되는 현상 (메모리 과소비로 메모리 크기가 10KB인데 프로세스의 사이즈가 6KB인경우 4KB의 내부단편화가 발생했다 표현)

 

외부 단편화

메모리 할당, 해제를 반복할경우 중간마다 작은 메모리가 생성되는데 존재하여 총 공간은 충분하지만 실제로 할당은 불가능한 상황. (여유공간이 여러조각으로 나뉜 상황)

외부 단편화(여유 공간은 9K지만 7K가 들어갈곳이 없다 -> 테트리스할때 중간마다 구멍이 뚫린걸 생각하면 된다.)

 

프로세스가 차지하는 물리적 공간이 비연속적으로 허용되도록 하는 메모리 관리기법을 의미힌다.

외부단편화가 발생하지 않으며 별도의 compaction과정이 불필요하다


메모리 파편화 문제 해결방법

1. 페이지 기법 (Paging)

2. 세그멘테이션 기법 (Segmentation)

3. 메모리 풀(Memory Pool)

 

페이징

물리적 메모리를 고정된 크기의 프레임으로 나누고 논리적 메모리를 동일크기의 페이지로 나누는 것이다.

페이지 - 가상메모리를 같은 크기의 블록으로 나눈것

프레임 - RAM을 페이지와 같은 크기로 나눈것

 

미사용 프레임을 페이지로 옮기고 필요한 메모리를 페이지 단위로 프레임에 옮기는것

 

CPU에 의해 생성된 주소는 페이지 번호 및 페이지 간격으로 나뉘며 각 페이지 번호는 테이블의 인덱스로 사용된다.

페이지 테이블은 각 물리적 메모리의 페이지 Base주소를 저장하고 있다.

 

 

보조 기억장치를 이용한 가상 메모리를 동일한 크기의 블록으로 분할

비 연속적인 공간 활용이 가능하기에 외부 단편화 해결

각 객체별로 크기가 다른데 페이지의 크기는 일정하기에 내부 단편화 발생

 

세그멘테이션 기법

가상 메모리를 서로 크기가 다른 세그먼트로 분할하여 실제 메모리 주소(연속적인 공간)로 변환

세그먼트의 크기가 다르기에 미리 분할이 안되며 메모리에 적재될때 빈 공간을 찾아 할당

mapping을 위한 세그먼트 테이블이 필요(각 세그먼트별 시작주소 및 길이를 포함)

 

중간에 프로세스를 해제할경우 앞의 빈공간에 할당되는게 아닌 바로 뒤의 연속된 공간에 할당되기에 외부 단편화 발생 

크기가 다른 세그먼트로 분할되기에 적재될때 빈공간을 찾아 들어가기에 내부 단편화 해결

 

 

메모리풀

필요한 메모리 공간을 필요한 크기, 개수만큼 사용자가 지정해 미리 할당, 필요할때마다 사용하고 반납(미리 선점해놔 단편화가 발생하지 않는다)

메모리풀 없이 동적할당, 해제를 반복할경우 메모리의 랜덤위치에서 작업이 진행되어 단편화가 발생한다

 

장점 : 미리 공간을 할당, 사용후 반납하기에 단편화 문제 미발생

단점 : 미리 할당하기에 미사용 하더라도 계속 할당하기에 메모리 누수 발생

 

메모리 누수 - 할당됐던 메모리가 더 이상 사용되지 않는 시점에서도 반환되지 않는 현상

 

큰 메모리블록(페이지)를 힙에서 할당

각 페이지를 객체의 크기별 블록으로 분할

각 객체를 위한 블록을 순차적으로 링크

현 시점에서 할당한 블록을 특정 포인터가 가리킴

메모리 요청시 헤더 포인터가 가리키는 블록을 반환

할당이 일어난 후 헤더 포인터는 할당 직전에 가리키던 블록이 가리키던 블록을 가리킨다.사용되던 메모리가 해제되어 메모리 풀로 돌아올 경우 헤더 포인터는 그 블록을 가리키고 방금 전까지 헤더 포인터가 가리키던 블록을 돌아온 블록의 다음 포인터가 가리키게 한다.

 

 

'CS' 카테고리의 다른 글

개발방법론  (0) 2023.05.02
인라이닝  (0) 2023.04.20
캐시에 대하여  (0) 2023.04.07
교착상태(Dead Lock)  (0) 2023.04.02
시스템콜  (0) 2023.04.01

+ Recent posts