본문 바로가기
Study/운영체제

[운영체제] 가상 메모리 (1) - 기본 개념과 구현 방식

by Lpromotion 2024. 11. 24.
JSCODE 모의면접 스터디
운영체제 6기 5주차
목차
 

1. 메모리 주소 지정 방식

데이터를 저장하거나 불러올 때, 데이터가 위치한 메모리의 주소를 지정하는 것이다.

주소 지정 방식에는 절대 주소 지정과 상대 주소 지정이 있다.

 

물리 주소와 논리 주소(가상 주소)

현대 운영체제는 메모리 관리를 위해 물리 주소와 논리 주소 개념을 사용한다.

https://lexine.tistory.com/56

  • 물리 주소: 메모리 하드웨어에서 데이터가 실제로 저장된 위치를 가리키는 주소이다.
  • 논리 주소(가상 주소): CPU와 실행 중인 프로그램이 사용하는 가상의 메모리 주소로, 각 프로세스마다 독립적인 0번지부터 시작되는 주소이다.
  • MMU(Memory Management Unit): 프로세스의 논리 주소를 물리 주소로 자동 변환하여 실제 메모리에 접근한다.

 

절대 주소 지정

데이터가 위치한 메모리의 실제 물리적 주소를 직접 사용하는 방식이다.

예를 들어 데이터가 100번지에 저장되어 있다면, 100이라는 실제 주소값을 그대로 사용한다.

 

장점

  • 주소가 명확하고 단순
  • 주소 변환 과정이 불필요해 실행 속도가 빠름
  • 직접적인 메모리 접근이 가능

단점

  • 프로그램 크기 변경 시 재컴파일이 필요
  • 메모리 공간의 낭비 발생 가능
  • 프로그램의 재배치가 어려워 유연성 떨어짐

 

상대 주소 지정

기준점(베이스 레지스터)으로부터 데이터가 위치한 메모리의 상대적인 위치를 사용하는 방식이다. 

실제 메모리 주소는 기준 주소에 상대 주소를 더해 계산하며, 이를 통해 프로그램의 재배치가 가능하다.

 

장점

  • 프로그램의 재배치가 용이
  • 메모리 공간을 효율적으로 활용
  • 다중 프로그래밍 환경에 적합
  • 메모리 보호가 용이

단점

  • 주소 변환 과정이 필요해 실행 속도가 상대적으로 느림
  • 추가적인 하드웨어(베이스 레지스터)가 필요

 

 

2. 메모리 관리

메모리 관리는 각 프로세스가 독립된 메모리 공간을 가지고, 다른 프로세스의 메모리 공간에 접근할 수 없도록 보호하며, 멀티프로그래밍 환경에서 한정된 메모리를 효율적으로 사용하기 위해 필요하다.

 

메모리 관리 기법 (스와핑, 메모리 분할)

1. 스와핑 (Swapping)

스와핑은 메모리에 적재된 프로세스 중 현재 실행되지 않는 프로세스를 보조기억장치로 내보내고, 필요한 프로세스를 메모리로 불러오는 메모리 관리 기법이다.

프로세스의 우선순위에 따라 스와핑이 이루어지고, 우선순위가 낮은 프로세스를 내보내고 높은 프로세스를 메모리에 적재한다. 스와핑에는 큰 디스크 전송 시간이 필요하기 때문에, 현재는 메모리 공간이 부족할 때만 스와핑을 시작한다.

https://velog.io/@mm723/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%97%B0%EC%86%8D-%EB%A9%94%EB%AA%A8%EB%A6%AC-%ED%95%A0%EB%8B%B9

  • swap space(스왑 영역): 스와핑을 위해 보조기억장치에 할당된 전용 영역
  • swap-out: 메모리에서 swap space로 프로세스를 내보내는 작업
  • swap-in: swap space에서 메모리로 프로세스를 불러들이는 작업

 

2. 메모리 분할

메모리 분할은 여러 프로그램을 번갈아가며 수행시키는 멀티 프로그래밍 환경에서 메모리에 여러 프로그램을 적재시키기 위해 메모리 공간을 나누는 것이다.

 

연속 할당 방식

프로세스를 통째로 메모리에 올리는 방식이다.

  • 고정 분할 방식: 메모리를 미리 고정된 크기로 나누어 관리하는 방식으로, 분할 당 하나의 프로세스만 적재할 수 있어 동시에 메모리에 올라가는 프로세스 수가 고정되며 내부 단편화가 발생할 수 있다.
  • 가변 분할 방식: 프로세스의 크기에 따라 메모리를 동적으로 나누는 방식으로, 분할의 크기와 개수가 동적으로 변하며 외부 단편화가 발생할 수 있다.

 

불연속 할당 방식

