본문 바로가기
운영체제

가상 메모리 #6

by 성장하는 Sap린이 2020. 2. 15.

가상 메모리

지금까지의 메모라 관리 기법 방식은 프로세스 전체가 메모리 내에 올라와야 한다는 것을 전제로 하고 있다.

프로세스 전체가 메모리 내에 올라오지 않더라도 실행이 가능하도록 하는 기법을 가상 메모리라고 한다.

가상 메모리는 물리 메로리로부터 사용자 관점의 논리 메모리를 분리시켜 주 메모리를 균 인한 크기의 저장 공간으로 구성된 엄청나게 큰 배열로 추상화시켜준다.

따라서 작은 메모리를 가지고도 큰 가상 주소 공간을 제공한다.

 

장점

  • 사용자 프로그램이 물리 메모리보다 커져도 된다. 즉, 메모리 크기의 제약으로부터 자유로워진다.
  • 각 사용자 프로그램이 더 작은 메모리를 차지하므로 더 많은 프로그램을 동시에 수행할 수 있다. 이에 따라 응답 시간은 늘어나지 않으면서 CPU 이용률과 처리율이 높아진다.
  • 프로그램을 메모리에 올리고 스왑 하는데 필요한 입/출력 횟수가 줄어든다. 따라서 프로그램들이 보다 빨리 실행된다.
  • 가상 메모리 파일의 공유를 쉽게 해 주고 공유 메모리 구현을 가능하게 한다.
  • 프로세스 생성을 효율적으로 처리할 수 있는 메커니즘도 제공한다.

단점

  • 구현이 어렵고, 잘못 사용 시 성능이 현저히 저하될 수 있다.

가상 주소 공간

가상 메모리는 컴퓨터와 운영체계에 의해 구현되는 개념으로서 가상의 주소 공간을 할당하여  대단히 큰 용량의 메모리나 데이터 저장공간을 사용할 수 있도록 만든다.
또 한 가상 메모리 기법으로 제공되는 주소 공간으로서, 프로세스의 관점에서 사용하는 주소이다. 오늘날 대부분의 운영체제에는 가상 메모리 기법이 적용되어 있다. 가상 메모리에서의 주소 공간 즉 가상 주소 공간은 프로세스가 참조할 수 있는 주소들의 범위이며, 하나의 프로세스 당 하나의 가상 주소 공간이 주어진다. 일반적으로 스레드는 프로세스 내의 주소 공간을 공유한다.


가상 주소 공간의 구조

 

  • code : 기계어 (코드를 컴파일하여 기계어로 만들고 디스 어셈블을 하여 어셈블리어로 바꾸어 code 영역에 넣는다(instruction))
  • data : 전역 변수, static 변수의 할당의 위해 존재하는 공간
  • heap : 프로그래머의 동적 할당을 위해 존재하는 공간
  • stack : 지역 변수가 저장되는 공간

가상 주소 공간

  • page : 가상 주소 공간 4G를 4096byte(4K) 단위로 나눈 하나의 메모리 블록을 page라고 한다.
  • 연산을 할 때는 값을 stack으로부터 레지스터로 가져오고 ALU로 넘겨서 연산을 수행한다. 연산 결과 값은 레지스터에 먼저 저장하고, stack 영역에 재전달 한다.
  • 레지스터의 스택 포인터(SP)는 stack 프레임을 위해서 미리 공간을 확보한다.

 

가상 메모리 요구 페이징(Demand Paging)

 

요구 페이징은 필요한 프로그램만 메모리에 적재하는 방법으로 가상 메모리 시스템에서 많이 사용된다. 요구 페이징을 사용하는 가상 메모리에서는 페이지들이 실행 과정에서 실제로 필요해질 때 적재된다.

 

요구 페이징은 일부 스와핑 기법과 유사하다. 프로세스를 실행하고 싶으면 메모리로 읽어 들이며 이때 전체 프로세스를 읽어오지 않고 lazy swapper를 사용한다. lazy swapper는 그 페이지가 필요하지 않은 한 메모리에 적재되지 않는다.

     

 

 

스와퍼는 전체 프로세스를 관리하는 반면 페이저(pager)는 프로세스 내의 개별 페이지들을 관리한다. 요구 페이징과 관련해서는 스와퍼 보다 페이저가 더욱 가깝다.

 

