Frinee의 코드저장소

메모리 관리

by Frinee
이 글은 반효경 저 - "운영체제와 정보기술의 원리"를 공부하고 정리하여 작성하였습니다.

 

 

1. 주소 바인딩

  • 프로그램이 실행을 위해 메모리에 적재될 때 생기는 독자적인 주소공간을 논리적 주소 혹은 가상 주소라고 부름
  • CPU는 프로세스마다 독립적으로 갖는 논리적 주소에 근거해 명령을 실행
  • 논리적 주소는 각 프로세스마다 독립적으로 할당되며 0번지부터 시작
  • 물리적 주소: 물리적 메모리에 실제로 올라가는 위치
  • 물리적 메모리의 낮은 주소 영역에는 운영체제가 올라가고 높은 주소 영역에는 사용자 프로세스들이 올라감
  • 주소 바인딩(address binding): 프로세스의 논리적 주소를 물리적 주소로 연결시켜주는 작업

1.1. 주소 바인딩 방식

  • 프로그램이 적재되는 물리적 메모리의 주소가 결정되는 시기에 따라 분류됨
  1. 컴파일 타임 바인딩(compile time binding)
    • 물리적 메모리 주소가 프로그램을 컴파일할 때 결정되는 방식
    • 프로그램이 절대주소로 적재된다는 뜻에서 절대코드를 생성하는 바인딩 방식이라고도 말함
    • 프로그램이 올라가 있는 물리적 메모리 주소를 변경하기 위해선 컴파일을 다시 해야 함
    • 현대 시분할 방식에선 잘 사용하지 않는 방식
  2. 로드 타임 바인딩(load time binding)
    • 프로그램의 실행이 시작될 때의 물리적 메모리 주소가 결정되는 방식
    • 로더(loader)의 책임 하에 물리적 메모리 주소가 부여됨
    • 프로그램이 종료될 때까지 물리적 메모리 상의 위치가 고정됨
    • 컴파일러가 재배치 가능 코드를 생성한 경우에 가능한 주소 바인딩 방식
    • 로더(loader): 사용자 프로그램을 메모리에 적재시키는 프로그램
  3. 실행시간 바인딩(execution time binding)
    • 프로그램이 실행을 시작한 후에도 그 프로그램이 위치한 물리적 메모리 상의 주소가 변경될 수 있는 방식
    • CPU가 주소를 참조할 때마다 해당 데이터가 물리적 메모리의 위치를 주소 매핑 테이블을 이용해 바인딩을 점검해야 함
    • 기준 레지스터와 한계 레지스터를 포함한 MMU(Memory Management Unit)라는 하드웨어적 지원이 있어야 가능한 방식

1.2. MMU 기법

  • CPU가 특정 프로세스의 논리적 주소를 참조하려 할 때 그 주소값에 기준 레지스터 값을 더해 물리적 주소값을 얻어냄
  • 이때의 기준 레지스터를 재배치 레지스터라고 부르며 프로세스의 물리적 메모리 시작 주소를 갖고 있음
  • 여기선 프로그램의 주소 공간이 물리적 메모리의 한 장소에 연속적으로 적재되는 것을 가정함.
  • 프로그램이 적재되는 물리적 메모리상의 시작 주소만 알면 주소 변환을 쉽게 할 수 있음

    ※ MMU 기법에서 사용자 프로그램이나 CPU는 논리적 주소만 다룸

  • 프로세스는 자신만의 고유한 주소 공간을 갖기 때문에 동일한 주소여도 프로세스에 따라 내용이 달라짐
  • MMU 기법은 문맥교환으로 CPU에서 수행 중인 프로세스가 바뀔 때마다 재배치 레지스터의 값을 그 프로세스에 해당하는 값으로 재설정해줌
  • 여러 프로세스가 동시에 올라가 있는 경우, 다른 프로그램의 영역을 침범할 수 있어 메모리 보안에 문제가 발생
  • 이를 방지하기 위해 운영체제는 한계 레지스터(limit register)를 사용하여 자신의 주소 공간을 넘어가는지를 체크.

2. 메모리 관련 용어

