[Back-end] 메모리 관리

Geun·2022년 3월 9일
0

Back-end

목록 보기
19/74

메모리


메인 메모리는 프로그램 실행 시에 필요한 주소, 정보들을 저장하고 필요할 때 사용할 수 있게 만드는 공간이다.
작업을 위해 사용되는 공간이라고 말할 수 있다.

이처럼 메모리는 중요한 작업 공간이다.
한정된 메모리를 다중 프로그래밍 환경에서 이용하기 위해서 여러 프로세스가 함께 메모리를 사용하게 되므로 효율적인 관리를 해야한다.

Swapping

메모리의 관리를 위해 사용되는 기법이다.
메모리에 적재되어 있으나 현재 사용되지는 않고 있는 프로세스를 관리한다.
표준 Swapping 방식으로 round-robin과 같은 스케줄링의 다중 프로그래밍 환경에서 CPU 할당 시간이 끝난 프로세스의 메모리를 backing sotre(하드디스크, ...)로 보내고 다른 프로세스의 메모리를 불러올 수 있다.

이 과정을 swap이라고 부른다.
주 기억장치, RAM으로 불러오는 과정을 swap-in, 보조 기억장치로 내보내는 과정을 swap-out이라고 한다.
swap에는 큰 디스크 전송시간이 필요하기 때문에 현재에는 메모리 공간이 부족할 때 Swaping이 시작된다.

단편화 현상

단편화 현상은 메모리의 공간이 작은 조각으로 나뉘어 사용가능한 메모리는 존재하지만 할당이 불가능한 상태이다.

  • 내부 단편화

프로세스가 사용하는 메모리 공간에 포함된 남는 부분이다.
메모리 분할 자유공간이 10000B, Process A가 9998B를 사용하면 2B만큼 차이가 나게되는데 이 현상을 내부 단편화라고 말한다.

  • 외부 단편화

메모리 공간 중 사용하지 못하게 되는 일부분이다.
물리 메모리(RAM)에서 사이사이 남는 공간들을 합치면 충분한 공간이 되지만, 이것들이 분산되어 있을 때 발생한다.

  • 압축

외부 단편화를 해소하기 위해 프로세스가 사용하는 공간들을 한쪽으로 몰아 자유공간을 확보하는 방법이다.
다만, 작업효율이 좋지 않다.



  • round-robin : 간단히 말해서.. 프로세스들 사이에 우선순위를 두지 않고 순서대로 시간단위로 CPU를 할당하는 방식. 문맥전환의 오버헤드가 큰 반면에 응답시간이 짧아지는 장점이 있어 실시간 시스템에 유리하다.

메모리 관리 방법

메모리 관리 방법에서는 단편화 현상을 줄이고 적절한 swap을 통해 효율적으로 메모리를 관리하는 방법을 소개한다.

1. 연속 메모리 할당

프로세스를 메모리에 연속적으로 할당하는 기법이다.
할당과 제거를 반복하다보면 Scattered Hole들이 생겨나고 이로 인해 외부 단편화가 발생한다.

  • 연속 메모리 할당에서 외부 단편화를 줄이기 위한 할당방식

    • 최초 적합(First fit)
      가장 처음 만나는 빈 메모리 공간에 프로세스를 할당한다.
      속도가 빠르다.

    • 최적 적합(Best fit)
      빈 메모리 공간의 크기와 프로세스의 크기 차이가 가장 적은 곳에 프로세스를 할당한다.

    • 최악 적합(Worst fit)
      빈 메모리 공간의 크기와 프로세스의 크기가 가장 큰 곳에 프로세스를 할당한다.
      이렇게 생긴 빈 메모리 공간에 다른 프로세스를 할당할 수 있을 것이라는 가정에 기인한다.


2. 페이징 (Paging)

페이징은 가상메모리를 사용, 외부 단편화는 해결하지만 내부 단편화는 존재한다.
다음 그림은 페이징에서의 스와핑을 설명한다.