프로세스를 여러 조각으로 나누어 메모리에 올리는 방식이다.

  • 페이징: 프로세스를 균일한 크기의 페이지로 나누어 메모리에 적재하는 방식으로, 외부 단편화 문제는 해결되지만 내부 단편화는 여전히 발생할 수 있다.
  • 세그멘테이션: 프로세스를 코드, 데이터 등 의미 단위로 나누어 메모리에 적재하는 방식으로, 보안과 공유 측면에서 효과적이지만 외부 단편화가 발생할 수 있다.

(페이징과 세그멘테이션은 4번 가상메모리에서 자세히)

 

단편화 문제 (내부/외부 단편화)

단편화는 프로세스들이 메모리에 적재되고 제거되는 과정이 반복되면서, 메모리의 공간이 작은 조각으로 나뉘어 사용 가능한 메모리가 충분히 존재하지만 할당이 불가능한 상태를 말한다.

 

내부 단편화

프로세스가 필요한 양보다 더 큰 메모리가 할당되어 메모리 공간이 낭비되는 현상이다. 예를 들어 1000 크기의 분할된 공간에 800 크기의 프로세스가 들어갈 때, 200만큼의 메모리가 프로세스에 의해 실제로 사용되지 않고 낭비된다. 주로 고정 분할 방식에서 발생한다.

 

외부 단편화

메모리의 남은 총 공간은 프로세스가 요구하는 메모리보다 크지만, 남은 공간이 연속적이지 않아 할당이 불가능한 상태이다. 예를 들어 500 크기의 메모리가 두 곳에 분산되어 있을 때(총 1000), 800 크기의 프로세스는 연속된 공간이 없어 적재될 수 없다. 주로 가변 분할 방식에서 발생한다.

 

 

 

3. 메모리 할당 및 배치 기법

단편화 문제를 해결하기 위한 메모리 관리 기법들이다.

 

연속 할당에서의 배치 전략

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

  • 최초 적합 (First-fit): 프로세스가 들어갈 수 있는 크기의 빈 공간을 메모리 앞에서부터 찾아 최초로 발견한 곳에 할당하는 방식이다. 속도가 가장 빠르다.
  • 최적 적합 (Best-fit): 프로세스가 들어갈 수 있는 가장 작은 공간을 찾아 할당하는 방식이다. 모든 공간을 탐색해야 하지만 메모리 이용률이 높다.
  • 최악 적합 (Worst-fit): 가장 큰 빈 공간에 할당하는 방식이다. 모든 공간을 탐색해야 하며 속도와 공간 이용률 모두 비효율적이다.

 

 

단편화 해결 전략

  • 통합 (Coalescing): 인접한 빈 공간들을 하나의 큰 공간으로 합치는 방식이다. 외부 단편화를 해결할 수 있다.
  • 압축 (Compaction): 메모리의 모든 프로세스를 한쪽으로 모아 큰 빈 공간으로 만드는 방식이다. 외부 단편화를 해결할 수 있지만, 프로세스 이동에 많은 비용이 든다.

 

버디 시스템

고정 분할과 가변 분할의 단편화 문제를 모두 보완하기 위한 메모리 관리 방식이다.

메모리 공간을 2의 승수 크기로 분할하고, 프로세스 크기와 가장 근접한 크기의 공간을 할당한다(프로세스 크기 K에 대해 2^(U-1) < K ≤ 2^U를 만족하는 2^U 크기의 메모리 블록을 할당). 인접한 같은 크기의 빈 공간(버디)들은 다시 하나의 큰 공간으로 합쳐질 수 있다. 리눅스 운영체제에서도 사용되는 중요한 기법이다.

인접한 버디만 확인하면 되기 때문에, 병합 속도가 빠르지만, 요청한 메모리보다 큰 2의 거듭제곱 크기 블록이 할당되어 내부 단편화가 발생할 수 있다.

 

 

 

4. 가상 메모리

가상 메모리 (Virtual Memory)

가상 메모리는 실제 물리 메모리의 크기를 초과하는 프로세스를 실행할 수 있게 해주는 기술로, 프로그램의 일부만 메모리에 적재하고 나머지는 디스크에 저장하여 관리한다. 물리 메모리의 용량 한계를 극복하고 여러 프로그램을 동시에 실행할 수 있으며, 프로그램이 메모리에서 분리되어 실행되므로 효율적인 자원 활용이 가능하다. 가상 메모리 관리 기법으로는 주로 페이징과 세그멘테이션이 사용된다.


가상 메모리 관리 기법 (페이징, 세그멘테이션)

1. 페이징 (Paging)

https://www.youtube.com/watch?v=8ufliWkgqMo&list=PLVsNizTWUw7FCS83JhC1vflK8OcLRG0Hl&index=40&ab_channel=%ED%95%9C%EB%B9%9B%EB%AF%B8%EB%94%94%EC%96%B4

 