2.1. 동적로딩

  • 다중 프로그래밍 환경에서 메모리 사용의 효율성을 높이기 위해 사용하는 기법
  • 동적로딩에서는 프로세스가 시작될 때 그 프로세스의 주소 공간 전체가 메모리에 올라가지 않고 실행이 필요한 부분만 메모리에 적재하는 방식
  • 프로세스 내의 실행이 필요한 부분이 실제로 불릴 때마다 메모리를 적재하는 것을 말함
  • 실제 프로그램 코드 중 상당은 오류 처리루틴과 같이 특수한 경우에 가끔 사용되는 방어용 코드
  • 그래서 프로세스 주소 공간 전체를 물리적 메모리를 올리는 경우 메모리 낭비가 심해짐

2.2. 동적연결

  • 연결(linking): 소스 코드를 컴파일하여 생성된 목적 파일과 라이브러리 파일들을 묶어 하나의 실행 파일을 생성하는 과정
  • 동적연결은 목적 파일과 라이브러리 파일 사이의 연결을 프로그램의 실행 시점까지 지연시키는 기법
  • 정적연결에서는 코드와 라이브러리 코드가 모두 합쳐져서 실행파일이 생성
  • 따라서 실행파일 크기가 크고 동일한 라이브러리를 각 프로세스별로 메모리에 적재하게 되어 메모리 낭비가 심함
  • 동적연결은 라이브러리가 실행 시점에 연결되고 실행파일의 라이브러리 호출 부분에 해당 라이브러리를 찾기 위한 스텁(stub) 코드를 둔다.
  • 스텁을 통해 해당 라이브러리가 메모리에 존재하는 경우 참조하고,그렇지 않은 경우 디스크에서 동적 라이브러리 파일을 찾아 적재한 후 수행
  • 동적연결에서는 다수의 프로그램이 공통으로 사용하는 라이브러리를 한 번만 적재하여 메모리 사용의 효율을 높일 수 있음

2.3. 중첩

  • 프로세스의 주소 공간을 분할해 실제 필요한 부분만을 메모리에 적재하는 기법
  • 중첩은 초창기의 컴퓨터 시스템에서 물리적 메모리 크기 제약 때문에 단일 프로세스 주소 공간을 분할해서 필요한 부분만 올려서 실행하는 기법에서 시작됨
  • 중첩은 운영체제 지원 없이 프로그래머가 직접 구현했고 이런 이유로 수작업 중첩이라고도 부름

2.4. 스와핑

  • 메모리에 올라온 프로세스의 주소 공간 전체를 디스크의 스왑 영역에 일시적으로 내려놓는 것
  • 스왑 영역(swap area): 혹은 백킹스토어(backing store), 디스크 내의 파일 시스템과는 별도로 존재하는 일정 영역
  • 파일 시스템과는 다르게 스왑 영역은 프로세스가 수행 중인 동안에만 디스크에 일시적으로 저장하는 공간
  • 스왑 영역은 다수의 사용자 프로세스를 담아야 하기에 충분히 커야하고 접근 속도도 보장되어야 함
  • 스와핑은 특정한 이유로 수행 중인 프로세스의 주소 공간을 일시적으로 메모리에서 디스크로 내려놓는 것을 말함.
    • 스왑 인(swap in): 디스크 → 메모리
    • 스왑 아웃(swap out): 메모리 → 디스크
  • 스와핑 과정
    1. 스와퍼(중기 스케줄러)에 의해 스왑 아웃시킬 프로세스 선정
    2. 선정된 해당 프로세스는 현재 메모리에 올라가 있는 주소 공간의 내용을 통째로 디스크 스왑영역에 스왑 아웃시킴
  • 스와핑의 역할은 메모리에 올라간 프로세스 수를 조절하는 것
  • 스왑 아웃된 프로세스를 다시 스왑 인 시키는 경우
    • 컴파일 타임 바인딩, 로드 타임 바인딩: 원래 존재하던 메모리 위치에 올려야 함
    • 실행시간 바인딩: 빈 메모리 아무 위치나 올릴 수 있음
  • 디스크 내의 스왑영역에서 프로세스 주소 공간이 순차적으로 저장됨
  • 스와핑 소요 시간은 데이터를 읽고 쓰는 전송 시간이 대부분을 차지함.

 

