OS는 할껀데 핵심만 합니다. 15편 가상 메모리, 세그먼테이션, 세그먼테이션-페이징 혼용 기법

1

OS

목록 보기
15/17

세그먼테이션 기법

세그멘테이션 기법은 가변 분할 방식을 이용한 가상 메모리 관리 기법으로, 물리 메모리를 프로세스의 크기에 따라 가변적으로 나누어 사용한다. 세그먼테이션 기법에서 가상 주소를 물리 주소로 변환하는 방법과 매핑 테이블 관리 방법을 살펴보자.

1. 세그먼테이션 기법

세그먼테이션 기법은 프로세스의 메모리 부분을 가변적으로 여러 개로 나뉘어 물리 메모리에 비연속적으로 할당하는 방식이다. 가령 다음의 예제를 보자.

프로세스 K는 프로세스 A, B, C, D로 이루어져 있다고 하자. 이들은 모두 크기가 다르므로 세그먼트로 나누어 메모리에 할당하면 다음과 같다.

위 그림은 세그먼테이션 기법에서 가상 주소가 물리 주소로 변환되는 과정을 보여준다. 페이징 기법과 마찬가지로 세그먼테이션 기법도 매핑 테이블을 사용하는데, 이를 세그먼테이션 테이블 또는 세그먼테이션 매핑 테이블이라고 한다.

세그먼테이션 테이블에는 세그먼테이션 크기를 나타내는 limit와 물리 메모리 상의 시작 주소를 나타내는 address가 있다. 페이징 기법에서는 메모리를 같은 크기의 페이지 단위로 분할하기 때문에 매핑 테이블에 크기 정보를 유지할 필요가 없다. 하지만 세그먼테이션 기법에서는 프로세스의 크기에 따라 메모리를 분할하기 때문에 매핑 테이블에 크기 정보를 포함한다. 각 세그먼트가 자신에게 주어진 메모리 영역을 넘어가면 안되기 때문에 세그먼트의 크기 정보에는 크기를 뜻하는 'size'대신 제한을 의미한 'limit'을 사용한다.

2. 세그먼테이션 기법의 주소 변환

세그먼테이션 기법에서는 가상 주소를 VA=<S,D>로 표현한다. 여기서 S는 세그먼트 번호(segment number), D는 세그먼트 시작 지점에서 해당 주소까지의 거리(address)를 의미한다. 가상 메모리 시스템에서 사용자에게 보이는 메모리는 항상 0부터 시작하므로 페이징 기법이든 세그먼테이션 기법이든 D는 사용자가 지정한 주소 그 자체이다.

위 그림은 세그먼트테이션 기법에서 가상 주소를 물리 주소로 변환하는 과정을 보여준다. 그림에서는 생략되었지만, 프로세스 A는 세그먼트 0, 프로세스 B는 세그먼트 1, 프로세스 C는 세그먼트 2로 분할되어있다.

위 그림에서 프로세스 A의 32번지에 접근할 때 주소 변환 과정은 다음과 같다.

  1. 먼저 가상 주소를 구한다. 프로세스 A는 세그먼트 0으로 분할되었으므로, S는 0이고, D는 32이다. 따라서 가상 주소는 VA=<0,32>이다.
  2. 세그먼테이션 테이블에서 세그먼트 0의 시작 주소를 알아낸 후 시작 주소 120에 거리 32를 더하여 물리 주소 152번지를 구한다. 이떄 메모리 관리자는 거리가 세그먼트의 크기보다 큰 지 검사한다. 만약 크다면 메모리를 벗어나는 것이므로 메모리 오류를 출력하고 해당 프로세스를 강제 종료한다. 크지 않다면 물리 주소를 구한다.
  3. 물리 주소 152번지에 접근하여 원하는 데이터를 읽거나 쓴다.

세그먼테이션 테이블의 limit은 메모리를 보호하는 역할을 한다. 만약 사용자가 280B를 사용하겠다고 선언한 프로세스 A의 크기보다 더 큰 주소에 접근하려고하면, 메모리 관리자는 해당 프로세스를 강제 종료하는데, 이때 발생하는 오류를 트랩(trap)이라고 한다. 트랩은 자신의 영역을 벗어나는 주소에 접근하거나 숫자를 0으로 나누는 것과 같이 사용자가 의도치 않게 일으키는 인터럽트를 말한다. 트랩이 발생하면 운영체제는 사용자에게 세그먼테이션 오류(segmentation fault) 메시지를 보낸다.

트랩과 반대로 사용자가 강제로 crtl + c키를 눌러 프로세스를 중지시키는 것과 같이 사용자가 의도한 인터럽트를 시그널(signal)이라고 한다. 시그널은 외부 인터럽트 중 하나이다.

3. 세그먼테이션-페이징 혼용 기법

