본문 바로가기

CS지식

[운영체제] 메모리 가상화 - Segmentation

728x90

 

/* 메모리 가상화 */

메모리 가상화는 모든 프로세스들에게 별도의 가상 주소 공간을 제공해서 각각의 프로세스들은 자기가 전체 메모리를 다 사용하고 있는 것처럼 보이는 환상을 제공한다. 이를 통해 여러 프로그램이 동시에 실행될 때, 각각의 프로그램이 독립적인 메모리 공간을 갖는 것처럼 동작할 수 있다.

 

프로그램들은 가상 주소 (Virtual Address)를 사용하며, 운영체제와 하드웨어는 이를 물리 주소 (Physical Address)로 변환하여 실제 메모리로 접근한다.

 

주소 변환 (Address Translation)은 주로 CPU의 MMU (Memory Management Unit)에 의해 수행됩니다.

/* 세그멘테이션 Segmentation */

세그멘테이션은 운영체제에서 메모리 관리를 위해 사용되는 기법 (메모리 가상화 기법) 중 하나이다. 세그멘테이션은 프로세스를 세그먼트로 이루어져 있다고 본다.

  • 세그먼트 (Segment): 프로그램의 주소 공간은 코드, 데이터, 스택 등 여러 세그먼트로 나뉜다. 각 세그먼트는 서로 다른 크기를 가진다. 
  • 세그먼트 테이블 (Segment Table): 운영체제는 세그먼트 테이블을 사용하여 각 세그먼트의 시작 주소 (base) 와 크기 (limit)을 관리한다. 세그먼트 테이블은 프로세스 별로 존재하며, CPU가 메모리 접근 시 이 테이블을 참조하여 실제 메모리 주소를 계산한다. (MMU안에 Segment Table이 있다)

 

첫번 째 사진은 한 프로세스안에서의 세그먼트 배치를 나타낸다. 

두번 째 사진은 segment table을 나타낸다. segment 속성은 entry를 가져야 한다 (2 bit). 00,01,10,11 을 이용해 인덱스의 정보를 읽어올 수 있다. (10은 사용하지 않음)

첫번 째 사진을 살펴보면 code와 heap은 순방향, stack은 역방향으로 증가하고 있다. 방향에 따라 segment별 offset 계산 방식이 다르다.

 

- Code Segment

가상 주소 100B에 접근하는 코드가 있다면, 일단 이 메모리 접근이 정해진 영역을 벗어나지는 않는지부터 확인해야 한다. 여기서는 0~2KB 구간이 Code 영역(00)이므로 다른 영역을 침범하고 있지 않으니, 위의 Segment Table을 참고하여 가상 주소 100B가 포함된 코드 영역의 Base인 32K에 100B만큼 더해준 32,868B가 실제 물리 메모리 주소가 된다.

 

Base & Bound 기법에서 주소 변환을 수행하기 전에 이미 점유되고 있는 메모리 공간에 접근하려는 시도가 있을 경우 Out of bounds 예외가 발생한다고 했는데, 여기서도 마찬가지로 각각의 Segment에 Base, Size 쌍이 있어 이 범위를 침범하는 메모리 접근이 있을 경우 Segmentation Fault가 발생하게 된다.

 

- Heap Segment

Code 영역은 Base & Bound와 같은 방법으로 주소 변환이 되어서 놓치기 쉬운데, 그렇다고 해서 주소 공간을 Segment로 나누지 않고 연속된 메모리 공간으로 생각하고 계산하면 Heap의 주소 변환을 잘못 계산하게 된다.

 

예를 들어 가상 주소 공간의 4200B에 해당하는 주소가 Heap Segment(01)에 포함되므로, 그냥 Heap의 Base인 34K에 4200B를 더하면 될 것 같지만 참조하려는 4200B이 Heap Segment의 Base로부터 얼만큼 떨어져 있는지를 계산하여 Offset으로 사용해야 한다.

물리 주소를 알고 싶은 4200B가 주소 공간 안에서 Heap Segment의 Base인 4096B로부터 104B만큼 떨어져 있으므로, 주소 변환시 물리 메모리에서 Heap Segment의 Base인 34KB에 Offset 104B를 더한 34,920B가 주소 변환의 결과가 된다.

 

- Stack Segment

 

주소 공간에서 Stack 영역에 속하는 15KB 주소에 접근한다고 생각해보자. Stack의 시작 지점이 낮은 자리가 아니라 높은 자리이기도 하고, 메모리가 크는(?) 방향도 반대여서 좀 헷갈릴 수도 있는데 Heap segment와 마찬가지로 그냥 Stack Segment의 Base로부터 얼만큼 떨어져 있는지를 생각해보고 계산하면 된다.

 

위에서 16KB 주소 공간을 4개의 Segment로 나누어 Stack segment(11)의 Base를 16KB(14KB 아니다!)로 정했으니, 15KB이 16KB로부터 -1KB만큼 떨어져 있으므로 Offset을 -1KB로 생각하면 된다. 그럼 물리 메모리에서 Stack segment의 Base가 28K이므로, 여기에 -1KB를 더해주면 27KB로 주소 변환이 완료된다.

 

/* 단점 */

외부 단편화 - 세그먼트의 크기가 다르기 때문에, 메모리에 세그먼트를 할당할 때 외부 단편화가 발생할 수 있습니다. 이는 메모리 공간이 사용되지 않으면서도 작은 조각들로 나누어져 비효율적으로 관리되는 문제입니다.

 

 

 

728x90