728x90
반응형

메모리를 공부하면서 메모리 단편화에 대해서 알게 되었다. 그래서 추가적으로 메모리 단편화가 무엇인지 정리해보려고 한다.

 

메모리 단편화가 무엇인가

RAM 에서 메모리의 공간이 작은 조각으로 나누어져 사용가능한 메모리가 충분히 존재하지만 할당이 불가능한 상태를 메모리 단편화라고 한다.

 

메모리 단편화는 2가지로 구분할 수 있다.

  • 내부 단편화 (Internal Fragmentation)
  • 외부 단편화 (External Fragmentation)

 

 

내부 단편화 (Internal Fragmentation)

내부 단편화란 메모리를 할당할 때 OS 에서 할당한 메모리 공간보다 프로세스가 더 적은 공간을 사용해서 낭비되는 상태를 말한다.

예를 들어, 10MB 의 메모리 크기가 주어졌는데 실제 프로세스는 5MB 만 사용하는 경우를 말한다.
그럼 내부 단편화가 5MB 가 생기게 된다.

 

외부 단편화 (External Fragmentation)

외부 단편화란 메모리 할당 및 해제 작업의 반복으로 인해 메모리가 중간 중간에 존재하게 된다.
이 때, 중간에 생긴 사용하지 않는 메모리가 많이 존재해서 총 메모리 공간은 충분하지만 실제로 할당이 불가능한 상태를 말한다.

예를 들어, 10MB 의 메모리 크기가 필요한 프로세스가 있을 때 중간에 사용하지 않는 메모리가 5MB, 5MB 가 있어도 사용할 수 없다.

 

 

메모리 단편화가 일어나게 되면 어떤 문제가 발생할까

메모리 공간은 충분하지만 실제 사용이 불가능해진다. 또한 실제 사용 가능한 공간이 줄어들어 시스템 성능 저하가 발생할 수 있다. 성능 저하가 발생하는 이유는 사용 가능한 공간을 찾거나 잦은 페이지 교체, 스왑 등의 이유를 들 수 있다.

 

 

그럼 메모리 단편화가 일어나지 않도록 어떻게 해결할 수 있을까?
찾아보고 했지만 아직 제대로 이해하지 못해서 간단하게 해결 방법에 대해서 정리해보고 나중에 조금 더 자세하게 정리해봐야겠다.

 

메모리 파편화 해결 방법

페이징 기법 (Paging)

페이징이란 가상 메모리와 물리 메모리 공간을 고정 크기의 작은 블록으로 나눈다.
가상 메모리 공간의 블록을 페이지라고 하고 물리적인 주소의 공간의 불록을 프레임이라고 한다.

이때, 각 페이지의 블록을 프레임의 블록에 하나씩 맵핑할 수 있어 대량의 메모리도 연속되지 않은 물리 프레임으로 나눌 수 있다.

 

정리해보면 가상 메모리를 블록 단위로 나누어 프레임으로 맵핑하고 나누어진 프레임을 물리적인 메모리에 할당하게 된다. 이 때, 맵핑 정보는 테이블로 관리하게 된다. 따라서, 큰 사이즈의 메모리를 잘게 나누어 할당할 수 있기 때문에 연속적이지 않은 공간을 활용할 수 있게 되고 외부 단편화 문제를 해결할 수 있다.
다만, 너무 작게 나누게 되면 각 블록을 맵핑하는 과정에서 많은 시간이 소요되기 때문에 성능 저하가 일어나게 된다.
그리고 고정된 크기의 블록으로 나누어서 저장하기 때문에 내부 단편화가 발생할 수 있다.

 

아래의 사진과 같이 가상 메모리를 작게 나누어서 프레임과 맵핑하고 작게 할당된 메모리를 물리적인 메모리에 할당하는 것을 확인할 수 있다.

 

세그먼테이션 기법 (Segmentation)

세그먼테이션은 가상 메모리를 서로 크기가 다른 논리적 단위인 세그먼트로 분할해서 물리적인 메모리에 할당하여 실제 메모리 주소로 변환한다.
페이징은 일정한 크기의 블록으로 나누어 메모리를 할당했는데
세그먼테이션은 세그먼트라는 단위로 논리적으로 나누어 메모리를 할당한다. 이때 세그먼트의 단위는 함수가 될 수도 있고 Code, Data, Heap, Stack 등의 논리적인 단위 일수도 있다. 페이징과 마찬가지로 이러한 세그먼트 정보를 테이블로 관리하게 된다.

 

페이징과 다른 점은 고정된 크기가 아닌 논리적인 단위에 맞게 크기가 할당되어 일정하지 않다는 점이다.
따라서 내부 단편화 문제를 해결할 수 있다.
하지만 중간에 메모리가 해제된다면 외부 단편화가 발생할 수 있다.

 

출처 - https://wansook0316.github.io/cs/os/2020/04/06/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%A0%95%EB%A6%AC-15-%EC%84%B8%EA%B7%B8%EB%A9%98%ED%85%8C%EC%9D%B4%EC%85%98.html

 

추가로 페이징과 세그먼테이션 중에서 어떤 방법을 통해 메모리 파편화를 해결할 수 있는지에 대해서 많은 글들이 있었는데
현재 대부분은 페이징 기법을 더 많이 사용한다고 한다.
그 이유는 세그먼테이션의 세그먼트 크기가 일정하지 않고 다양하기 때문이다. 세그먼트의 크기가 다양하기 때문에 여러 hole 이 발생하게 되고 외부 단편화가 발생해 메모리 낭비가 크기 때문이다.

 

 

 

참고 사이트

https://developer-mac.tistory.com/21

 

[운영체제]메모리 단편화 (Fragmentation)

메모리 단편화 (Fragmentation) RAM에서 메모리의 공간이 작은 조각으로 나뉘어져 사용 가능한 메모리가 충분히 존재하지만 할당이 불가능한 상태 내부 단편화 (Internal Fragmentation)-> Segmentation (Variable s

developer-mac.tistory.com

https://velog.io/@hanhs4544/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%8B%A8%ED%8E%B8%ED%99%94Memory-Fragmentation

 

메모리 단편화(Memory Fragmentation)

Internal메모리를 할당할 때 프로세스가 필요한 양보다 더 큰 메모리가 할당되어 메모리 공간이 낭비되는 상황예를 들어 메모장을 틀었는데 OS가 10Kb 할당, 하지만 7kb만 사용하고 있을 때 필요 이

velog.io

https://yongj.in/rust%20os/rust-os-intoduction-to-paging/

 

[Rust OS] 페이징 개론

운영 체제에서 메모리 관리를 할 때 흔히 사용되는 페이징을 알아본다.

yongj.in

https://wansook0316.github.io/cs/os/2020/04/06/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%A0%95%EB%A6%AC-15-%EC%84%B8%EA%B7%B8%EB%A9%98%ED%85%8C%EC%9D%B4%EC%85%98.html

 

[운영체제 정리] 15: 세그멘테이션 (Segmentation) | 완숙의 에그머니🍳

Be On My Wave 🌊 | 뚜렷한 목표, 치밀한 계획, 우직한 실천

wansook0316.github.io

 

728x90
반응형

'컴퓨터 과학 > 개념정리' 카테고리의 다른 글

메모리 구조 (Memory Structure)  (0) 2024.02.18
프로그램과 프로세스의 차이  (0) 2024.02.11
오프셋, offset  (0) 2023.02.28
복사했습니다!