스왑인(swap in) 시에시에 페이저는 프로세스가 다시 스왑 아웃(swap 되기 전에 실제로 사용될 페이지들이 어떤 것인지 추측한다. 페이저는 프로세스 전체를 스왑 인하는 대신에 실제 필요한 페이지들만 메모리로 읽어온다. 사용되지 않을 페이지를 메모리로 가져오지 않음으로써 시간 낭비와 메모리 공간 낭비를 줄일 수 있다.

 

페이저는 어느 페이지가 디스크에만 있고 어느 페이지가 메모리에 올라와 있는지 구별할 수 있어야 한다. 이때 유효/무효(valid-invalid) 비트 기법을 사용하여 비트가 유효하면 메모리에 있는 것을 의미하고 유효하지 않으면 메모리에 없거나(디스크에 있거나) 해당 페이지가 유효하지 않다는 것이다.

 

프로세스가 메모리에 없는 페이지를 접근하려 할 때 페이지 부재 트랩(page-fault-trap)을 발생시킨다. 페이징 하드웨어는 페이지 테이블을 이용한 주소 변환 과정에 무효 비트를 발견하고 운영체제에 트랩을 건다.

 

 

[페이지 부재를 처리하는 과정]

1.     프로세스에 대한 내부 테이블(internal table)을 검사해 서울 검사해서 그 메모리 참조가 유효/무효인지를 알아낸다.

2.     무효한 페이지에 대한 참조라면 프로세스는 중단된다. 경우 메모리에 없으면 디스크로부터 가져와야 한다.

3.     빈 공간, 자유 프레임(free frame)을 찾는다.

4.     디스크에 새로이 할당된 프레임으로 해당 페이지를 읽어 들이도록 요청

5.     디스크 읽기가 끝나면 이 페이지가 메모리에 있다는 것을 알리기 위해 페이지 테이블을 갱신하며 프로세스가 유지하고 있는 내부 테이블을 수정한다.

6.     트랩에 의해 중단되었던 명령을 다시 수행하며 프로세스는 그 페이지가 항상 메모리에 있었던 것처럼 간주하여 해당 페이지를 접근할 수 있다.

 

 

페이지가 적재되고 나면 프로세스는 수행을 계속하는데 프로세스가 사용하는 모든 페이지가 메모리에 올라올 때까지 필요할 때마다 페이지 부재가 발생한다. 일단 필요한 모든 페이지가 적재되고 나면 더 이상 부재 오류가 발생하지 않는데 이것이 순수 요구 페이징(pure demand paging)이다.

 

모든 프로그램은 참조의 지역성(locality of reference)이라는 성질이 이라는 성질이 있어서 프로그램의 어느 한 특정 작은 부분만 한 동안 집중적으로 참조하는데 이렇나 성질 때문에 요구 페이징은 만족할 만한 성능을 보인다.

 

요구 페이징의 필수적인 요구 사항은 페이지 부재 오류 처리 후에 명령 처리를 다시 시작할 수 있어야 한다. 만약 페이지 부재가 명령 인출(instruction fetch) 시에 발생했다면 시에 발생했다면 명령을 메모리로 읽어 온 후 다시 수행을 시도하면 된다.

 

요구 페이징은 컴퓨터 시스템의 성능에 중요한 영향을 미친다. 페이지 부재가 발생하지 않는 한 실질 접근 시간은 메모리 접근시간과 같다. 그러나 페이지 부재가 발생하면 디스크로부터 관련되는 페이지를 읽어 온 뒤 필요한 워드를 접근해야 한다.

 

요구 페이징의 또 다른 특성은 스왑 공간의 관리이다. 스왑 공간에서의 디스크 입/출력은 일반적으로 파일 시스템에서의 입/출력 보다 빠른데 그 이유는 스왑 공간은 파일 시스템보다 더 큰 블록을 사용하기 때문이고 또 스왑 공간과 입/출력을 할 때는 파일 찾기(lookup)나 간접 할당 방법 등은 사용하지 않기 때문이다.

 

시스템은 한 프로세스를 시작시킬 때 그 파일 이미지(file image)를 스왑 공간으로 복사한 후 스왑 공간으로부터 요구 페이징을 처리함으로써 보다 나은 페이징 처리율(pagingthroughput)을 얻을 수 있다. 또 다른 가능한 방법은 프로그램을 처음 시작시킬 때에는 파일 시스템으로부터 요구 페이징을 처리하지만 그 페이지들이 교체될 때는 스왑 공간에 페이지를 기록하는 것이다. 이 방식은 파일 시스템으로부터는 꼭 필요한 페이지들만 읽어오면서 그 페이지를 다시 읽어올 때에는 스왑 공간에서 읽어 온다는 것을 보장한다.

 

어떤 시스템들은 이진 파일을 스왑 공간에 넣지 않음으로써 스왑 공간의 크기를 줄이기도 한다. 실행 파일로부터 요구 페이지를 요청하면 파일 시스템으로부터 그 페이지를 직접 가져온다. 페이지들의 교체가 필요하면 이들 페이지에 새 페이지의 내용을 그대로 덮어쓸(overwrite) 수 있다.

 

이러한 방식은 파일 시스템이 보조 저장 장치로 사용되며 이러한 시스템에서도 힙이나 스택처럼 원래 파일과 관계없었던 페이지들이 존재하기 때문에 스왑 공간은 여전히 필요하다.