하나의 프로세스가 사용하는 메모리 공간이 연속적이어야만 하는 제약을 없앨 수 있는 메모리 관리 방법이다.
외부 단편화와 압축 작업을 해소하기 위해 생겨난 방법이다.
물리 메모리는 Frame이라는 고정 크기로 분리되어 있고, 논리 메모리는 페이지라 불리는 고정 크기의 블록으로 분리된다.

페이징 기법을 사용하면 논리 메모리가 물리 메모리에 저장될 때 연속되어 저장될 필요가 없고, 물리 메모리의 남는 프레임이 적절히 배치됨으로 외부 단편화를 해결할 수 있는 큰 장점이 있다.

당연히 단점도 있다.
내부 단편화 문제가 늘어난다.
예를들어 페이지의 크기가 1024B이고, 프로세스 A가 3172B의 메모리를 요구하면 1024 * 3 = 3072B이다.
100B가 남게되는데 이것 때문에 4번째 페이지 프레임이 필요하다.
4번째 페이지 프레임에는 1024 - 100 = 924B만큼의 여유공간이 남게 되는 내부 단편화 문제가 발생한다.


3. 세그멘테이션 (Segmentation)

세그멘테이션은 가상메모리를 사용, 내부 단편화를 해결하지만 외부 단편화는 존재한다.
페이징에서처럼 논리 메모리와 물리 메모리를 같은 크기의 블록이 아니라 서로 다른 크기의 논리적 단위인 세그먼트로 분할한다.
사용자가 두 개의 주소로 지정한다. (세그먼트 번호 + 변위)
세그먼트 테이블에는 각 세그먼트의 기준(세그먼트의 시작 물리주소)와 한계(세그먼트의 길이)를 저장한다.

이 방법도 단점이 있다.
서로 다른 크기의 세그먼트들이 메모리에 적재, 제거되는 일이 반복되면 자유 공간들이 많은 수의 작은 조각들로 나누어져 못 쓰게 될 수도 있다. (외부 단편화의 문제)


4. 메모리 풀 (Memory Pool)

메모리 풀은 필요한 메모리 공간을 필요한 크기, 개수만큼 사용자가 직접 지정하여 미리 할당 받고, 필요할 때 사용하고 반납을 하는 방법이다.

메모리 풀은 메모리의 할당, 해제가 잦은 경우 사용하면 효과적이다.
메모리 풀은 미리 할당해놓기 때문에 사용하지 않는 순간에도 계속 할당해 놓게된다. 따라서 메모리 누수가 있는 방법이다.

메모리 풀 없이 동적할당과 해제를 반복하면 메모리의 알고리즘에 의한 위치에 할당과 해제가 반복되어 단편화를 일으킬 수 있다.
하지만 미리 공간을 할당하고 가져다 쓴 뒤에 반납하기 때문에 할당과 해제로 인한 외부 단편화가 발생하지 않는다.
또 필요한 크기만큼 할당을 받기 때문에 내부 단편화가 생기지 않는다.

메모리 풀에도 단점이 있다.
메모리 단편화로 인한 메모리 낭비량보다, 메모리 풀을 만들었지만 쓰지 않았을 때의 메모리 양이 커질 경우라면 사용하지 않아야 한다.


참고자료

https://technote-mezza.tistory.com/92
https://www.crocus.co.kr/1376
https://luv-n-interest.tistory.com/478
https://jwprogramming.tistory.com/17
https://velog.io/@sawol/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC
https://zetawiki.com/wiki/%EB%A9%94%EB%AA%A8%EB%A6%AC%EB%B0%B0%EC%B9%98%EA%B8%B0%EB%B2%95,_%EC%B5%9C%EC%B4%88%EC%A0%81%ED%95%A9,_%EC%B5%9C%EC%A0%81%EC%A0%81%ED%95%A9,_%EC%B5%9C%EC%95%85%EC%A0%81%ED%95%A9

0개의 댓글