3. 물리적 메모리 할당 방식

  • 물리적 메모리는 운영체제 상주 영역과 사용자 프로세스 영역으로 나누어 사용
  • 운영체제 상주영역
    • 인터럽트 벡터와 함께 물리적 메모리의 낮은 주소 영역 사용
    • 운영체제 커널이 위치함
  • 사용자 프로세스 영역
    • 물리적 메모리의 높은 주소 영역을 사용
    • 여러 사용자 프로세스들이 적재됨
  • 프로세스를 메모리에 올리는 방식에 따라 연속할당 방식과 불연속할당 방식으로 나뉨

3.1. 연속할당 방식

  • 각각의 프로세스를 물리적 메모리의 연속적인 공간에 올리는 방식
  • 물리적 메모리를 다수의 분할로 나누어 하나의 분할에 하나의 프로세스가 적재됨
  • 분할을 관리하는 방식에 따라 가변분할과 고정분할로 나뉨
  1. 고정분할(fixed partition allocation)
    • 물리적 메모리를 고정된 크기의 분할로 미리 나누어두는 방식
    • 분할하는 크기는 조절할 수 있고 분할된 공간은 하나의 프로그램만 적재할 수 있음
    • 외부조각(external fragmentation): 프로그램의 크기보다 분할의 크기가 작아 비어있는데도 적재하지 못해 발생하는 메모리 공간
    • 내부조각(internal fragmentation): 프로그램의 크기가 분할의 크기보다 작아 적재하고 남는 메모리 공간
  2. 가변분할(variable partition allocation)
    • 분할을 미리 나누어 놓지 않은 채 프로그램이 실행되고 종료되는 순서에 따라 분할을 관리하는 방식
    • 프로그램의 크기를 고려해서 메모리를 할당하고 관리할 수 있는 기법이 필요
    • 메모리에 존재하는 프로그램이 종료될 경우 중간에 빈 공간이 발생하며 이 공간이 새로 시작하는 프로그램보다 작은 경우 외부조각이 발생할 수 있음
    • 동적 메모리 할당 문제(dynamic storage-allocation problem): 주소의 공간 크기가 n인 프로세스의 경우 메모리에 올릴 때 어떤 위치에 올릴 지에 대한 문제
    • 컴팩션(compaction)
      • 물리적 메모리 중에서 프로세스에 의해 사용 중인 메모리 영역을 한쪽으로 몰고 가용 공간들을 한쪽으로 모아 큰 가용공간을 만드는 방법
      • 현재 수행 중인 프로세스의 메모리상 위치를 상당 부분 이동시키기에 비용이 많이 듦
      • 가급적 적은 수의 메모리 이동으로 효율적인 컴팩션을 수행해야 함
      • 이는 프로세스 주소가 동적으로 바뀔 수 있는 실행시간 바인딩 방식에서만 지원

3.2. 동적 메모리 할당 문제

  1. 최초적합(first-fit)
    • 크기가 n 이상인 가용 공간 중 가장 먼저 찾아지는 곳에 할당하는 방법
    • 시간적인 면에서 효율적
  2. 최적적합(best-fit)
    • 크기가 n 이상인 가장 작은 가용 공간을 찾아 할당하는 방법
    • 크기순으로 정렬되어 있지 않은 경우 모든 공간을 탐색해야 하므로 시간적 오버헤드 발생
    • 공간적인 면에서 효율적
  3. 최악적합(worst-fit)
    • 가용 공간 중 가장 크기가 큰 곳에 새로운 프로그램을 할당하는 방법
    • 가용 공간 리스트를 탐색해야 하는 오버헤드가 발생
    • 더 큰 프로그램을 담을 수 있는 가용 공간을 소모하는 것이 문제

