본문 바로가기
Computer Science/운영체제

[OS] 메모리 할당 방식이란? (연속적/비연속적 할당 방식, 조각 모음, 페이징과 세그먼트, TLB, 물리적 주소 변환 과정)

by 그적 2024. 2. 2.

목차

  • 메모리 할당 방식이란?
  • 연속적 할당 방식
    • 고정 분할 방식
    • 가변 분할 방식
    • 조각 모음, 외부 단편화 해결 방법
  • 비연속적 할당 방식
    • 페이징
    • 세그먼트
    • 페이징 + 세그먼트 : Paged Segment
  • TLB (Translation Look-aside Buffer)
  • 물리적 주소 변환 과정
  • 연속적 할당 방식과 비연속적 할당 방식 비교
  • 가변 분할 방식과 고정 분할 방식 비교
  • 페이징과 세그먼트 비교

 


1. 메모리 할당 방식이란?

메모리는 물리적 주소, 논리적 주소를 갖고 있다. 프로세스가 메모리에 올라간 실제 주소를 물리적 주소, 프로세스 내에서 사용되는 주소를 논리적 주소라고 칭하는데, 프로세스가 동작하면서 필요한 데이터 및 코드의 주소에 접근하기 위해서 논리적 주소를 물리적 주소로 변환하는 작업이 필요하다. 주소 변환은 매우 자주 발생하므로 MMU라는 하드웨어를 통해 이뤄진다.

 

논리적 주소는 각 프로세스마다 0부터 시작해 연속적으로 할당된다. 프로세스 내부에 데이터들은 필요시 연속적인 순서대로 논리적 주소를 가지고, 이처럼 주소를 연속적으로 쌓아나가기 위해 프로세스 또한 덩어리 채로 메모리에 올리는 것을 연속적 메모리 할당이라고 한다.

 

프로세스를 통째로 메모리에 올리는 것을 "연속적 메모리 할당", 프로세스를 쪼개어 메모리에 올리는 것을 "비연속적 메모리 할당"이라고 생각할 수 있다.

 


2. 연속적 메모리 할당 : 고정 분할 방식

고정 분할 방식은 메모리를 고정된 크기 혹은 서로 다른 크기로 나누고, 프로세스를 메모리에 할당시키는 방식이다. 여기서 중요한 것은 메모리를 "미리 나누어" 두어, 그 공간에 프로세스의 크기를 맞추는 것이다. 만약 프로세스가 필요로 하는 공간이 분할된 공간보다 크다면, 프로세스를 여러 조각으로 나누어 배치한다. (*오버레이 기법이라고 칭한다)

 

(장점)

  • 구현이 쉽다.
  • 메모리 관리가 수월하다.

(단점)

  • 메모리 공간보다 더 작은 공간을 필요로 하는 프로세스일 경우, 파티션 내 공간이 남는 내부 단편화가 발생한다.
  • 실행할 수 있는 프로세스의 수가 정해져 있어, 멀티프로그래밍 수준에 제한을 가진다.

 


3. 연속적 메모리 할당 : 가변 분할 방식

가변 분할 방식은 프로세스의 크기를 고려해 메모리를 할당하기 때문에, 메모리를 분할하는 크기나 개수가 동적으로 변한다. 논리적 주소에서 데이터를 순서대로 쌓아가기 위해 가변적으로 공간을 할당해 주는 것과 동일한 방식이다. 동적으로 변하는 파티션 수를 관리하기 위해 기술적 관리 기법이 필요로 한다.

 

(장점)

  • 필요한 크기만큼 메모리 공간을 차지하기 때문에 내부 단편화가 발생하지 않는다.

(단점)

  • 메모리 공간보다 더 큰 공간을 필요로 하는 프로세스일 경우, 파티션 외 공간이 남는 외부 단편화가 발생한다.

 


4. 조각 모음, 외부 단편화 해결 방법

연속적 메모리 할당에서 가변 분할 방식은 처음 메모리에 쌓이는 프로세스들은 연속적으로 배치되기 때문에, 메모리 공간에 대한 큰 문제가 없다. 하지만 작은 프로세스가 수행을 마치고 빠져나간 공간은 조각으로 남아 쓸모가 없어질 가능성이 크다. 이처럼 프로세스가 사용하고 있는 공간 외 남는 공간을 외부 단편화라고 한다.

 

