📀 운영체제

21. 가상 메모리와 디맨드 페이징: Chapter 10. Virtual Memory (Part 1)

락꿈사 2022. 7. 11. 19:41

10. 1 가상 메모리

 

배경

  • 가상 메모리virtual memory는 프로세스 전체가 메모리 내에 올라오지 않더라도 실행이 가능하도록 하는 기법을 말함
  • 가상 메모리의 장점
    1. 사용자 프로그램이 물리 메모리보다 커져도 됨
      • 가상 메모리는 물리 메모리로부터 프로그래머 관점의 논리 메모리를 분리해 메인 메모리를 균일한 크기의 저장 공간으로 구성된 엄청나게 큰 배열로 추상화 해 줌
    2. 파일과 라이브러리의 공유를 쉽게 해주고 공유 메모리 구현을 가능하게 함

  • 한 프로세스의 가상 주소 공간은 그 프로세스가 메모리에 저장되는 논리적인(가상적인) 모습을 말함
  • 위 그림과 같이 특정 논리 주소는 0번지에서 시작하여 연속적인 공간을 차지함
  • 또한 힙은 동적 메모리를 사용함에 따라 주소 공간상에서 위쪽으로 확장되고, 스택은 함수 호출을 거듭함에 따라 주소 공간 상에서 아래쪽으로 확장됨
  • 힙과 스택이 확장되어야만 실제 물리 페이지를 요구하게 됨

  • 논리 메모리를 물리 메모리로부터 분리해주는 것 외에 가상 메모리는 페이지 공유를 통해 파일이나 메모리가 둘 또는 그 이상의 프로세스들에 의해 공유되는 것을 가능하게 함

 

 

10.2 요구 페이징 Demanding Paging

  • 실행 프로그램을 보조저장장치에서 메모리로 적재하는 방법
    1. 프로그램 실행 시작 시 프로그램 전부를 물리 메모리에 적재하는 기법
      • 초기에는 프로그램의 전체가 메모리에 있을 필요가 없음
    2. demand paging: 필요한 페이지만 적재하는 기법 
      • 프로그램 실행 중 필요할 때만 페이지가 적재됨
      • 따라서 접근되지 않은 페이지는 물리 메모리로 적재되지 않음

 

 