3.3. 불연속할당 방식

  • 하나의 프로세스를 물리적 메모리의 여러 영역에 분산해 적재하는 방식
  • 페이징(paging) 기법: 각 프로세스의 주소 공간을 동일한 크기의 페이지로 잘라서 메모리에 페이지 단위로 적재시키는 방법
  • 세그먼테이션(segmentation) 기법: 프로그램의 주소 공간을 코드, 데이터, 스택 등 의미 있는 단위인 세그먼트로 나누어 적재하는 기법
  • 페이지드 세그먼테이션(paged segmentation) 기법: 세그먼트 하나를 다수의 페이지로 구성하는 기법

 

4. 페이징 기법

4.1. 특징

  • 프로세스의 주소 공간을 동일한 크기의 페이지 단위로 나누어 물리적 메모리의 서로 다른 위치에 페이지를 저장하는 방식
  • 각 프로세스의 주소 공간 전체를 물리적 메모리에 올릴 필요가 없고 혼재하여 저장이 가능
  • 페이징 기법에서는 물리적 메모리를 페이지와 동일한 크기의 프레임으로 미리 나눔
  • 메모리에 올리는 단위 = 페이지 단위
  • 메모리를 같은 크기로 미리 분할했더라도 빈 프레임이 있으면 어떤 위치든 사용될 수 있음
  • 그렇기 때문에 동적 메모리 할당 문제가 발생하지 않는 장점이 있음
  • 페이징 기법은 하나의 프로세스라 해도 페이지 단위로 물리적 메모리에 올라가는 위치가 상이함
  • 그래서 논리적 주소 → 물리적 주소 변환 작업이 페이지 단위로 이루어져 주소 변환이 복잡함
  • 모든 프로세스가 각각의 주소 변환을 위한 페이지 테이블을 갖고 있고 이는 프로세스가 가질 수 있는 페이지 개수만큼 주소 변환 엔트리를 갖고 있음
  • 프로그램 크기가 항상 페이지 크기의 배수가 되지는 않기 때문에 제일 마지막에 위치한 페이지는 내부조각이 발생할 수 있음

4.2. 주소 변환 기법

  • CPU가 사용하는 논리적 주소를 페이지 번호(p)페이지 오프셋(d)으로 나누어 주소 변환에 사용
  • 페이지 번호는 페이지 테이블 접근 시 인덱스(index)로 활용
  • 인덱스의 항목(entry)은 그 페이지의 물리적 메모리상의 기준 주소, 즉 시작 위치가 저장됨
  • 페이지 오프셋은 하나의 페이지 내에서의 변위(displacement)를 알려줌
  • 따라서 기준 주소값에 변위를 더하여 논리적 주소에 대응되는 물리적 주소를 구함

4.3. 페이지 테이블 구현

  • 페이징 기법에서 주소 변환을 위한 자료구조로 물리적 메모리에 위치함
  • CPU에서 실행 중인 프로세스의 페이지 테이블에 접근하기 위해 페이지 테이블 기준 레지스터페이지 테이블 길이 레지스터를 사용함.
  • 페이지 테이블 기준 레지스터: 메모리 내에서의 페이지 테이블의 시작 위치
  • 페이지 테이블 길이 레지스터: 페이지 테이블의 크기 보관
  • 페이징 기법에서 메모리 접근 연산은 두 번의 메모리 접근을 필요로 한다.
    1. 주소 변환을 위해 페이지 테이블에 접근
    2. 변환된 주소에서 실제 데이터에 접근

4.3.1. TLB(Translation Look-aside Buffer)

  • 고속 주소변환용 하드웨어 캐시
  • 메모리에 접근 시의 오버헤드를 줄이고 메모리 접근 속도를 향상하기 위해 사용
  • TLB로 사용되는 하드웨어는 가격이 비싸 빈번히 참조되는 페이지에 대한 주소 변환 정보만 담음
  • 요청된 페이지 번호가 TLB에 존재하면 곧바로 프레임 번호를 얻고, 그렇지 않은 경우 페이지 테이블로 가서 프레임 번호를 얻음

