봉황대 in CS

[Chapter 9. 가상 메모리] 가상 메모리 본문

Computer Science & Engineering/Operating System

[Chapter 9. 가상 메모리] 가상 메모리

등 긁는 봉황대 2022. 8. 3. 15:04

* 본 글은 '운영체제(Operating System: Concepts) 9th edition'의 내용과 2021학년도 1학기에 수강한 '운영체제' 과목 강의 내용을 함께 정리하여 작성하였습니다.

 

 

결속 방식에 따른 메모리 경영 기법의 분류

 

분류 공간 크기 사상 단위 적재 단위
분할 방법 논리 = 물리 전체 프로그램 전체 프로그램
페이징 / 세그먼테이션 논리 = 물리 페이지
(세그먼트 기법은 가변 크기)
전체 프로그램
가상 메모리 논리 > 물리 페이지 프로그램 일부 적재

 

Chapter 8에서 소개한 분할 방법과 페이징, 세그먼테이션 기법은

“현재 실행되고 있는 코드는 반드시 물리 메모리에 존재해야 한다”는 기본적인 요구 조건을 만족하기 위해 필요했다.

 

이 요구 조건을 가장 쉽게 만족시키는 방법은 전체 프로세스를 메모리에 올리는 것이다.

하지만 실제 프로그램들을 살펴보면, 프로그램 전체가 한꺼번에 메모리에 늘 올라와 있어야 하는 것은 아니라는 것을 발견할 수 있다.

전체 프로그램이 필요한 경우에도 그 프로그램의 모든 부분이 동시에 요구되지 않을 수 있다.

 

 

프로그램을 일부분만 메모리에 올려놓고 실행할 수 있다면 어떤 이점들이 있을까?

 

1. 프로그램은 물리 메모리 크기에 의해 더 이상 제약을 받지 않게 된다.

2. 각 사용자 프로그램이 더 작은 메모리를 차지하기 때문에 더 많은 프로그램을 동시에 수행할 수 있다.

    → 응답 시간은 늘어나지 않으면서 CPU 이용률(utilization)과 처리율(throughput)이 좋아진다.

3. 프로그램을 메모리에 올리고 스왑(swap)하는 데 필요한 입출력 횟수가 줄어들어 프로그램들이 더 빨리 실행된다.

 

가상 메모리 (Virtual Memory)


가상 메모리는 실제의 물리 메모리 개념과 사용자의 논리 메모리 개념을 분리한 것이다.

 

물리 메모리에 일부의 페이지만 부분 적재하고 적재 여부를 페이지 테이블에 표시한다.

이렇게하면 작은 메모리를 가지고도 큰 가상 주소 공간을 프로그래머에게 제공할 수 있다. (논리 주소 공간 > 물리 주소 공간)

 

 

 

가상 메모리의 이점으로는 위에 언급한 3가지 외로, 페이지 공유가 가능하다는 것이 있다.

 

시스템 라이브러리가 여러 프로세스들에게 공유될 수 있고,

프로세스들이 메모리를 공유할 수 있어 둘 이상의 프로세스가 공유 메모리를 통해 통신을 할 수 있다.

 

이때 각 프로세스들에게는 라이브러리나 다른 프로세스와 공유하는 영역이 각자 자신의 주소 공간에 있는 것처럼 보이지만

실제 물리 메모리 페이지들은 모든 프로세스에게 공유되고 있다.

 

 

요구 페이징 (Demand Paging)

가상 메모리는 요구 페이징 방식으로 구현된다.

 

실행 프로그램을 디스크에서 메모리로 적재할 때 초기에 필요한 것들만을 적재한다.

실행 과정에서 페이지 부재(page fault)가 발생했을 때, 즉 CPU가 해당 페이지를 요구할 때만 그 페이지를 메모리에 올리는 것이다.

 

 

이렇게 하려면 어느 페이지가 메모리에 올라와있는지 구별할 수 있어야 하는데, 이는 페이지 테이블의 유효/무효 비트를 통해 알 수 있다.

* 유효(valid) : 해당 페이지가 메모리에 존재한다는 의미

* 무효(invalid) : 해당 페이지가 유효하지 않거나(가상 주소 공간상에 정의되지 않았거나) / 유효하지만 디스크에 존재한다는 의미

 

 

