운영체제

[OS/운영체제] 세그먼테이션 (Segmentation)

4Legs 2020. 11. 13. 22:52

세그먼테이션 (Segmentation)

페이징 기법과 마찬가지로 메모리 관리 측면에서 가장 중요한 것은 사용자 관점에서의 메모리와 실제 메모리를 분리하는 것이다. 지금까지 봐왔듯 사용자 관점의 메모리는 실제 메모리와 같지 않고, 매핑(mapped)된다. 이러한 매핑을 통해 논리적 메모리와 물리적 메모리를 구분할 수 있다.

 

Basic Method

사용자 관점에서의 프로그램

대부분의 사용자는 메모리를 바이트의 연속적인 배열로 생각하지 않는다. 대신 메모리를 순서가 없는 가변 크기의 Segment(부분)의 모음으로 보게 된다. 마찬가지로 우리는 프로그램을 메소드, 함수, 자료구조 등의 집합으로 생각하게 된다. 프로그램이 어떤 메모리 주소에 담기는지는 신경쓰지 않는다.

세그먼테이션(Segmentation)은 이러한 사용자 관점의 메모리를 지원하는 메모리 관리 기법이다. 논리적 주소 공간은 세그먼트(Segment)의 모음이 된다. 각 세그먼트는 각자의 이름과 길이를 가지고, 사용자는 이를 지정함으로써 주소를 특정한다.

페이징 기법은 하드웨어에 의해 분리된 하나의 주소를 페이지 번호와 페이지 간격으로 특정하고, 사용자에게 이 과정은 보이지 않는다는 점에서 세그먼테이션 기법과 대비된다.

구현의 간단함을 위해 세그먼트들은 이름보다는 Segment Number(세그먼트 번호)로 구별된다. 따라서 논리적 주소는 세그먼트 번호, 세그먼트 간격(offset)의 두 요소로 정의된다.

 

일반적으로 사용자 프로그램이 컴파일된 후 컴파일러는 자동으로 프로그램에 대한 세그먼트를 만든다. 컴파일러는 다음과 같은 내용에 대한 세그먼트를 생성한다.

컴파일러에 의해 생성되는 세그먼트

 

Hardware

사용자가 프로그램 내 어떤 객체의 주소를 2차원으로 생각할지라도, 실제 메모리는 1차원 byte의 연속이다. 따라서 우리는 2차원의 사용자 관점 주소들을 1차원의 실제 주소로 변환(mapping)해야 한다.

이러한 변환은 세그먼트 테이블(Segment Table)의 영향을 받는다. 세그먼트 테이블의 각 항목은 Segment Base와 Segment Limit을 갖는다. Base는 물리 주소의 시작점을 나타내고, Limit은 세그먼트의 길이를 나타낸다.

Segmentation Hardware

세그먼트의 논리적 주소는 세그먼트 번호 s와 간격 d를 갖는다. 세그먼트 번호는 세그먼트 테이블에서 인덱스로 사용된다. 세그먼트 간격은 반드시 0부터 Segment Limit 사이의 값을 가져야 한다. 그렇지 않다면 세그먼트 바깥의 메모리를 접근했다고 간주하여 운영체제에서 Trap을 발생시킨다.

그림에서 논리적 주소 s, d에 해당하는 물리적 주소를 찾기 위해, 세그먼트 테이블에서 s에 해당하는 세그먼트의 Base와 Limit 값을 찾는다. 논리적 주소의 d가 Limit보다 작은 값인지 검사하고, 이상이 없다면 Base + d가 물리적 주소가 된다.

세그먼테이션 예시

 

 

 

※ 본 게시글은 『Operating System Concepts』 를 참고하여 작성되었습니다.