CS/운영체제

세그멘테이션(Segmentation): 프로세스를 기능 별로 나눠서 각각 메모리에 넣는 메모리 관리 기법

나디아 Nadia 2025. 6. 1. 23:42

 

세그멘테이션(Segmentation)

: 프로세스를 의미 있는 단위(코드, 데이터, 스택 등)로 나눠서 각각 메모리에 따로 배치하는 메모리 관리 방식

  • 게임을 만드는 상황에서 아래처럼 잘게 나눈 덩어리들을 각각 필요한 만큼만 메모리에 따로따로 배치하는 방식 
     세그멘테이션
    • 게임 실행 코드 → 한 덩어리
    • 캐릭터 정보 같은 데이터 → 또 다른 덩어리
    • 게임 도중 생기는 임시 정보들(예: 점수 계산 등) → 또 다른 덩어리
  • 세그멘테이션에서는 프로그램이 여러 세그먼트(조각)로 나눠져있음
    그래서 사용자가 어떤 세그먼트 안에서 논리 주소를 사용하면, 운영체제는 그 주소가 실제 메모리의 어디에 있는지 계산하기 위해 물리 주소로 바꿔줘야 함

  • 개요
    • 프로그램은 여러 개의 세그먼트(조각)로 구성됨
      → ex) 메인 코드, 전역 데이터, 힙, 스택 등
    • 프로그램 입장에서 메모리를 살펴보면 메인 코드가 있는 세그먼트, 전역 데이터들이 있는 세그먼트, 힙 영역이 있는 세그먼트, 스택 영역이 있는 세그먼트 등이 있음
    • 각 세그먼트들은 메모리에서 꼭 붙어 있을 필요는 없음
      → 물리 메모리에 흩어져 있어도 OK
    • 프로세스나 CPU가 사용하는 주소 ⇒ 논리 주소(Logical Address)
    • 논리 주소를 실제 메모리 위치인 물리 주소(Physical Address)로 바꾸는 역할은 메모리 관리자(OS)가 함
    • 논리 주소 → 물리 주소 변환은 모든 메모리 관리 방식에서 필수적임 (방식이 다를 뿐)

 

 

 

세그먼테이션의 장단점

장점

  • 메모리를 필요한 만큼만 나눌 수 있음
    • 고정 크기 말고, 코드나 데이터 크기에 딱 맞게 나눌 수 있음
  • 세그먼테이션에서는 프로그램의 각 부분(코드, 데이터, 힙, 스택 등)을 각각 별도의 조각(세그먼트)으로 나눠서 관리함
    → 그래서 각각에 대해 접근 제한을 걸기 쉽고, 필요한 경우에는 일부 세그먼트만 다른 프로그램과 공유할 수도 있음

 

단점

  • 외부 단편화 발생
    • 메모리 전체를 보면 빈 공간이 많지만, 필요한 크기만큼 연속된 공간이 없어서 할당을 못 하는 현상

 

 

 

세그멘테이션의 주소 변환

메모리 관리자가 논리 주소를 물리 주소로 변환하는 과정

  1. 메모리 관리자는 세그멘테이션 테이블(Segment Table)이라는 걸 갖고 있음
  2. 세그멘테이션 테이블(Segment Table)에는 Base Address와 Bound Address 정보가 저장되고, 이를 이용해서 물리 메모리 주소를 계산함
    • Base Address: 해당 세그먼트가 물리 메모리에서 시작하는 주소
    • Bound Address: 세그먼트의 크기
  3. CPU에서 논리 주소를 전달해주면, 메모리 관리자는 이 논리 주소가 몇 번 세그먼트인지 알아냄
  4. 메모리 관리자 내의 세그먼트 테이블 베이스 레지스터(Segment Table Base Register)를 이용해서 물리 메모리 내에 있는 세그멘테이션 테이블을 찾아냄
  5. 세그멘테이션 테이블에서 세그먼트 번호를 인덱스로 해서 Base Address와 Bound Address를 찾음
  6. 논리 주소와 Bound Address로 계산을 진행함
    • 논리 주소가 < Bound Address보다 작으면, Base Address를 더해서 물리 주소를 구함
    • 논리 주소가 > Bound Address보다 크면, 해당 프로세스가 메모리를 침범했다고 생각하고 에러를 발생시킴

 

 

 

