본문 바로가기

OS

[OS] 가상 메모리 : 페이징과 세그먼테이션

 

가상 메모리를 위해서는

  • 모든 프로그램들은 작은 조각들로 나눠지게 되는데, 조각들의 크기를 모두 같도록 하면 한 조각을 페이지(Page)라 부르고, 서로 다르게 하면 조각들 각각을 세그먼트(Segment)라 부른다. 
  • 페이지와 세그먼트가 메모리와 디스크 사이에서 한 번에 전송되는 전송 단위는 블록(Block)이다.
  • 가상 메모리의 관리에서 페이지로 나누었을 경우를 페이징, 세그먼트로 나누었을 경우를 세그먼테이션 시스템이라 부른다.
  • 프로그램에서 참조하는 가상 주소(Virtual Address)와 실제 메모리에 있는 실 주소(Real Address)가 달라서 메모리 상의 주소로 변환이 필요할 때 하는 것이 사상(Mapping)이다.  
  • 실 주소 = 페이지 프레임(f) + 오프셋(d)

페이징(Paging)

  • 페이징을 위해서는 모든 프로세스들이 같은 크기의 조각들로 나뉘어야 하는데, 이때 한 조각을 페이지라 부름
  • 크기가 큰 프로세스는 많은 수의 페이지로, 작은 프로세스는 작은 수의 페이지로 구성
  • 메모리는 프레임(Frame)이라 불리는 페이지와 같은 크기로 나누어져 있으며 일련번호가 있음
  • 디스크와 메모리를 오가며 교체되는 단위가 페이지이며, 이것은 곧 사상의 단위
  • 가상주소를 실 주소로 변환하기 위해 프로세스 당 하나의 페이지 테이블을 만들어야 함 (Map Table)
  • 사상을 위한 정보는 페이지당 하나씩 있어야 하므로 k 개의 페이지를 가지는 프로세스의 페이지 테이블은 k 개의 엔트리(Entry)로 구성됨. (엔트리 크기는 보통 4 byte)

출처: Operating System Concepts 8th

  • 페이지들은 일련 번호를 가지는데 페이지 테이블은 이 번호 순서대로 엔트리를 배치
  • 엔트리에 들어 있는 정보는 이 페이지가 메모리에 적재되어 있는가를 나타내는 존재 비트로서 적재된 경우 1, 아닐 경우 0의 값을 가짐.
  • 페이지 테이블은 메모리의 커널 영역에 보관, 실행 중인 프로세스의 페이지 테이블 시작 주소는 페이지 테이블 기준 레지스터(Page Table Origin Register)에 들어있음.

출처: Operating System Concepts 8th

  • 운영체제는 정확한 사상을 위해 변동이 있을 때마다 페이지 테이블을 갱신, 관리하고 있어야 함.
  • 페이지들의 적재와 교체 등을 위해 메모리의 빈 프레임에 관한 정보 역시 유지, 관리하여야 함.

TLB(Translation Lookaside Buffer)의 사용

  • TLB는 고속 캐시의 일종으로 주소로 접근되는 일반 메모리와는 달리 키(key) 값으로 찾고자 하는 워드를 동시에 접근하는 연관 메모리로서 검색이 빠른 반면 비싼 하드웨어이다.
  • 최근 빈번하게 검색된 엔트리들을 TLB에 넣되, 페이지 번호(p)를 키 값으로 동시 검색을 하므로 TBL에 저장되는 각 엔트리는 페이지 번호도 함께 표시되어 있어야 한다.

출처: Operating System Concepts 8th

  • TLB의 검색에서 모든 엔트리를 동시에 검색하고 , 검색되는 엔트리들의 페이지는 모두 메모리에 적재되어 있으므로 존재 비트를 확인할 필요가 없다.
  • TLB의 사용으로 실 주소로의 접근 시간이 빨라지기 위해서는 원하는 엔트리가 TLB에서 발견되는 확률이 높을수록 좋다. (TLB hit)

페이지의 보호(Protection)와 공유(Sharing)

