메모리 단편화(Memory Fragmentation)

송해광·2022년 8월 11일
0

메모리 단편화 : RAM에서 메모리의 공간이 작은 조각으로 나뉘어 사용가능한 메모리가 충분히 존재하지만 사용 불가능한 상태

메모리 단편화 종류

내부 단편화

-> 메모리 할당 시 프로세스가 필요한 양보다 더 큰 메모리 할당!(메모리 낭비)

OS가 할당한 메모리 > 실제 프로세스가 활용하는 메모리

ex) os가 10kb를 할당했는데 실제 프로세스는 5kb만 활용하면 내부 단편화가 5kb 발생!!

외부 단편화

-> 메모리가 할당되고 해제되면서 중간중간 조그만 메모리가 생기는데 이런 메모리 때문에 총 메모리 공간은 충분하지만 실제 할당은 불가능한 상태

총 남는 메모리 > 프로세스 필요 메모리 이지만 실제 할당은 불가능!!

ex) 4kb가 할당되고 다음 10kb가 할당된 후에 4kb가 해제되면 4kb 공간이 남게 된다. 이런식으로 남는 공간이 많이 생기게 되면 빈 메모리 공간 중 가장 큰 메모리보다 큰 메모리를 필요로 하는 프로세스는 메모리를 할당 받을 수 없게 된다.

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

1. 페이징 기법

-> 사용하지 않는 프레임을 페이지에 옮기고 필요한 메모리를 페이지 단위로 프레임에 옮기는 방법 ( 프레임 = RAM을 페이지와 같은 크기로 나눈 것, 페이지 = 가상메모리를 같은 크기의 블록으로 나눈 것 )
가상메모리를 같은 크기의 단위로 분할.
페이지와 프레임을 대응시키기 위해 page mapping 과정을 위한 paging table 필요

장점 : 연속적이지 않은 공간 활용 가능하기에 외부 단편화 문제 해결 가능
단점 : 페이지 단위를 꽉 채워 쓰지 않기에 내부 단편화 문제 해결 X ( 페이지 단위를 작게하면 해결 가능하지만 page mapping이 많아지니까 효율이 매우 떨어진다 )

2. 세그멘테이션 기법

-> 가상메모리를 서로 크기가 다른 논리적 단위인 세그먼트로 분할해서 메모리를 할당해 실제 메모리 주소로 변환 ( 각 세그먼트는 연속적인 공간에 저장 )
세그먼트들의 크기가 다르기에 미리 분할이 안 되고 메모리에 적재될 때 빈 공간을 찾아 할당
mapping을 위한 세그먼트 테이블 필요 ( 각 세그먼트별 시작주소와 길이 정보를 포함 )

장점 : 프로세스가 필요한 메모리만큼 할당하기에 내부단편화 해결
단점 : 중간에 프로세스가 메모리를 해제하면 생기는 문제인 외부 단편화 문제 해결 X

3. 메모리 풀

-> 필요한 메모리 공간을 필요한 크기,개수 만큼 사용자가 지정하여 미리 할당받아 놓고 필요할 때마다 사용하고 반납하는 방법

장점 : 미리 공간을 할당하고 쓰고 반납하기 때문에 할당과 해제로 인한 외부 단편화 발생 X
필요한 크기만큼 할당하기에 내부 단편화 발생 X
단점 : 미리 할당해놓고 사용하지 않더라도 계속 할당하기에 메모리 누수 발생

즉, 메모리 단편화로 인한 메모리 낭비량보다 메모리 풀을 만들어도 쓰지 않을 때 메모리 양이 커질 경우에는 사용하지 않아야 한다.
메모리의 할당, 해제가 잦은 경우에 효과적

구현 방법

  • 큰 메모리 블록(페이지)을 힙으로 부터 할당
  • 할당 받은 페이지를 각 객체의 크기의 블록으로 나눔
  • 각 객체를 위한 블록을 순차적으로 링크
  • 이 때 현 시점에서 할당할 블록을 특정 포인터가 가리키게 함
  • 메모리 요청이 생기면 현재 헤더 포인터가 가리키는 블록을 돌려준다.
  • 할당이 일어난 후 헤더 포인터는 할당 직전에 가리키던 블록이 가리키던 블록을 가리킨다.
  • 사용되던 메모리가 해제되어 메모리 풀로 돌아올 경우 헤더 포인터는 그 블록을 가리키고 방금 전까지 헤더 포인터가 가리키던 블록을 돌아온 블록의 다음 포인터가 가리키게 한다.

thdgorhkd97

profile
끝까지 해보고 하는 후회는 반성이 되어 앞을 보게 하지만 끝까지 하지 않고 하는 후회는 미련이 되어 뒤를 보게 한다.

0개의 댓글