본문 바로가기
3-2 학기/Operating Systems

[운영체제] Segmentation, Paging

by bona.com 2025. 9. 29.

Abstraction: Address Space

프로그램이 실행될 때 변수들이 각각 어떤 메모리 영역에 배치되는지 알아보자.

int x;                              
int main(int argc, char *argv[]) { 
    int y;                         
    int *z = malloc(sizeof(int));   
}

 

  • x는, 전역변수이기 때문에 static 하므로 code에 저장된다. (프로그램 시작 시 생성되고, 종료 시 소멸)
  • main은, 실행할 명령어이기 때문에 code에 저장된다.
  • y는, 지역변수이기 때문에 stack에 저장된다. (함수 호출 시 스택 프레임에 생성되고, 함수 종료 시 소멸)
  • z는, 지역변수이기 때문에 주소값 자체는 stack에 저장된다.
  • *z는, 동적할당 되었기 때문에 실제 값이 heap에 저장된다.

Virtualize Memory

OS가 여러 프로세스를 동시에 메모리에 올리기(메모리 가상화) 위해 5가지 접근 방식이 있다.

  • TIme Sharing
  • Static Relocation
  • Base
  • Base + Bounds
  • Segmentation

그러나, 나는 이번에 Segmentation 부분을 깊게 정리하고 싶어 이에 대해서만 알아볼 것이다.


Segmentation

Segmentation은,  주소 공간(addrress space)을 논리적인 단위(코드, 힙, 스택)로 나누어 관리하는 방식이다.

즉, 의미에 따라 조각(segment)으로 나눈다고 생각하면 된다.

 

MMU는 주소 변환을 담당하는 하드웨어로, 세그멘테이션에서 MMU는 프로세스마다 따로 Segment Table을 하나씩 가지고 있다.

 

위는 Segment Table이다.

세그먼트 별로 시작 주소(Base), 길이(Bounds), 접근 권한 정보를 저장하고 있는 것을 볼 수 있다.

내가 필기한 것을 토대로 가상주소물리주소로 바꾸는 방법에 대해 알아보자.

세그멘테이션에서는 가상주소가 다음과 같이 저장된다.

[ Segment Number | Offset ]

 

그럼 MMU가 세그먼트의 시작 위치(Base)를 찾아서 Offset을 더해주는 것이다.

물리 주소 = Base + Offset

 

첫 번째 명령어만 살펴보자.

load 0x2010, R1이다.

 

0x2010은 segment = 2, offset = 0x010을 나타낸다.

segment2의 시작위치는 0x1600이기 때문에 여기에 offset을 더해주면 0x1600 + 0x010 = 0x1610이 된다.

 

이러한 segmentation는 필요한 세그먼트만 물리 메모리에 배치하여, 스택과 힙이 서로 독립적으로 성장할 수 있다는 장점이 있지만,

여전히 물리 메모리에서 연속적으로 할당해야 한다는 문제점이 존재하며 이는 외부 단편화로 이어진다는 단점이 있다.


Paging

위에서 살펴본 segmentation의 문제점을 해결하기 위한 것이 바로 paging이다.

Paging이란, 메모리와 주소 공간을 고정된 크기의 블록(page) 으로 나눠서, 연속적으로 배치하지 않아도 되게 하는 방식이다.

위 그림처럼, MMU가 Page Table을 참조해서 page numberframe number로 변환해주는 것이다.

 

1️⃣ 먼저 오프셋 비트 수 구하는 방법이다.

위 표에서 바로 볼 수 있지만 오프셋 비트 수는 페이지 크기의 로그₂ 값이다.

2️⃣ 두 번째로 Virtual Page Number(VPN)을 구하는 방법이다.

가상주소 비트 수 = VPN 비트 수 + Offset 비트 수

위와 같은 공식을 이용해 10 - 4 = 6으로 VPN을 구할 수 있다.

3️⃣ 마지막으로 가상 페이지 개수를 계산하는 방법이다.

2^(VPN 비트 수)로 구하면 되기 때문에 VPN이 6비트일 때 가상 페이지 개수는 2^6 = 64개가 된다.

 

문제를 풀어보자!

주어진 건 다음과 같다.

이때 전체 페이지 테이블 크기는 어떻게 될까?

Addrress Space = 32bit
Pages = 4KB
PTE = 4byte

 

먼저 페이지 오프셋 비트 수를 구한다.

로그₂ (4KB) = 로그₂ (2^12)  = 12bit

 

그 다음 VPN을 구한다.

VPN = 32(가상주소 공간) - 12(페이지 크기) = 20bit

 

이제 가상 페이지 개수를 구한다.

2^VPN = 2^20 = 1MB

 

마지막으로 PTE 값을 곱해주면 끝난다.

1MB x 4byte = 4MB

 

이처럼, 페이징은 외부 단편화를 없애면서 할당과 해제가 빠르다는 장점이 있지만, 내부 단편화가 발생한다는 문제점은 존재한다.

'3-2 학기 > Operating Systems' 카테고리의 다른 글

[운영체제] Thread  (0) 2025.10.04
[운영체제] Virtual Memory  (0) 2025.09.30
[운영체제] Multiprocessor Scheduling  (0) 2025.09.17
[운영체제] Scheduling  (0) 2025.09.16
[운영체제] Limited Direct Execution  (0) 2025.09.13