*페이지 보호(Protection)

  • 다른 프로세스의 주소 공간으로 침범하지 못하도록 하는 것이 보호의 영역
  • 프로세스는 사상을 거쳐 해당 페이지가 적재된 프레임의 시작 주소를 알게 된 후, 여기에 더해지는 offset이 페이지의 크기를 넘게 되면 이것은 곧 다른 프레임으로의 접근을 의미하므로 트랩을 통한 보호가 필요
  • 페이징에서의 주소 공간 보호는 offset의 크기가 페이지의 크기를 넘지 않으면 안전

*페이지 공유(Sharing)

  • 페이징에서 공유는 각 프로세스 페이지 테이블에서 엔트리에 같은 프레임 번호를 갖도록 하여 구현
  • 프로세스들이 사상을 거쳐 같은 프레임을 접근하도록 하여 프레임에 적재된 페이지를 공유

출처: Operating System Concepts 8th

  • 코드 페이지가 공유되기 위해서는 재진입 코드여야 하고, 공유된 데이터 페이지에 대한 쓰기는 상호 배제의 해결을 전제해야 한다.

페이징에서 사상 테이블의 구성

32비트를 사용해 주소를 표현하는 시스템이라 가정하고 12비트를 offset으로 사용한다면, 페이지의 크기는 4 kbyte(2의 12승)가 되고 사상 테이블의 은 최대 100만 개(2의 20승)의 엔트리를 가질 수 있을 것이다. 엔트리의 크기를 4byte로 잡더라도 페이지 테이블 크기는 4 mbyte가 되므로 매우 큰 크기가 된다.

따라서 페이지 테이블을 작게 나누어 필요한 부분만을 메모리에 적재하기 위해 계층구조를 갖도록 구성해야 한다.


2단계 페이징 구조

출처: Operating System Concepts 8th

  • 페이지 번호를 나타내는 예를 들어 20 비트를 10 비트씩 나누어 상위 10 비트를 outer 페이지 테이블의 엔트리 위치로, 하위 10 비트는 나누어진 테이블 내의 엔트리 위치를 나타내도록 한다.
  • 메모리에 상주시키는 outer 테이블과 같은 크기의 페이지 테이블들의 선택적인 메모리 적재를 통해 전부 적재해야 하는 부담을 줄일 수 있다.

역(Inverted) 페이지 테이블

출처: Operating System Concepts 8th

 

  • 메모리에 고정 크기의 페이지 테이블 하나만 둠으로써 해결하는 방법
  • 메모리의 프레임 수만큼 엔트리를 가지며, 테이블 내에서 엔트리의 순서는 프레임 순서와 같음.
  • 역 페이지 테이블은 페이지 테이블 검색을 위해 페이지를 소유하는 프로세스 번호(Pin)를 가져야 함
  • 서로 다른 프로세스 번호를 필요로 하는 공유는 구현하기 힘듦

세그멘테이션

  • 논리적으로 하나하나의 단위들로 구분이 가능한 서로 다른 크기들이 모여 전체 프로그램을 구성하게 되고 이런 단위대로 사상하고 적재하는 기법을 세그먼테이션이라고 한다.
  • 크기가 다름으로 인해 페이징보다 구현이 복잡하지만 논리적인 단위대로 반영된다는 이점이 있다.
  • 논리적 단위는 단위별로 수정하고 다시 컴파일해서 쓸 수 있으므로 프로그램의 일부의 변경 때문에 전부를 다시 링크하고 로딩하지 않아도 된다.

출처: Operating System Concepts 8th

 

  • 페이징에서는 적재된 프레임 번호가 알려지는 반면 세그먼테이션은 엔트리에 해당 세그먼트가 적재된 메모리의 시작 주소가 적혀있다.
  • 세그먼트 메모리 적재는 다양한 크기의 수용을 위해 배치(Fit) 기법이 사용되는데 결과적으로 홀이라는 외부 단편화가 생길 수 있으므로 관리가 필요하다.

 

참고 자료

  • OS? Oh Yes! , 김주균 지음

  • Operating System Concepts 8th

'OS' 카테고리의 다른 글

[OS] 파일시스템  (0) 2020.05.11
[OS] 가상 메모리의 관리  (0) 2020.05.11
[OS] 메모리 관리  (0) 2020.05.10
[OS] 교착 상태(Deadlock)  (0) 2020.05.09
[OS] 병행 프로세스와 동기화  (0) 2020.05.09