프로세스가 사용 중인 메모리 공간들을 한쪽으로 몰아서 공간을 확보하는 "조각 모음"으로 외부 단편화를 해결할 수 있다. 하지만 조각 모음을 수행하기 위해서 메모리에 올라간 프로세스들의 작업을 멈추고 주소 값을 변경시키는 과정이 필요로 하기 때문에, 비용이 많이 들고 비효율적이다.

 


5. 비연속적 할당 방식 : 페이징, Paging

페이징에 들어가기에 앞서, 페이지와 프레임이 무엇인지 용어 정리부터 하고 가자.

  • 페이지 : 프로세스(가상 메모리)를 일정한 크기로 나눈 블록
  • 프레임 : 메모리(물리 메모리)를 일정한 크기로 나눈 블록

 

페이징은 프로세스를 쪼개어 페이지로 만들고, 페이지가 어떤 프레임에 저장되어 있는지 사상함으로써 메모리 주소를 관리할 수 있다. 아래 사진을 설명하면, 페이지와 프레임은 각각 동일한 크기로 분할되어 있으며, 페이지 테이블을 거치고 난 후에는 비연속적으로 바뀐 것을 볼 수 있다.

 

페이징의 핵심은 페이지 테이블이다. 논리적 주소를 물리적 주소로 바꾸기 위해 페이지를 페이지 테이블에서 매핑시킨다. 페이징 테이블은 커널에 저장되어 있고, N개의 프로세스가 존재하면 페이지 테이블 또한 N개가 존재한다.

(장점)

  • 외부 단편화 해결
  • 메모리 공유 용이
  • 메모리 할당과 해제가 빠름
  • swap out이 간단함

(단점)

  • 내부 단편화 발생
  • 페이지 테이블은 메모리에 상주해 추가 메모리가 소모됨
  • 페이지 테이블 접근 + 변환 후 물리적 메모리 접근, 두 번의 연산 과정으로 속도가 느림

두 번의 연산으로 느린 속도를 개선하기 위해 TLB를 사용한다.

 


6. 비연속적 할당 방식 : 세그먼트, Segment

세그먼트를 알아보기 전에, 세그먼트란 무엇인지 용어 정리부터 하고 가자.

  • 세그먼트 : 프로그램 실행을 위해 필요한 공간이며, 데이터를 처리하는 명령어들을 위한 프로그램이나 메모리 부분

 

하나의 프로그램이 실행되기 위해서 코드, 데이터, 힙, 스택 영역으로 구분된 메모리가 할당된다. 이때 페이지는 일정한 단위로 영역에 상관없이 메모리를 분할했다면, 세그먼트는 같은 역할을 하는 논리적 단위로 분할한다. 각 세그먼트가 갖는 크기는 제각각이며, 세그먼트 테이블을 이용해 주소의 변환이 일어난다.

 

페이지 테이블에서 페이지는 항상 동일한 크기를 갖기 때문에, 물리적 메모리의 시작 주소만 담고 있었다. 하지만 세그먼트는 각기 다른 크기를 가지기 때문에, 물리적 메모리의 시작 주소와 함께 세그먼트의 크기도 담고 있어야 한다. 이때 물리적 주소는 세그먼트 테이블에서 Base 레지스터와 Limit 레지스터의 합으로 구할 수 있다. Limit 레지스터를 이용해 주소 범위를 벗어나는 참조를 하고 있는지 검증할 수 있다.

 

(장점)

  • 내부 단편화 해결
  • Limit 레지스터를 이용해 올바른 메모리 참조를 검증함
  • 논리적 단위로 구분되기 때문에, 코드 영역에서 필요한 Read-Only 권한을 적용해 데이터가 보호됨

(단점)

  • 외부 단편화 발생
  • 세그먼트 테이블은 메모리에 상주해 추가 메모리가 소모됨
  • 세그먼트 테이블 접근 + 변환 후 물리적 메모리 접근, 두 번의 연산 과정으로 속도가 느림

 


7. 비연속적 할당 방식 : Paged Segment

페이지와 세그먼트의 장점만 취하기 위해 페이지와 세그먼트 방식을 둘 다 채택했다. 최초의 논리적 주소 단위는 세그먼트로 이뤄지고, 각 세그먼트 안에서 페이지를 이용한다. 세그먼트의 검증과 보호 기법을 사용할 수 있고, 페이지를 이용해 외부 단편화를 해결할 수 있다.

 