세그먼트 테이블 베이스 레지스터(Segment Table Base Register)

: 현재 실행 중인 프로세스의 세그먼트 테이블의 위치를 알려주는 포인터

  • 세그먼테이션 테이블은 물리 메모리에 저장되어 있음
  • 운영체제는 프로세스마다 다른 세그먼트 테이블을 갖고 있음
  • CPU는 주소를 계산할 때 이 레지스터를 참조해서, 세그먼트 테이블을 찾고 거기서 Base Address와 Bound Address를 가져옴

 

 

Base Address

: 해당 세그먼트가 실제로 메모리에서 시작하는 위치(주소)

  • Base Address는 세그먼트가 메모리에서 어디에 배치되어 있는지를 알려주고, 논리 주소는 그 세그먼트 안에서 얼마만큼 떨어진 위치인지를 알려줌
  • 논리 주소가 < Bound Address보다 작으면, 이 Base Address에 더해서 실제 물리 주소를 만듦
    • 논리 주소 + Base Address = 물리 주소

 

 

Bound Address

: 세그먼트의 크기를 나타냄

  • 메모리 관리자는 CPU에서 받은 논리 주소와 이 Bound Address의 크기를 비교
  • 논리 주소가 < Bound Address보다 작으면, Base Address를 더해서 물리 주소를 구함
  • 논리 주소가 > Bound Address보다 크면, 해당 프로세스가 메모리를 침범했다고 생각하고 에러를 발생시킴

 

 

 

예시: 논리 주소를 물리 주소로 변환하는 법

  • CPU에서 세그먼트 1번이 632번지로 접근함
    1. 메모리 관리자는 CPU의 요청을 받고 세그먼트 1번인 것을 알아냄
    2. 메모리 관리자는 메모리 관리자 내에 있는 세그먼트 테이블 베이스 레지스터(Segment Table Base Register)를 이용해서 물리 메모리 n번지에 있는 세그먼테이션 테이블을 찾아냄
    3. 세그멘테이션 테이블에서 세그먼트 1번이 위치한 1번 인덱스를 참조함
    4. 논리 주소 632와 Bound Address 1000을 비교하니 논리 주소가 더 작음
    5. 논리 주소 632에 Base Address 5200을 더해서 5832가 나옴
      ⇒ 논리 주소 632번지 → 5832번지로 변환 완료⭕

 

 

  • 세그먼트 3번이 750번지로 접근함
    1. 메모리 관리자는 CPU의 요청을 받고 세그먼트 3번인 것을 알아냄
    2. 메모리 관리자는 메모리 관리자 내에 있는 세그먼트 테이블 베이스 레지스터(Segment Table Base Register)를 이용해서 물리 메모리 n번지에 있는 세그먼테이션 테이블을 찾아냄
    3. 세그멘테이션 테이블에서 세그먼트 3번이 위치한 3번 인덱스를 참조함
    4. 논리 주소 750과 Bound Address 500을 비교하니 논리 주소가 더 큼
      ⇒ 메모리 관리자는 메모리를 침범했다고 판단하고 인터럽트를 발생시켜 프로세스를 종료시킴🚨

 

 

 

컨텍스트 스위칭 시 고려사항

  • 컨텍스트 스위칭을 할 때마다 운영체제는 메모리 관리자 내의 세그먼트 테이블 베이스 레지스터(Segment Table Base Register)를 해당 프로세스의 것으로 값을 바꿔줘야 함
    ⇒ 이런 작업까지 하기 때문에 컨텍스트 스위칭은 굉장히 무거운 동작