[운영체제(OS)] 페이징(Paging), 세그멘테이션(Segmentation) 이란?

resilient

·

2022. 2. 28. 15:42

728x90
반응형

저번 시간까지는 메모리 관리 방법 중 페이징에 대해서 알아보았습니다. 간단하게 정리해볼까요?

 

프로세스를 일정 크기인 페이지 단위로 잘라서 메모리에 적재하는 방법을 페이징이라고 하는데요. 페이지는 일정한 간격으로 자르는 단위였습니다. 하지만 기준 없이 일정한 간격으로 자르는 페이징 말고도 기준을 세워서 논리적인 내용 단위인 세그먼트로 자를  수 있는 세그멘테이션 방법이 있습니다. 이번 시간에는 세그멘테이션에 대해서 알아보려고 합니다.

 

0. 세그멘테이션이란?

 

세그멘테이션은 하나의 프로세스를 세그먼트의 집합이라고 생각합니다.

세그먼트란?

네트워크TCP/IP 4 계층을 공부할 때도 세그먼트라는 단어가 사용되었었는데요. 전송 계층에서 신뢰할 수 있는 통신을 구현하기 위해 header를 위에서 받은 데이터에 붙입니다. 여기서 header가 붙은 데이터를 세그먼트라고 했습니다.

이렇게 세그먼트는 메모리의 거의 어느 곳에나 위치할 수 있고, 프로그램 실행을 위해 필요한 공간과 데이터를 처리하는 명령어들을 위한 프로그램이나 메모리의 부분이라고 할 수 있습니다. 하나의 단위인 것이죠.

 

사실 하나의 프로세스가 실행되기 위해서는 최소 코드, 데이터, 스택 세그먼트가 필요합니다. 이렇게 각각 다른 역할을 하는 내용들을 페이지처럼 일정한 단위로 쪼개는 것이 아니라 같은 역할을 하는 논리적인 단위로 쪼개기 때문에 세그먼트들의 크기는 일정하지 않죠.

 

메모리에 할당 하는 방법은 페이징과 방법이 같습니다. MMU 내의 재배치 레지스터를 통해서 논리 주소(logical address)를 물리 주소(physical address)로 매핑해줌으로써 변경하는 방식이죠.

 

 

페이징방법은 페이지 테이블이 있었듯이 세그먼트도 세그먼트 테이블이 있습니다.

 

MMU는 세그먼트 테이블로 CPU에서 할당해준 논리 주소에 해당하는 물리 주소의 위치를 가지고 있고, 이 방법을 통해서 CPU는 프로세스가 연속된 메모리 공간에 위치해 있다고 착각을 하게 되죠.

 

주소를 변환하는 방법도 페이징 방법과 같습니다. 

 

