ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 가상 메모리 (virtual memory)
    공부/OS 2016. 6. 26. 13:00

    프로세스와 가상 메모리

    모든 프로세스는 자신만의 가상 주소 공간을 가지고 있다. 32비트/64비트 프로세스는 각 비트수에 맞게 최대 4GB/16GB의 주소 공간을 가진다.

    모든 프로세스들은 자신만의 주소 공간을 가지기 때문에, 특정 프로세스 내에서 쓰레드가 수행될 때 해당 쓰레드는 프로세스가 소유하고 있는 메모리에 대해서만 접근이 가능하다. 다른 프로세스에 의해 소유된 메모리는 숨겨져 있으며, 접근이 불가능하다.

    따라서, A 프로세스가 0x12345678 주소에 무엇인가를 저장하였지만, B 프로세스 역시 0x12345678 주소에 무엇인가를 저장할 수 있으며, 이 주소들은 완전히 독립되어 있는 것이다.

    즉, 가상 메모리는 프로세스의 logical memory와 physical memory를 분리하기 위해 생겨난 것

    따라서 logical memory가 physical memory보다 커지는 것을 가능케 할 수 있다.

    하나의 프로세스 logical memory가 physical memory보다 커지는 것도 가능하며, 여러 프로세스의 logical memory 총합이 physical memory보다 커지는 것도 가능한 것이다.

    램이 꼴랑 1기가인 PC를 생각해 보면 이 PC에서 포토샵도 띄우고, 게임도 띄우고, 웹페이지도 띄운다. 하드가 버벅대지만, PC는 멈추지 않고 실행한다.

    이처럼, 프로세스가 실제 필요로 하는 부분만 메모리로 올리는 Demand-Paging 기법을 사용한다.

    이미 메모리가 소진된 상태에서 위에서 띄운 프로그램의 작업 내용을 기억하기 위해 디스크 공간을 메모리처럼 활용할 수 있는 기능을 가지고 있다.

    디스크 상에 존재하는 이러한 파일을 paging file (또는 swap file)이라고 하며,  모든 프로세스가 사용할 수 있는 가상 메모리로 사용된다.

    즉 용량이 큰 게임을 실행하면 하드가 돌면서 실행된다. 하드 스왑이라는 페이징 파일에서 실제 물리 메모리로 올리고 내리고 하는 일련의 작업을 이야기하는 것이다.

    애플리케이션 관점에서 보면, 페이징 파일을 사용하면 애플리케이션이 사용할 수 있는 램의 크기가 증가한 것과 같은 효과를 가져온다.

    만일 PC에 4GB의 램이 있고, 디스크 상에 4GB의 페이징 파일이 있디면, 수행 중인 애플리케이션은 PC에 8GB의 램이 있는 것과 동일한 효과를 누릴 수 있는 것이다 (물론, 8GB 램보다는 4GB 램+ 4GB 페이징 파일이 더 느리다.)

    가상메모리란 한정된 물리 메모리의 한계를 극복하고자 디스크와 같은 느린 저장장치를 활용해, 애플리케이션들이 더 많은 메모리를 활용할 수 있게 해 주는 것이 가상 메모리이다.

    Page

    Page란, 가상 메모리를 사용하는 최소 크기 단위

    만약, 페이징 파일에서 물리 메모리로 데이터를 로드할 때, 아무 위치에나 필요한 크기 만큼(무작위) 로드한다고 가정을 해 보자.

    이런 경우, 로드하고 언로드하는 데이터의 크기가 모두 제각각이므로, 이를 반복하다 보면 메모리 공간에 fragmentation이 발생하게 된다.

    결국 메모리는 남아 있지만, 정작 원하는 크기의 데이터를 물리 메모리로 로드하지 못하게 되는 상황이 생길 수 있는 것이다. 이를 막기 위해, 운영체제가 만든 것이 page라는 최소 크기 단위이다.

    Demanding Page

    Demanding-page는 실제로 필요한 page만 물리 메모리로 가져오는 방식
    필요 page에 접근하려 하면, 결국 가상 메모리 주소에 대응하는 물리 메모리 주소를 찾아내어, 물리 메모리 주소를 얻어와 하는데, 이 때 필요한 것이 페이지 테이블(page table)이다.
    페이지 테이블에 valid bit 라는 것을 두고, 해당 page가 물리 메모리에 있으면 set, 그렇지 않으면 invalid로 설정한다.
    Page 접근 요청을 하였는데, physical memory에 없는 상태, 즉 valid bit가 clear 되어있는 상황을 Page fault 라 하며 아래와 같은 처리 과정을 거친다.



    1) 페이징 하드웨어는 page table entry를 보고 invalid인 것을 확인한 후 OS에게 trap으로 알린다.
     2) OS는 정말로 메모리에 없는 것인지 아니면 잘못된 접근인지 확인한 후 잘못된 접근이었으면 종료시킨다.
    3) Empty frame (free page)을 얻는다.
    4) Page를 frame으로 swap한다.
    5) 프로세스의 page table과 TLB를 page-in/page-out 된 것을 토대로 재설정한다.
    6) Page fault를 야기했던 인스트럭션부터 다시 수행한다.

    3번 과정에서 empty frame을 얻어와야 하는 상황에서 물리 메모리가 이미 모두 사용중이라면,
    그 사용중인 frame 중 하나를 선택해서 page-out (페이징 파일로 이동) 시키고, 그 frame을 사용해야 한다.

    이와 같이 victim frame을 선택하는 과정에서 Page Replacement Algorithm을 사용한다.


    댓글