※ 문맥 교환 시 TLB의 이전 프로세스의 주소 변환 정보는 모두 지워짐

  • 주소 저장 정보 비교 (페이지 테이블 vs TLB)
    • 페이지 테이블
      • 하나의 프로세스를 구성하는 모든 페이지에 대한 주소 변환 정보가 페이지 번호에 따라 순차적으로 포함됨
      • 페이지 번호가 주어질 시 페이지 테이블에 접근해 프레임 번호를 얻을 수 있음
    • TLB
      • [페이지번호-프레임번호]가 쌍으로 저장되야 함
      • 해당 페이지에 대한 주소 변환 정보를 찾기 위해 전체를 탐색하기 때문에 오버헤드 발생
      • 오버헤드를 줄이기 위해 병렬탐색이 가능한 연관 레지스터를 사용

※ 병렬탐색 기능: 모든 항목을 동시에 탐색할 수 있는 기능

 

연관 레지스터 사용 시 평균 메모리 접근 시간(Effective Access Time:EAT)

더보기
  • 메모리 접근 시간 = 1
  • ε: 연관 레지스터 접근 시간
  • α: 요청 페이지에 대한 정보가 연관 레지스터에 존재할 확률

$$ EAT = (1+\varepsilon)\alpha + (2+\varepsilon)(1-\alpha) = 2 + \varepsilon - \alpha $$

4.4. 계층적 페이징

  • 현대의 컴퓨터는 용량이 커지면서 페이지 테이블 항목도 커짐
  • 이로 인한 페이지 테이블에 사용되는 메모리 공간의 낭비를 줄이기 위해 2단계 페이징 기법 사용
  • 2단계 페이징 기법에서는 외부 페이지 테이블내부 페이지 테이블을 사용
  • 사용되지 않는 주소 공간에 대해서 외부 페이지 테이블의 항목을 NULL로 설정하고 여기에 대응하는 내부 페이지 테이블을 생성하지 않으면서 메모리를 절약
  • 2단계 페이징 기법을 사용하면 페이지 테이블 생성에 쓰이는 메모리를 절약
  • 하지만 주소 변환을 위해 접근해야 하는 페이지 테이블 수가 증가하여 시간적 손해가 생김

4.4.1. 2단계 페이징의 주소 변환

  • 프로세스의 논리적 주소를 두 종류의 페이지 번호(P1,P2)와 페이지 오프셋(d)로 구분
    • P1: 외부 페이지 테이블 인덱스
    • P2: 내부 페이지 테이블 인덱스
    • 논리적 주소를 <P1, P2, d>로 표시
  1. 외부 페이지 테이블로부터 P1만큼 떨어진 위치에서 내부 페이지 테이블의 주소를 얻음
  2. 내부 페이지 테이블로부터 P2만큼 떨어진 위치에서 요청된 페이지가 존재하는 프레임 위치를 얻음
  3. 해당 프레임으로부터 d만큼 떨어진 곳에서 원하는 정보에 접근

 

페이지 번호와 페이지 오프셋을 위한 비트 할당

더보기
  • 32비트 주소 체계 시스템
  • 페이지 하나의 크기가 4KB
  • 페이지 테이블 항목 크기 4Byte
  • 프로세스 주소 공간이 커질수록 페이지 테이블의 크기도 커져 메모리 공간 낭비가 커짐
  • 그래서 3단계,4단계에 이르는 다단계 페이지 테이블이 필요
  • 다단계 페이지 테이블을 사용하면 메모리 공간 소모를 줄일 수 있지만 메모리 접근 횟수가 늘어남
  • TLB를 사용하면 다단계 페이징의 공간적 이득과 메모리 접근시간도 많이 늘어나지 않아 시간 효율성도 얻을 수 있음

ex) 연관 레지스터 사용 시 평균적인 메모리 접근시간 계산

더보기
  • 다단계 페이징: P = 4
  • 메모리 접근시간: M = 100ns
  • TLB 접근시간: T = 20ns
  • 주소변환정보가 TLB에 존재할 확률: α = 98%

$$ EAT = \alpha \times (M+T) + (1-\alpha) \times [(P+1)\times M + T]\\
= 0.98 \times 120 + 0.02 \times 520 = 128(ns) $$