프로세스가 어느 한 페이지를 접근하려고 했을 때 해당 페이지 테이블 항목이 무효로 설정되어 있다면

페이지 부재 트랩(page-fault trap)을 발생시켜 그 페이지를 적재한다.

 

 

페이지 부재 처리 과정은 아래와 같다.

 

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

2. 무효한 페이지라면 트랩을 발생시켜 프로세스를 중단시킨다.

3. 디스크에서 필요한 페이지의 위치를 알아낸다.

4. 새 페이지를 적재할 수 있는 빈 공간 즉, 자유 프레임(free frame)을 찾고, (free frame 리스트를 통해 찾아올 수 있음)

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

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

6. 트랩으로 중단되었던 명령어를 다시 실행한다.

 

 

페이지 대치 (Page Replacement)

만약 현재 접근하려는 페이지가 메모리에 올라와있지 않아 무효한 페이지라고 판별이 났는데

물리 메모리에 여유가 없어 자유 프레임이 존재하지 않을 때는 희생될 페이지를 찾아 교체를 해야한다.

 

 

따라서 페이지 부재 서비스 루틴은 페이지 교체를 포함해서 아래처럼 수정되어야 한다.

 

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

2. 무효한 페이지라면 트랩을 발생시켜 프로세스를 중단시킨다.

3. 디스크에서 필요한 페이지의 위치를 알아낸다.

 

4. 새 페이지를 적재할 수 있는 빈 공간 즉, 자유 프레임(free frame)을 찾는다. (free frame 리스트를 통해 찾아올 수 있음)

     a. 빈 프레임이 있다면 그것을 사용한다.

     b. 빈 프레임이 없다면 없다면 희생될 페이지를 찾기 위해 페이지 대치 알고리즘을 가동한다.

         그 후 희생될 페이지를 디스크에 기록하고 관련 테이블을 수정한다.

     → 디스크에 새로 할당된 프레임 / 빼앗은 프레임으로 해당 페이지를 읽어들이도록 요청한다.

 

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

6. 트랩으로 중단되었던 명령어를 다시 실행한다.

 

 

따라서 빈 프레임이 없는 경우에는 디스크를 두 번 접근해야 한다. (1. 프레임을 비울 때 2. 프레임을 읽어들일 때)

하지만 만약 희생될 페이지에 대해서 읽기만 일어나고 쓰기는 일어나지 않았다면 하드 디스크로 되돌아갈 필요는 없다.

 

따라서 페이지 테이블에 변경 비트(modify bit, dirty bit)을 두는 것을 통해 페이지 부재 처리 시간을 감소시킬 수 있다.

 

CPU가 페이지 내 어떤 바이트라도 쓰게 된다면 페이지가 변경되었음을 변경 비트를 통해 나타내는 것이다.

변경 비트가 설정된 경우에만 현재 내용을 디스크에 기록(write back)하면 된다.

 

참조의 지역성 (Locality of Reference)

프로그램은 한 명령어에서도 여러 개의 페이지 부재를 일으킬 수 있는데, 이렇게 되면 시스템 성능이 떨어질 것이다.

하지만 실행 중인 프로세스들을 분석해보면 이런 경우는 거의 발생하지 않는다고 한다.

 

모든 프로그램은 참조의 지역성(Locality of Reference)이라는 성질을 가지고 있다.

프로그램의 어느 한 특정 작은 부분만 한동안 집중적으로 참조하는 현상을 보인다는 것이다.

 

 

이 때문에 CPU가 해당 페이지를 요구할 때만 그 페이지를 메모리에 올리는 요구 페이징은 만족할 만한 성능을 보인다.

 


아래는 프로그램을 부분 적재하는 것으로 얻는 이점들이다.

 

1. 프로그램의 크기가 물리적인 용량에 무관해짐

2. 더 많은 프로그램이 메모리를 공유하여 CPU의 사용률과 처리율이 향상됨

3. 주소 결속을 실행 시간에 할 수 있음

 

 

결국에는 페이지 부재율(page-fault rate)을 낮추어 성능을 높이는 것이 문제이다.

관련 이슈는 다음과 같다.

 

  • 페이지 대치
  • 프레임의 개수
  • 페이지의 크기
  • 쓰레싱(thrashing) 감시

 

 

반응형
Comments