페이징은 프로세스의 논리 주소 공간을 동일한 크기의 페이지로 나누고, 물리 주소 공간을 동일한 크기의 프레임으로 나누어 각 페이지를 프레임에 매핑하는 가상 메모리 관리 기법이다. 페이지는 순서에 상관없이 빈 프레임에 저장될 수 있다.

 

페이지

페이지는 프로세스를 일정한 크기로 나눈 단위이며, 물리 메모리의 프레임과 크기가 동일하다. 프로세스의 페이지들은 물리 메모리의 프레임에 순서에 상관없이 배치될 수 있다.


페이지 테이블

 

페이지 테이블은 각 프로세스마다 존재하며 페이지 번호와 프레임 번호를 매핑하는 테이블이다.

프로세스가 물리 주소에 불연속적으로 저장되더라도 페이지 테이블을 통해 CPU는 논리 주소를 연속적으로 접근할 수 있다. 

PTBR(Page Table Base Register)이 각 프로세스의 페이지 테이블 위치를 가리킨다.

 

페이지 테이블의 각 항목(PTE: Page Table Entry)은 페이지 번호, 프레임 번호 뿐만 아니라 다양한 비트 정보도 포함한다.

  • 페이지 번호: 논리 주소 공간의 페이지 번호
  • 프레임 번호: 페이지가 적재된 물리 메모리의 프레임 번호
  • 유효 비트: 페이지의 메모리 적재 여부
  • 보호 비트: 페이지 접근 권한 (읽기/쓰기/실행)
  • 참조 비트: CPU의 페이지 접근 여부
  • 수정 비트: 페이지 내용 수정 여부

 

주소 변환

페이징 시스템에서 프로세스의 논리 주소는 <페이지 번호, 변위(offset)>의 형태로 표현된다.

  • 페이지 번호(page number): 접근하고자 하는 페이지 번호
  • 변위(offset): 접근하려는 주소가 프레임의 시작 번지로부터 얼만큼 떨어져 있는지 알기 위한 정보

CPU는 페이지 테이블을 참조하여 이 논리 주소를 물리 주소 <프레임 번호, 변위>로 변환한다. 페이지 번호는 접근하고자 하는 페이지를, 변위는 해당 페이지/프레임 내에서의 위치를 나타낸다. 페이지와 프레임의 크기가 동일하므로 변위값은 변환 시 그대로 유지된다.

  1. CPU가 논리 주소의 페이지 번호로 페이지 테이블 접근
  2. 해당 페이지의 유효 비트 확인
    • 유효 비트가 0인 경우: 페이지 폴트 발생
    • 유효 비트가 1인 경우: 프레임 번호 확인
  3. 페이지의 접근 권한 확인 (보호 비트)
  4. 프레임 번호와 변위를 조합하여 물리 주소 계산
    • 물리 주소 = (프레임 번호 × 페이지 크기) + 변위
  5. 참조 비트와 수정 비트 업데이트

예시)

페이지 크기가 1024바이트이고 논리 주소가 <3, 200>인 경우, CPU는 페이지 번호 3의 프레임 번호(6)와 유효 비트를 페이지 테이블에서 조회한다. 유효 비트가 1이면 프레임 번호와 변위를 사용해 최종 물리 주소 6344(6×1024 + 200)를 계산한다. 만약 유효 비트가 0이면, 페이지 폴트가 발생하여 해당 페이지를 메모리로 가져와야 한다.

 

TLB(Translation Lookaside Buffer)

TLB는 페이지 테이블의 캐시 메모리로, MMU(Memory Menagement Unit) 내에 존재한다. CPU의 메모리 접근 시간을 줄이기 위해 최근 사용된 페이지의 매핑 정보를 저장한다.

  • TLB 히트(TLB hit): CPU가 발생한 논리 주소에 대한 페이지 번호가 TLB에 있을 경우 => 메모리 1번 접근
  • TLB 미스(TLB miss): CPU가 발생한 논리 주소에 대한 페이지 번호가 TLB에 없을 경우 => 메모리에 2번 접근

 

장점

  • 논리 메모리는 물리 메모리에 연속되어 저장될 필요가 없음
  • 물리 메모리의 남는 프레임에 적절히 배치되어 외부 단편화가 발생하지 않음

단점

  • 내부 단편화: 프로세스의 크기가 페이지 크기의 배수가 아닐 경우, 마지막 페이지에 발생하는 메모리 낭비됨

 

 

2. 세그멘테이션 (Segmentation)

세그멘테이션은 프로세스를 논리적 내용 단위인 세그먼트(Segment)로 나누어 메모리에 배치하는 방식이다.

세그먼트