페이징 기법과 세그먼테이션 기법은 각각 장단점을 가지고 있다. 페이징 기법은 물리 메모리를 같은 크기로 나누어 관리하기 때문에 메모리 관리가 수월한 반면 페이지 테이블의 크기가 크다. 또한 세그먼테이션 기법은 페이지 테이블의 크기를 작게 유지할 수 있으냐 물리 메모리의 외부 단편화로 인해 추가적인 관리가 불가피하다. 세그먼테이션-페이징 혼용 기법은 이 두 기법의 장점만 취한 가상 메모리 관리 기법이다.

3-1. 메모리 접근 권한

메모리 접근 권한은 메모리의 특정 번지에 저장된 데이터를 사용할 수 있는 권한으로 읽기(read), 쓰기(write), 실행(execute), 추가(append) 권한이 있다. 이 네 가지 권한은 복합적으로 사용되는데, 예를 들면 일반적인 데이터에는 읽기 및 쓰기 권한이 적용되고, 상수나 읽기 전용 파일에는 읽기 권한이 적용된다. 또한 일반적인 코드 영역에는 읽기 및 실행 권한이 적용된다.

구분읽기쓰기실행비고
모드 0XXX접근 불가
모드 1XXO실행만 가능
모드 2XOX실제로 사용하지 않음
모드 3XOO실제로 사용하지 않음
모드 4OXX읽기 전용
모드 5OXO읽고 실행 가능
모드 6OOX일고 쓰기 가능
모드 6OOO제한 없음

이론상으로는 네 가지 메모리 접근 권한을 모두 조합하면 16(2^4)가지 메모리 제어 방식(access control modes)이 나온다. 그러나 추가 권한의 경우 해당 데이터의 마지막에 새로운 데이터를 추가하는 것이므로 항상 쓰기 권한이 동반되어야 한다. 즉 쓰기 권한 없이 추가 권한을 사용할 수 없다. 따라서 추가 권한을 쓰기 권한과 같이 취급한다. 결론적으로 메모리 접근 권한을 모두 조합하면 8가지 접근 방식이 나온다. 읽기 권한 없이 쓰기를 하는 경우는 거의 없기 때문에 실제로 모드 2와 3은 쓰이지 않는다.

위 그림은 프로세스의 영역별 메모리 접근 권한을 나타낸 것이다. 프로세스는 몸체에 해당하는 코드 영역, 프로세스가 사용하는 데이터를 저장하는 데이터 영역(전역 변수 등을 담음), 프로세스가 실행하는 데 필요한 스택, 힙 영역과 프로세스 제어 블럭(PCB)로 구성된다.

코드 영역과 데이터 영역의 접근 권한은 다음과 같다.

  1. 코드 영역: 자기 자신을 수정하는 프로그램은 없기 때문에 읽기 및 실행 권한을 가진다.
  2. 데이터 영역: 데이터는 크게 읽거나 쓸 수 있는 데이터와 읽기만 가능한 데이터로 나눌 수 있다. 일반적인 변수는 읽거나 쓸 수 있으므로, 읽기 및 쓰기 권한을 가지지만 상수(const)로 선언한 변수는 읽기 권한만 가진다.

메모리 접근 권한 검사는 가상 주소에서 물리 주소로 주소 변환이 일어날 때마다 시행된다. 만약 읽기만 가능한 메모리 영역에 쓰기를 하려고 하면 메모리 오류인 트랩이 발생한다. 페이징 기법이든, 세그먼테이션 기법이든 매핑 테이블에 이러한 메모리 접근 권한에 대한 정보를 가지고 있으며, 주소 변환이 일어날 때마다 유용한 접근인지 아닌지 검사한다.

3-2. 세그먼테이션-페이징 혼용 기법의 도입

위 그림은 페이징 기법에서 메모리 접근 권한까지 고려하여 페이지 테이블을 나타낸 것이다. 페이지마다 접근 권한이 다르기 때문에 페이지 테이블의 모든 행에는 메모리 접근 권한과 관련된 권한 비트(right bit)가 추가된다. 메모리 관리자는 주소 변환이 이루어질 때마다 페이지 테이블의 권한 비트를 이용하여 유용한 접근인지 아닌지 확인한다.

페이지 테이블에 권한 비트가 추가되면 페이지 테이블의 크기가 커진다. 이는 인접한 페이지의 메모리 접근 권한이 같은 경우가 많은데도 불구하고 페이지마다 권한 비트를 설정하여 메모리를 낭비하는 요소가 된다. 이러한 문제를 완화하려면 반복되는 권한 비트를 줄여야 한다.

권한 비트 추가에 따라 페이지 테이블이 커지는 문제는 세그먼테이션 테이블을 이용하여 해결할 수 있다.