기본 개념

  • 요구 페이징은 결과적으로 프로세스가 실행되는 동안 일부는 메모리에 있고, 일부는 보조 저장 장치에 있음
  • 따라서 이 둘을 구분하기 위해 어떤 형태로든 하드웨어 지원이 필요함
  • 유효Valid/무효 기법Invalid 기법이 여기에 적용될 수 있음
  • 이 비트가 유효하다고 설정되면 해당 페이지가 메모리에 있다는 것을 의미함
  • 이 비트가 무효하다고 설정되면 해당 페이지가 유효하지 않거나, 유효하지만 보조저장장치에 있다는 것을 의미함

  • 프로세스가 메모리에 올라와 있지 않은 페이지에 접근하려고 하면 (페이지 테이블 항목이 무효로 설정되어 있으면) 페이지 폴트 트랩page-fault trap을 발생시킴

  • 페이지 폴트를 처리하는 과정
    1. 프로세스에 대한 내부 테이블을 검사해서 그 메모리 참조가 유효인지 무효인지 알아냄
    2. 만약 무효한 페이지에 대한 참조라면 그 프로세스는 중단됨
    3. 만약 유요한 참조인데 페이지가 아직 메모리에 올라오지 않았다면 그것을 보조저장장치로부터 가져옴
    4. 빈 공간, 즉 free frame을 찾음 (페이지 프레임 리스트에서 하나를 가져옴)
    5. 보조저장장치에 새로이 할당된 프레임으로 해당 페이지를 읽어드리도록 요청
    6. 보조저장장치 읽기가 끝나면 이 페이지는 이제 메모리에 있다는 것을 알리기 위해 페이지 테이블을 갱신하며, 프로세스가 유지하고 있는 내부 테이블을 수정함
    7. 트랩에 의해 중단되었던 명령어를 다시 수행함
  • 순수 요구 페이징pure demand paging: 메모리에 페이지가 하나도 안올라와 있는 상태에서 프로세스를 실행시키는 것. 즉 어떤 페이지가 필요해지기 전까지는 결코 그 페이지를 메모리로 적재하지 않는 방법
  • 순수 요구 페이징 기법을 사용할 경우 시스템 성능의 저하를 초래할 것 같지만 그렇지 않음
  • 그 이유는 모든 프로세스가 참조의 지역성locality of reference이라는 성질이 있기 때문임
    • 참조의 지역성: 프로세스가 실행될 때 항상 어떤 특정한 지역에서만 메모리를 집중적으로 참조하는 것을 말함
  • 요구 페이징을 지원하기 위해 필요한 하드웨어는 페이징과 스와핑을 위한 하드웨어와 동일함
    • 페이지 테이블: 보호 비트를 유효/무효 비트를 통해 특정 항목을 무효로 설정할 수 있어야 함
    • 보조 저장장치: 메인 메모리에 없는 모든 페이지를 가지고 있어야 함
  • 요구 페이징을 지원하기 위해서는 페이지 폴트 오류 처리 후 명령어 처리를 다시 시작할 수 있어야 함
  • 즉, 페이지 폴트가 발생하여 중단된 프로세스 상태(레지스터들)를 보관해두면 다시 이 프로세스를 시작할 때 해당 페이지가 메모리로 올라와서 접근 가능하다는 것 외에는 정확히 같은 위치, 같은 상태에서 프로세스를 다시 수행할 수 있어야 함
    • ex) A, B를 더하여 연산 결과를 C에 넣는 연산을 할 경우의 단계
      1. 명령어 ADD fetch
      2. fetch A
      3. fetch B
      4. ADD A B
      5. 합을 C에 store
    • 이 경우에서 C가 현재 메모리에 없는 페이지에 속하여 페이지 폴트가 발생하면 C가 속한 페이지를 메모리로 가져오고 페이지 테이블을 수정한 다음 그 명령어를 처음부터 다시 시작함 (1번부터)

 

 

가용 프레임 리스트

  • 페이지 폴트가 발생하면 운영체제는 요청된 페이지를 보조저장장치에서 메인 메모리로 가져와야 함
  • 페이지 폴트를 해결하기 위해 대부분의 운영체제는 이러한 요청을 충족시키기 위해 사용하기 위한 가용 프레임의 풀인 가용 프레임 리스트를 유지함
  • 프로세스의 스택, 힙 등이 확장될 때도 가용 프레임이 할당되어야 함

 

 

요구 페이징의 성능

  • 요구 페이징은 컴퓨터 성능에 큰 영향을 줌
  • 페이지 폴트가 없는 한 실질 접근 시간은 메모리 접근 시간과 같음
  • 페이지 폴트가 발생하면 먼저 보조저장장치에 해당 페이지를 읽은 다음 원하는 워드에 접근해야 함
  • 예시
    • 페이지 폴트의 확률 P
    • 실질 접근 시간 = (1-p) * ma + p * 페이지 폴트 시간
    • 만약 평균 페이지 폴트 시간이 8m초이고 메모리 접근 시간인 200나노초라고 할 때 실질 접근시간
      • (1 - p) * 200 + p  = (1 - p) * 200 + p * 8,000,000 = 200 + 7,999,800 * p

 

 

10.3 쓰기 시 복사 copy-on-write

  • fork()를 시스템 콜을 통해 프로세스를 생성할 때는 페이지 공유와 비슷한 방법을 사용할 수 있음
  • 자식 프로세스가 시작할 때 부모의 페이지를 당분간 함께 사용함 (왼쪽 그림)
  • 자식 프로세스가 페이지 C를 수정할 경우 가상 메모리른 C를 복사하여 수정한 새로운 페이지를 가리킴