세그먼트는 프로세스를 구성하는 논리적인 단위로, 주로 code, data, stack 등이 해당된다. 각 세그먼트의 크기는 일정하지 않고 가변적이다.

 

세그먼트 테이블

세그먼트 테이블은 각 프로세스마다 존재하며 세그먼트의 위치 정보를 관리한다. STBR(Segment Table Base Register)이 각 프로세스의 세그먼트 테이블 위치를 가리킨다. 세그먼트 테이블의 각 항목은 아래 정보를 포함한다.

  • Base: 세그먼트의 시작 물리 주소
  • Limit: 세그먼트의 크기
  • Protection Bits: 읽기/쓰기/실행 권한 비트

세그먼트 테이블을 통해 보호와 공유가 효율적으로 이루어진다. 권한 비트로 세그먼트 단위의 접근 제어가 가능하며, 여러 프로세스가 동일한 세그먼트를 공유할 수 있다.

 

주소 변환

https://velog.io/@codemcd/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-14.-%EC%84%B8%EA%B7%B8%EB%A9%98%ED%85%8C%EC%9D%B4%EC%85%98

 

세그멘테이션에서 프로세스의 논리 주소는 <세그먼트 번호, 변위(offset)>의 형태로 표현된다. 

  • 세그먼트 번호: 접근하고자 하는 세그먼트 번호
  • 변위(offset): 접근하려는 주소가 세그먼트의 시작 주소로부터 얼마나 떨어져 있는지를 나타내는 값

CPU는 세그먼트 테이블을 참조하여 논리 주소를 물리 주소로 변환한다.

 

  1. CPU가 논리 주소의 세그먼트 번호로 세그먼트 테이블 접근
  2. 해당 세그먼트의 Base와 Limit 값 확인
  3. 변위(offset)가 Limit을 초과하는지 검사
    • 초과할 경우: 세그먼트 위반 예외 발생
    • 초과하지 않을 경우: Base + offset으로 물리 주소 계산
  4. 접근 권한 확인 (Protection Bits)

예시)

논리 주소가 <2, 100>인 경우, CPU는 세그먼트 번호 2의 Base 주소(4300)와 Limit(400)을 세그먼트 테이블에서 조회한다. 변위 100은 Limit 400을 초과하지 않으므로, Base 주소에 변위를 더해 최종 물리 주소 4400(4300 + 100)을 계산한다. 만약 변위가 500이었다면, Limit을 초과하므로 세그먼트 위반 예외가 발생한다.

 

 

장점

  • 보호: 세그먼트 테이블에 읽기/쓰기/실행 권한 비트를 추가할 수 있어 보안 및 접근 제어가 용이함
  • 공유: 세그먼트 단위로 메모리를 관리하여 프로세스 간 공유가 효율적임

 

단점

  • 외부 단편화: 세그먼트 크기가 가변적이므로 메모리에 불규칙한 공간(hole)이 발생하여 외부 단편화 문제가 생길 수 있음

 

페이징 vs 세그멘테이션

페이징은 프로세스를 일정한 크기의 페이지로 나누지만, 세그멘테이션은 논리적인 내용 단위로 나눈다. 페이징은 내부 단편화, 세그멘테이션은 외부단편화 문제가 있다. 

 

 

3. 페이징된 세그멘테이션 (Paged Segmentation)

페이징과 세그멘테이션의 장점을 결합한 방식이다. 프로세스를 먼저 논리적 단위인 세그먼트로 나누고, 각 세그먼트를 다시 동일한 크기의 페이지로 나누어 관리한다.

 

주소 변환

http://kocw-n.xcache.kinxcdn.com/data/document/2019/kcu/kangujun1008/4.pdf

CPU가 발생시킨 논리 주소는 <세그먼트 번호, 변위>로 구성된다. 먼저 세그먼트 테이블을 통해 해당 세그먼트의 페이지 테이블에 접근한다. 이후 페이지 테이블을 통해 최종 물리 주소로 변환된다. 이 과정에서 주소 변환이 두 번 필요하다는 단점이 있지만, 세그멘테이션의 보호와 공유의 장점을 유지하며 외부 단편화 해결이라는 장점을 모두 취할 수 있다.

 


REF

https://velog.io/@yoonuk/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%A3%BC%EC%86%8C-%EC%A7%80%EC%A0%95

https://lexine.tistory.com/56

 

https://technote-mezza.tistory.com/92

https://rebro.kr/178

https://velog.io/@dongwookang/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC

https://zu-techlog.tistory.com/132

 

https://steady-coding.tistory.com/524

https://resilient-923.tistory.com/394

https://velog.io/@codemcd/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-14.-%EC%84%B8%EA%B7%B8%EB%A9%98%ED%85%8C%EC%9D%B4%EC%85%98

https://code-lab1.tistory.com/57

 

 

 

 

 

 

반응형

댓글