CS/운영체제
세그멘테이션(Segmentation): 프로세스를 기능 별로 나눠서 각각 메모리에 넣는 메모리 관리 기법
나디아 Nadia
2025. 6. 1. 23:42
세그멘테이션(Segmentation)
: 프로세스를 의미 있는 단위(코드, 데이터, 스택 등)로 나눠서 각각 메모리에 따로 배치하는 메모리 관리 방식
- 게임을 만드는 상황에서 아래처럼 잘게 나눈 덩어리들을 각각 필요한 만큼만 메모리에 따로따로 배치하는 방식
⇒ 세그멘테이션
- 게임 실행 코드 → 한 덩어리
- 캐릭터 정보 같은 데이터 → 또 다른 덩어리
- 게임 도중 생기는 임시 정보들(예: 점수 계산 등) → 또 다른 덩어리
- 세그멘테이션에서는 프로그램이 여러 세그먼트(조각)로 나눠져있음
→ 그래서 사용자가 어떤 세그먼트 안에서 논리 주소를 사용하면, 운영체제는 그 주소가 실제 메모리의 어디에 있는지 계산하기 위해 물리 주소로 바꿔줘야 함 - 개요
- 프로그램은 여러 개의 세그먼트(조각)로 구성됨
→ ex) 메인 코드, 전역 데이터, 힙, 스택 등 - 프로그램 입장에서 메모리를 살펴보면 메인 코드가 있는 세그먼트, 전역 데이터들이 있는 세그먼트, 힙 영역이 있는 세그먼트, 스택 영역이 있는 세그먼트 등이 있음
- 각 세그먼트들은 메모리에서 꼭 붙어 있을 필요는 없음
→ 물리 메모리에 흩어져 있어도 OK - 프로세스나 CPU가 사용하는 주소 ⇒ 논리 주소(Logical Address)
- 논리 주소를 실제 메모리 위치인 물리 주소(Physical Address)로 바꾸는 역할은 메모리 관리자(OS)가 함
- 논리 주소 → 물리 주소 변환은 모든 메모리 관리 방식에서 필수적임 (방식이 다를 뿐)
- 프로그램은 여러 개의 세그먼트(조각)로 구성됨
세그먼테이션의 장단점
장점
- 메모리를 필요한 만큼만 나눌 수 있음
- 고정 크기 말고, 코드나 데이터 크기에 딱 맞게 나눌 수 있음
- 세그먼테이션에서는 프로그램의 각 부분(코드, 데이터, 힙, 스택 등)을 각각 별도의 조각(세그먼트)으로 나눠서 관리함
→ 그래서 각각에 대해 접근 제한을 걸기 쉽고, 필요한 경우에는 일부 세그먼트만 다른 프로그램과 공유할 수도 있음
단점
- 외부 단편화 발생
- 메모리 전체를 보면 빈 공간이 많지만, 필요한 크기만큼 연속된 공간이 없어서 할당을 못 하는 현상
세그멘테이션의 주소 변환
메모리 관리자가 논리 주소를 → 물리 주소로 변환하는 과정
- 메모리 관리자는 세그멘테이션 테이블(Segment Table)이라는 걸 갖고 있음
- 세그멘테이션 테이블(Segment Table)에는 Base Address와 Bound Address 정보가 저장되고, 이를 이용해서 물리 메모리 주소를 계산함
- Base Address: 해당 세그먼트가 물리 메모리에서 시작하는 주소
- Bound Address: 세그먼트의 크기
- CPU에서 논리 주소를 전달해주면, 메모리 관리자는 이 논리 주소가 몇 번 세그먼트인지 알아냄
- 메모리 관리자 내의 세그먼트 테이블 베이스 레지스터(Segment Table Base Register)를 이용해서 물리 메모리 내에 있는 세그멘테이션 테이블을 찾아냄
- 세그멘테이션 테이블에서 세그먼트 번호를 인덱스로 해서 Base Address와 Bound Address를 찾음
- 논리 주소와 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번지로 접근함
- 메모리 관리자는 CPU의 요청을 받고 세그먼트 1번인 것을 알아냄
- 메모리 관리자는 메모리 관리자 내에 있는 세그먼트 테이블 베이스 레지스터(Segment Table Base Register)를 이용해서 물리 메모리 n번지에 있는 세그먼테이션 테이블을 찾아냄
- 세그멘테이션 테이블에서 세그먼트 1번이 위치한 1번 인덱스를 참조함
- 논리 주소 632와 Bound Address 1000을 비교하니 논리 주소가 더 작음
- 논리 주소 632에 Base Address 5200을 더해서 5832가 나옴
⇒ 논리 주소 632번지 → 5832번지로 변환 완료⭕
- 세그먼트 3번이 750번지로 접근함
- 메모리 관리자는 CPU의 요청을 받고 세그먼트 3번인 것을 알아냄
- 메모리 관리자는 메모리 관리자 내에 있는 세그먼트 테이블 베이스 레지스터(Segment Table Base Register)를 이용해서 물리 메모리 n번지에 있는 세그먼테이션 테이블을 찾아냄
- 세그멘테이션 테이블에서 세그먼트 3번이 위치한 3번 인덱스를 참조함
- 논리 주소 750과 Bound Address 500을 비교하니 논리 주소가 더 큼
⇒ 메모리 관리자는 메모리를 침범했다고 판단하고 인터럽트를 발생시켜 프로세스를 종료시킴🚨
컨텍스트 스위칭 시 고려사항
- 컨텍스트 스위칭을 할 때마다 운영체제는 메모리 관리자 내의 세그먼트 테이블 베이스 레지스터(Segment Table Base Register)를 해당 프로세스의 것으로 값을 바꿔줘야 함
⇒ 이런 작업까지 하기 때문에 컨텍스트 스위칭은 굉장히 무거운 동작임