위 그림은 세그먼테이션 테이블을 추가한 것이다. 페이지로 분할된 가상 주소 공간에서 서로 관련 있는 영역을 하나의 세그먼트로 묶어 세그먼테이션 테이블로 관리하고, 각 세그먼트를 구성하는 페이지를 해당 페이지 테이블로 관리하는 방식이다. 각 세그먼테이션 테이블은 자신과 연결된 페이지 테이블의 시작 주소를 가진다. 이와 같이 페이징 기법에 세그먼테이션 테이블을 추가하고, 권한 비트와 같이 중복되는 데이터를 세그먼테이션 테이블로 옮겨 오면 테이블의 크기를 줄일 수 있다. 이렇게 페이징 기법과 세그먼테이션 기법을 혼합하여 사용하면 순수 페이징 기법과 순수 세그먼테이션 기법의 장점만 취함으로써 메모리 관리를 효율적으로 할 수 있는데, 이를 세그먼테이션-페이징 혼용 기법이라고 한다. 현재 대부분의 운영체제는 이 방식을 사용하고 있다.

세그먼테이션-페이징 혼용 기법을 사용함에 따라 줄어드는 데이터에는 권한 비트만 있는 것이 아니다. 유닉스 운영체제의 경우 데이터의 소유 권한과 접근 권한이 같이 명시되어 있다. 어떤 파일이든 소유자가 지닌 권한 외에 자신이 속한 그룹이 지닌 권한, 자신의 그룹에 속하지 않은 다른 사람이 지닌 권한이 명시되어 있다. 순수 페이징 기법에서는 이러한 특성을 반영하기 위해 모든 페이지 테이블에 새로운 속성 필드를 추가해야 하지만, 세그먼테이션-페징 혼용 기법의 경우 이러한 정보를 세그먼테이션 테이블에서 관리함으로써 추가되는 데이터의 양을 줄일 수 있다.

3-3. 세그먼테이션-페이징 혼용 기법의 주소 변환

위 그림은 세그먼테이션-페이징 혼용 기법을 이용한 가상 메모리 시스템의 전체 구조를 보여준다. 왼쪽 그림은 사용자 관점에서 본 메모리 구조이고, 오른쪽 그림은 메모리 관리자 관점에서 본 메모리 구조이다. 사용자 입장에서는 기본적으로 세그먼테이션 기법을 사용하고 메모리 관리자 입장에서는 페이징 기법을 사용한다. 순수 페이징 기법을 사용하면 중복되는 데이터로 페이지 테이블이 커지기 때문에 현대의 메모리 관리는 페이징 기법과 세그먼테이션 기법을 조화롭게 혼합하여 사용하고 있다.

세그먼테이션-페이징 혼용 기법에서는 가상 주소를 VA=<S,P,D>로 표현한다. 여기서 S는 세그먼트 번호, P는 페이지 번호, D는 페이지 처음 위체에서 해당 주소까지의 거리를 의미한다. 이는 페이징 기법의 가상 주소 VA=<P,D>에 세그먼트 번호 S가 추가된 것이다.

세그먼테이션-페이징 혼용 기법에서 가상 주소를 물리 주소로 변환하는 과정은 다음과 같다.

  1. 사용자가 어떤 주소에 있는 데이터를 요청하면 해당 주소가 몇 번째 세그먼트의 몇 번째 페이지로 부터 얼마나 떨어져 있는지 계산하여 가상 주소 VA=<S,P,D>를 구한다.
  2. 세그먼테이션 테이션 테이블의 해당 세그먼트 번호로 가서 자신의 영역을 벗어나는 불법 접근이 아닌지, 권한이 없는 페이지에 접근하는 것은 아닌지 등을 확인한다. 만약 권한이 없는 페이지에 접근하거나, 자신에게 주어진 메모리 영역을 벗어나면 세그먼테이션 오류(트랩)을 발생시켜 프로세스를 강제 종료하고, 그렇지 않으면 연결된 페이지 테이블로 간다.
  3. 페이지 테이블에 해당 페이지가 어느 프레임에 저장되어있는지 찾는다. 만약 물리 메모리에 프레임이 있다면 메모리에 바로 접근하고, 없다면 스왑 영역에 가서 해당 페이지를 물리 메모리로 가져온다.
  4. 물리 메모리에 있는 프레임의 처음 위치에서 D만큼 떨어진 곳에 접근하여 데이터를 읽거나 쓴다.

세그먼테이션 테이블에는 해당 페이지 테이블의 시작 주소가 기록되어있다. 따라서, 특정 가상 주소 접근 시 세그먼테이션 테이블을 통과하면 페이지 테이블을 이용하여 가상 주소가 물리 주소로 바뀐다. 이를 정리하면, 사용자가 특정 주소를 요청했을 때 세그먼테이션 테이블에서 오류가 없는 지, 또 접근 권한을 가지고 있는 지를 확인하고, 이를 통과하면 연결된 페이지 테이블로 가서 원하는 프레임을 찾는다. 만약 원하는 페이지가 물리 메모리에 없으면 스왑 영역에 해당 페이지를 가져온다.

0개의 댓글