4.5. 역페이지 테이블

  • 메모리 공간 낭비가 심한 이유는 모든 프로세스의 모든 페이지에 대해 페이지 테이블 항목을 다 구성해야 하기 때문
  • 역페이지 테이블 기법은 물리적 메모리의 페이지 프레임 당 페이지 테이블에 하나의 항목을 두는 방식
  • 즉, 물리적 주소에 대해 페이지 테이블을 만들고 시스템 전체에 페이지 테이블을 하나만 두는 방법
  • 페이지 테이블의 각 항목은 프로세스 번호(pid)와 프로세스 내 논리적 페이지 번호(p)를 담고 있음
  • 물리적 주소를 활용해 논리적 주소를 얻는 구조이기 때문에 주소 변환 과정은 다소 비효율적
  • 주소 변환 요청이 들어오면 해당 페이지가 물리적 메모리에 존재하는지 확인하기 위해 페이지 테이블 전체를 다 탐색해야 함.
  • 역페이지 테이블은 일반적으로 연관 레지스터에 보관해 테이블 전체 항목에 대한 병렬탐색을 활용하여 시간을 단축시킴

4.6. 공유 페이지

  • 공유 코드(shared code): 메모리 공간의 효율적인 사용을 위해 여러 프로세스에 의해 공통으로 사용될 수 있도록 작성된 코드
  • 재진입 가능 코드 혹은 순수 코드라 부리며 읽기전용의 특성을 가짐
  • 공유 페이지는 공유 코드를 담고 있는 페이지를 말함.
  • 공유 페이지는 여러 프로세스를 물리적 메모리 하나에 적재하여 메모리를 효율적으로 사용하게 함
  • 공유 코드는 모든 프로세스의 논리적 주소 공간에서 동일한 위치에 존재해야 하는 제약점이 있음
  • 사유 페이지: 프로세스들이 공유하지 않고 프로세스별로 독자적으로 사용하는 페이지(위치 무방)

4.7. 메모리 보호

  • 페이지 테이블 각 항목에는 메모리 보호를 위한 보호 비트와 유효-무효 비트를 두고 있음
  • 보호 비트(protection bit)
    • 각 페이지에 대해 어떠한 접근 권한을 허용하는 지에 대한 정보가 담김
    • 각 페이지에 대해 읽기-쓰기/읽기쓰기 전용 등의 접근 권한을 설정하는 데 사용
  • 유효-무효 비트(valid-invalid bit)
    • 해당 페이지 내용이 유효한지에 대한 내용이 담겨 있음
    • 유효(valid): 해당 메모리 프레임에 그 페이지가 존재함, 접근이 허용
    • 무효(invalid): 프로세스가 그 주소를 쓰지 않거나 페이지가 물리적 메모리에 없고 백킹스토어에 존재하여 접근 권한이 없음

 

5. 세그먼테이션

  • 프로세스의 주소 공간을 의미 단위인 세그먼트(segment)로 나누어 물리적 메모리에 올리는 기법
  • 하나의 프로세스를 구성하는 주소 공간은 일반적으로 코드(code), 데이터(data), 스택(stack) 등의 의미 있는 단위로 구분됨
  • 세그먼트는 주소 공간을 기능 단위 또는 의미 단위로 나눈 것을 뜻하고 그래서 크기가 제각각임
  • 프로세스의 주소 공간이 나누어져 각각 메모리에 적재되는 특징이 있음
  • 크기가 균일하지 않은 세그먼트들은 메모리에 적재하는 부가적인 관리 오버헤드가 발생
  • 크기가 제각각이어서 물리적 메모리 관리에서 외부조각이 발생
  • 그리고 어느 가용 공간에 할당할 것인지에 대한 문제가 발생함
    • 최초적합(first fit): 해당 세그먼트 크기보다 크거나 같은 첫번째 가용공간에 할당
    • 최적적합(best fit): 세그먼트의 크기보다 크거나 같은 공간 중 가장 작은 공간에 할당

