본문 바로가기

23년 1학기 학교공부/운영체제및실습

[OS] Virtual Memory

목차

    728x90
    반응형
    SMALL

    Virtual Memory

    가상메모리를 사용하는 이유, 장점

    메모리에 프로세스를 효율적으로 배치하기 위해 프로세스를 조각으로 나누는 Paging, Segmentation 기술이 있다.
    하지만 이렇게 프로세스를 조각내어 메모리에 넣는다면, 조각들을 한꺼번에 메모리에 넣지 말고, 프로세스의 가상 주소 공간에 뒀다가 필요할 때만 필요한 부분을 메모리에 넣는 방법이 더 효율적일 것이다.

    가상 주소 공간을 보조기억장치에 만들면, 용량이 제한적인 메인메모리를 대신해서 넓은 저장공간을 제공할 수 있기에 디스크와 같은 보조기억장치에 프로세스의 가상주소공간을 만들게 된것이다.

    이 virtual address space는 프로세스의 원본 역할을 하고, 실행하는데 필요한 부분만 메인메모리에 가져오는 방법이 Virtual Memory 방법이며, 이처럼 보조기억장치와 메모리 공간을 합쳐서 마치 메모리가 늘어난 것 처럼 사용하는 개념이다.

    virtual memory를 사용하면, 단위시간당 cpu가 일하는 양인 throughput이 좋아진다.

     

     

    virtual memory를 사용하게 되면 메모리가 보조기억장치까지 확대되므로 주소의 개념이 일부 변경되어야한다.
    실제 메인 메모리에서 쓰는 주소는 전과 같이 physical address이다.
    하지만 logical address는 메모리와 보조기억장치에 있는 virtual address space까지 확대되어, virtual memory에서 만들어질 수 있으므로 이를 virtual address라고 특정지어 부른다.

     

    가상 메모리를 이용하는 장점은 throughput이 더 좋아진다는 것이다.
    더 많은 프로세스가 메인 메모리에 들어갈 수 있으므로 더 많은 프로세스가 실행대상이 되고, 단위시간 당 컴퓨터가 처리할 수 있는 프로세스의 개수가 늘어나기 때문이다.
    또한 프로세스의 크기가 메인 메모리의 크기에 구애받지 않고 실행될 수 있다.
    virtual memory 방법을 사용하지 않으면, 프로세스 전체가 메인 메모리에 들어가야지만 실행이 가능하므로 프로세스의 크기가 메인메모리보다 작아야했다.
    컴퓨터가 달라져도 프로그램이 실행 가능하다는 것을 portability라고 하는데, virtual memory를 사용하지 않으면 portability가 좋지 않지만 virtual memory를 사용하면 어떤 컴퓨터든 보조기억장치에 프로세스를 두고 메인메모리가 허용하는 크기만큼만 가져와서 실행하기 때문에 portability가 좋다.

    virtual memory 방법은 paging 방법에 기반으로 사용할 수도 있다.
    물론 프로세스를 조각내는 다른 방법인 segmentation을 사용하면 보조기억장치의 가상주소공간에 프로세스를 조각내어 넣고 실행하는데 필요한 segment만 가져와서 실행해도 되지만, segment는 크기가 가변적이기 때문에 paging보다 실행 속도가 느리다. 그래서 virtual memory 방법에서도 paging에 기반한 virtual memory보다 segmentation에 기반한 virtual memory의 실행 속도가 느리다.

     

    위 그림에 프로세스 a, b가 있고, 오른쪽 그림처럼 보조기억장치에 virtual address space가 만들어져있다.
    또한 paging을 사용하기 때문에 프로세스와 메모리가 page라는 똑같은 크기의 조각으로 분할되어 있는 상태이다.
    현재 메인메모리를 보면 프로세스 a의 경우 일부만 메인 메모리에 들어와있고, 프로세스 b의 경우 4번을 제외하고 모두 들어와있는 상태이다.

    virtual memory 기술이 나오기 전에는, 보조기억장치에 각 프로세스의 virtual address space를 만들고, 각 프로세스마다의 stack, data, code를 전부 메인메모리에 넣어서 실행하므로 각 프로세스의 덩치가 커질수밖에 없다.
    하지만 virtual memory 방법에서는 code, data, stack의 일부분만 메모리에 가져오므로 프로세스 각각이 차지하는 메모리 공간이 줄어든다.

     

     

    이렇게 일부만 메모리에 들어온 프로세스를 어떻게 실행해야할까?

    먼저 운영체제가 프로세스의 일부 메모리를 메인 메모리로 가져온다.
    이후 실행을 하는데, 프로세스 중 
    예를 들어 프로세스 b가 0, 1, 2, 3번을 실행했다고 하자. 이후 4번을 실행해야하는데, cpu가 4번에 해당되는 주소에 접근하려고 보니 현재 메인메모리에 4번을 가져오지 않아서 실행할 수가 없음을 cpu가 알게된다. 이때 cpu는 운영체제에게 자신이 접근해야하는 4번이 없음을 알린다.
    이때 이렇게 cpu라는 하드웨어가 운영체제에게 상황을 알리는 것이 interrupt, 그중 trap이다.
    trap이 발생하는 경우는 0으로 나눗셈을 하거나, 정의되지 않은 명령어를 instruction으로 실행하는 등의 경우가 있는데 이런 경우는 프로그램을 죽인다.

     

    하지만 페이지 폴트라는 경우가 있었는데, 이 경우는 접근하려는 페이지가 메모리에 없다는 뜻이다. 이렇게 페이지 폴트라는 트랩을 걸면 운영체제는 프로세스를 더이상 실행할 수 없으므로 block 상태로 바꾸고 cpu를 뺏는다. 그리고 4번 페이지를 가져오기 위해 디스크 장치에게 4번 페이지가 들어있는 블록을 읽도록 지시한다. 장치에게 입출력 명령을 내린것이다.
    이렇게 디스크 입출력이 진행되는 동안 이 프로세스는 block 상태에 있는 것이다.
    뺏긴 cpu는 스케줄링해서 선정된 프로세스로 컨텍스트 스위치를 한다.

    그러다가 언젠가 디스크 입출력이 끝나면, 디스크는 운영체제에게 interrupt를 건다. 이후 운영체제는 interrupt를 받아서, 4번 페이지를 기다리면서 block 상태에 있던 프로세스를 ready 상태로 바꾸는 interrupt 처리를 진행한다.
    이후 스케줄링을 해서 cpu를 새로 받을 프로세스를 결정한다.

    이후 이 4번 페이지를 기다렸던 프로세스가 cpu를 다시 받게 되면, 아까 4번 페이지에 접근하다가 실패한 instruction을 다시 실행한다.

     

    virtual memory 방식에서는 이런식으로 프로세스가 실행되다가 중단되는 일이 자주 발생한다.
    메인메모리에 없어서 디스크에서 가져오는 동안 중단되어야하기 때문에, 터널 라운드 타임이라고 부르는 프로세스가 시작할때부터 끝날때까지의 시간이 길어진다.

    특정 프로세스 하나 입장에서 보면 진행이 느려지지만, 여러 프로세스를 전체적으로 살펴보면, 여러 프로세스가 메인 메모리에 들어갈 수 있어서 바로 시작될 수 있고, 사이즈가 커도 실행될 수 있다는 장점이 더 크기 때문에 virtual memory 방식을 사용하는 것이다.

    또한 터널 라운드 타임이 길어지지만, 지역성이라는 특성때문에 아주 크게 느려지지는 않는다.
    프로그램을 실행하다 보면, for문과 같이 프로그램 코드의 특정 부분을 집중적으로 반복 실행하는 경우가 생긴다. 그래서 특정 부분을 메인 메모리로 가져오면 메인 메모리에 들어온 부분을 집중적으로 반복하여 실행하는 지역성의 특성 때문에 virtual memory 방식이 아주 느려지지 않고, 성능이 나빠지지 않는 것이다.

    위 그래프가 지역성을 보여준다.
    x축은 실행시간, y축은 시간에 따라서 접근하는 메인 메모리의 주소를 페이지 넘버 단위로 표시하였다.
    그래프에서 알 수 있듯이 계속 서로 다른 페이지를 왔다갔다 하는 것이 아니라, 어떤 시간대에는 특정 페이지를 집중적으로 엑세스한다.
    즉 엑세스하는 페이지들만 처음 페이지 폴트때 디스크에서 읽어 들여오면, 그 다음부터는 한동안 페이지 폴트 인터럽트가 발생할 필요가 없다.

    728x90
    반응형
    LIST