하지만 세그먼트 테이블, 페이지 테이블을 둘 다 거쳐야 하므로 속도가 떨어진다.

 


8. TLB (Translation Look-aside Unit)

페이지와 세그먼트는 테이블에 접근하는 연산, 주소 변환 후 물리적 메모리에 접근하는 연산, 두 번의 과정을 거친다. CPU가 메모리에서 데이터를 갖고 오는 시간 100ms ~ 400ms 동안 CPU는 아무 일도 하지 않고 있는데, 이것을 개선하기 위해 캐시를 사용해 속도를 개선한다.

 

TLB는 MMU 안에 내장된 캐시로 가장 최근에 참조된 테이블 엔트리를 저장해 둔다. 따라서 논리적 주소에서 물리적 주소로 변환될 때, 메모리에 있는 페이지 테이블 혹은 세그먼트 테이블을 조회하기 전에 TLB에서 물리적 주소를 얻을 수 있는지 확인한다.

 

  • TLB hit : TLB에 페이지의 물리적 주소가 존재함
  • TLB miss : TLB에 페이지의 물리적 주소가 존재하지 않음

페이지 테이블 혹은 세그먼트 테이블에서 물리적 주소를 얻기 위해, 바로 인덱스로 접근하면 된다. 하지만 TLB에서 물리적 주소를 얻기 위해서는 "탐색"하는 과정을 거쳐야 한다. 왜냐하면 TLB에 저장된 테이블 엔트리는 일부분이기 때문이다. 따라서 오히려 TLB miss가 발생했을 때는 탐색 과정 -> 페이지 테이블 접근 -> 물리적 메모리 접근 과정을 거쳐, 오히려 시간이 더 오래 걸린다. TLB에 어떤 페이지 테이블을 저장할지는 가장 중요한 문제이다.

 


9. 주소 변환 과정

  1) CPU가 TLB를 확인한다.

 

  2 - 1) TLB hit일 경우, 바로 주소 변환을 한다. > 끝

 

  2 - 2) TLB miss일 경우, 페이지 테이블을 확인한다. > 3번 이동

 

  3 - 1) 페이지 테이블의 valid bit가 v일 경우, TLB에 페이지를 올리고 바로 주소를 변환한다. > 끝

 

  3 - 2) 페이지 테이블의 valid bit가 i일 경우, Page Fault Exception을 발생시킨다. > 4번 이동

 

  4) Page Fault Exception으로 인해 커널 모드로 진입한다.

 

  5) Page Fault Handler가 실행되며, 페이지의 위치를 확인한다.

 

  6) 페이지를 메모리(빈 프레임)에 로드하고, TLB에 페이지를 올린다.

 

  7) 이전에 수행 중이던 작업을 계속한다.

 


10. 연속적 할당 방식과 비연속적 할당 방식 비교

  연속적 할당 방식 비연속적 할당 방식
방식 프로세스 통째로 프로세스를 쪼개서
종류 고정 분할 방식 / 가변 분할 방식 페이징 / 세그먼트

 


11. 가변 분할 방식과 고정 분할 방식 비교

  고정 분할 방식 가변 분할 방식
  프로세스를 통째로 저장하는 연속적 메모리 할당 방식
분할 단위 프로세스에 크기에 상관 없이 분할 프로세스 크기에 따라 분할
특징 메모리 관리 필요 X 메모리 관리를 위한 기법 필요
장점 쉬운 구현 내부 단편화 개선
단점 외부 단편화, 내부 단편화 외부 단편화

 


12. 페이징과 세그먼트 비교

  페이징 세그먼트
  비연속적 메모리 할당 방식
분할 단위 CPU가 정해주는 페이지 단위 같은 역할을 하는 세그먼트 단위
크기 페이지와 프레임 모두 같은 크기 각기 다른 크기
특징 메모리의 시작 주소가 담긴 페이지 테이블 시작 주소와 세그먼트 크기가 담긴 세그먼트 테이블
장점 1 외부 단편화 해결 내부 단편화 해결
장점 2 쉬운 메모리 공유 검증 기법
장점 3 빠른 속도 보호 기법
단점 내부 단편화 발생 외부 단편화 발생

 

댓글