5.1. 세그먼테이션 기법에서의 주소 변환

  • 논리적 주소가 <세그먼트 번호, 오프셋>으로 나뉘어 사용
  • 세그먼트 테이블을 사용하여 관리하고 기준점(base)와 한계(limit) 항목을 가짐
    • 기준점(base): 물리적 메모리에서 그 세그먼트의 시작 위치
    • 한계(limit): 그 세그먼트의 길이
  • 세그먼트 길이가 균일하지 않기 때문에 세그먼트 길이 정보를 담고 있어야 함.
  • 세그먼트 테이블 기준 레지스터세그먼트 테이블 길이 레지스터를 사용함.
    • 세그먼트 테이블 기준 레지스터(Segment-Table Base Register: STBR)
      • 현재 CPU에서 실행 중인 프로세스의 세그먼트 테이블이 메모리의 어느 위치에 있는지 시작 주소를 담고 있음
    • 세그먼트 테이블 길이 레지스터(Segment-Table Length Register: STLR)
      • 프로세스의 주소 공간이 총 몇 개의 세그먼트로 구성되는지, 즉 세그먼트 개수를 나타냄
  • 확인 사항
    1. 요청된 세그먼트 번호가 STLR에 저장된 값보다 작은가?
    2. 논리적 주소의 오프셋 값이 그 세그먼트의 길이보다 작은 값인가?
  • 보호비트는 각 세그먼트에 대해 읽기/쓰기/실행 등의 권한을 나타냄
  • 유효비트는 각 세그먼트의 주소 변환 정보가 유효한지, 즉 해당 세그먼트가 현재 물리적 메모리에 적재되어 있는지를 나타냄

5.2. 공유 세그먼트

  • 여러 프로세스가 특정 세그먼트를 공유해 사용하는 개념을 말함
  • 의미 단위로 나누어져 공유와 보안 측면에서 훨씬 효과적임
  • 공유하려는 코드와 사유 데이터 영역이 동일 페이지에 존재하는 경우가 발생하지 않음

 

6. 페이지드 세그먼테이션

  • 페이징 기법과 세그먼테이션 기법의 장점만을 취한 방식
  • 프로그램을 의미 단위의 세그먼트로 나눔
  • 세그먼트를 반드시 동일한 크기 페이지들의 집합으로 구성하고 페이지 단위로 물리적 메모리에 적재함
  • 즉, 하나의 세그먼트 크기를 페이지 크기의 배수가 되도록 하면서 외부조각의 문제점을 해결
  • 그리고 세그먼트 단위로 프로세스 간 공유나 프로세스 내의 접근 권한 보호가 이루어지도록 하여 페이징 기법의 약점을 해소

6.1. 페이지드 세그먼테이션 주소 변환

  • 주소 변환을 위해 외부의 세그먼트 테이블과 내부 페이지 테이블을 둔다
  • 세그먼트가 여러 개의 페이지로 구성되므로 각 세그먼트마다 페이지 테이블을 가질 수 있음
  • 논리적 주소는 <세그먼트 번호, 오프셋>으로 구성됨
  1. 논리적 주소의 상위 비트인 세그먼트 번호를 통해 세그먼트 테이블의 해당 항목에 접근
  2. 세그먼트 항목에는 세그먼트 길이세그먼트 테이블 시작 주소가 들어 있음
  3. 세그먼트 길이값과 논리적 주소 중 하위비트인 오프셋과 비교함
  4. 만약 오프셋이 더 크면 유효하지 않은 것이므로 트랩 처리
  5. 그렇지 않은 경우 오프셋 값을 다시 상위/하위 비트로 나눔
    • 상위 비트는 그 세그먼트 내에서 페이지 번호로 사용
    • 하위 비트는 페이지 내의 변위로 사용
  6. 상위비트의 페이지 번호를 통해 물리적 메모리의 페이지 프레임 위치를 얻음
  7. 이 위치에서 페이지 내 변위만큼 떨어진 곳이 바로 원하는 물리적 메모리 주소이다.

 

자료

  • 운영체제와 정보기술의 원리 (반효경 저, 2020.5)

'[컴퓨터 과학자 스터디] > 운영체제' 카테고리의 다른 글

디스크 관리  (0) 2024.11.11
가상 메모리  (0) 2024.11.07
CPU 스케줄링  (0) 2024.10.27
프로세스 관리  (0) 2024.10.22
프로그램의 구조와 실행  (0) 2024.10.21

블로그의 정보

프리니의 코드저장소

Frinee

활동하기