프로세스의 논리적인 주소는 (#segment, offset)으로 표현됩니다. 따라서 논리 주소는 세그먼트 번호와, 변위 비트로 이루어지게 되죠. 세그먼트 테이블에 논리 주소 값이 들어가면 세그먼트 번호는 세그먼트 테이블의 인덱스 값으로 인식을 하게 됩니다. 세그먼트 번호를 토대로 세그먼트 테이블에 들어가서 시작 위치와 한계 값을 파악하게 됩니다.

 

세그먼트 테이블은 각 세그먼트가 저장된 물리적 메모리의 주소를 (limit, Base) 변수를 사용합니다. Base는 시작 위치 주소를 의미하고, limit느 세그먼트의 길이를 나타냅니다. 

 

물리 주소는 페이징 기법과 거의 유사하게 시작 위치 주소와 세그먼트의 길이를 합해서구할 수 있는데요. 세그먼트가 저장된 공간은 (Base, Base+limit)이 되겠죠? 마찬가지로 주소 값이 각 세그먼트 크기의 한계값을 넘어가면 segment violation 예외 상황 처리를 하게 됩니다.

 

1. 페이징과 세그멘테이션 기법의 비교

 

1-1. 보호 기능

 

페이징에서는 code, data, stack 영역이 있을 때 일정한 크기로만 나누기 때문에 여러 영역이 섞일 수 있다는 문제점이 있었습니다. 반면에 세그멘테이션에서는 모든 논리 주소들은 세그멘테이션 테이블을 경유하게 되므로 세그먼트 테이블에 r, w, x비트들을 추가해서 해당 세그먼트에 대한 접근 제어를 가능하게 해 줍니다. 이를 통해 protection에서 이점이 있죠.

 

1-2. 공유 기능

 

페이징은 프로세스를 같은 단위로 자르게 되므로 중요한 부분과 중요하지 않은 부분이 같은 페이지 안으로 잘릴 수 있었습니다. 반면에 세그멘테이션은 같은 프로그램을 사용하는 여러 개의 프로세스가 있다면 메모리에 하나만 적재한 뒤, 프로세서의 세그먼트 테이블 코드 영역이 같은 곳을 가리키게 해서 프로세스 간 동일한 세그먼트에 대한 공유가 쉬워집니다.

 

1-3. 외부 단편화

 

계속 세그멘테이션의 장점을 얘기했는데요. 그럼 세그멘테이션 방법만 사용하면 될까요? 아닙니다.

 

세그먼트는 크기가 고정되어 있지 않고 가변적입니다. 크기가 각각 다른 세그먼트를 메모리에 두기 위해서는 동적 메모리를 할당해야 하죠. 어디서 많이 본 그림인데요. 이렇게 되면 불규칙하게 hole이 생기고, 외부 단편화가 발생할 수 있습니다. 저번 시간에 말했듯이 외부 단편화는 메모리 낭비를 매우 크게 발생시키죠. 

 

페이징 방법은 내부 단편화가, 세그멘테이션 방법은 외부 단편화가 발생하죠. 그렇다면 둘의 이점만 뽑아서 사용할 수는 없을까요?

 

2. 페이징 + 세그멘테이션

 

페이징과 세그멘테이션의 장점만 취해서 세그먼트를 페이징 기법으로 나누면 어떨까?라는 생각에 대한 방법이 있습니다.

 

이 방식의 핵심은 하나의 세그먼트를 내부적으로는 여러 개의 페이지로 나누고, 이 페이지들을 물리적 메모리에 매핑하는 것입니다. 이렇게 되면 세그먼트의 장점 중 보호와 공유 기능을 살릴 수 있고, 세그먼트는 논리적 단위가 아닌 더 작게 페이지 단위로 메모리를 사용함으로써 외부 단편화(External fragmentation) 문제를 해결할 수 있죠.

 

위 그림에서 세그먼트 테이블을 보면 세그먼트 테이블의 인덱스가 세그먼트의 번호가 됩니다. 세그먼트의 번호로 세그먼트 테이블의 엔트리를 얻은 뒤 그 안을 들여다보면 페이지 테이블에 대한 정보가 들어있는 것입니다. 페이지 테이블의 인덱스는 똑같이 페이지 번호가 되고 페이지의 엔트리를 받아서 보면 어느 물리 메모리에 매핑되었는지 프레임 번호를 얻을 수 있는 것이죠.

 

하지만 이렇게 하면 테이블을 두 번 모두 거쳐야 하기 때문에 속도 면에서 조금 떨어질 수 있습니다.

 

3. 정리

 

이번 시간에는 저번 시간에 배운 페이징 방법에 이어 세그멘테이션 방법을 살펴봤습니다. 두 가지 방법의 차이점을 알아보고 두 가지 방법의 장점을 모두 취할 수 있는 방법까지 알아보았는데요.

 

각 방법의 장단점을 잘 생각해보고, 상황에 따라 어떤 방법이 효율적 일지에 대해 생각해봐야 할 것 같습니다.

 

감사합니다.

 

반응형