본문 바로가기

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

[OS] Demand Paging

목차

    728x90
    반응형
    SMALL

    Demand Paging

    페이징에 의해 가상메모리를 관리하는 방법이다.

    가상메모리 방법을 구현할 때 사용 가능한 요소는 Paging, Segmentation 두가지가 있다.
    프로세스를 page 혹은 segment로 쪼개서 보조기억장치의 virtual address space에 넣고, 필요한 부분만 가져오는 식이다.
    이때 paging에 기반한 방법은 별도로 demand paging, segmentation에 기반한 방법은 demand segmentation 이라고 칭한다.
    하지만 segmentation은 paging보다 실행 속도가 느리기 때문에, virtual memory에서도 demand segmentatoin보다 demand paging 방법을 주로 이용한다.

    demand paging은 page 단위로 프로세스를 나눠서 보조기억장치에 저장하고, 실행하는데 필요한 page만 그때그때 메모리로 갖고 들어와서 실행하는 방법이다.
    이때 프로세스가 page단위로 분할되기 때문에 서로를 논리적으로 연결하기 위해 page table이 필요하다.
    프로세스를 구성하는 page들이 현재 메인메모리에 들어있는지, 들어와 있는 경우 어떤 프레임에 들어있는지를 page table에 기록하는 것이다.
    또한 page table을 통해 virtual address를 physical address로 변환한다.

    위 그림은 demand paging 방식에서 virtual memory와 main memory의 관계를 보여준다.
    왼쪽에 프로세스 a, 오른쪽에 프로세스 b를 위한 virtual address space가 있다.
    그리고 각 프로세스마다 page table이 있다.
    가운데에는 실제 메인 메모리가 있고, stack, code, data의 일부가 메인메모리의 어딘가에 들어오는데, 이 위치를 페이지 테이블에 기록하는 것이다.

    demand paging에서 address translation 방법은 기존 방법과 비슷하다.
    먼저 페이지번호를 가지고 페이지 테이블에 가서 해당되는 칸을 찾고, 그 안의 프레임 번호를 읽어온다.
    이후 logical address의 offset과 조합하면 된다.

     

    이때 페이지 테이블을 어떻게 저장하고, 어떻게 찾아갈까?
    page table도 결국 메모리에 존재한다. 프로세스마다 만들어지기 때문에 프로세스마다 page table의 주소가 다를것이다. 즉 page table의 시작 주소를 알아야 page table에서 원하는 칸을 찾을 수 있을 것이다.
    페이지 테이블의 시작주소는 그 프로세스의 PCB에 기록된다.
    그런데 만약 프로세스가 실행되면서 logical address를 physical address로 변환할 필요가 생길때, 주소 변환을 위해 매번 PCB에 찾아가는것은 PCB도 메인 메모리에 있기 때문에 메모리 엑세스가 한번 더 생기므로 시간이 많이걸린다.
    그래서 매번 PCB에 찾아가는것이 아니라, 현재 프로세스로 프로세스스위치가 처음 일어날 때, 그때 PCB에 있는 page table의 시작 주소를 cpu 안의 page table base register로 읽어온다.
    이렇게 한번 읽어오면 그 다음부터는 cpu 내에서 바로 페이지 테이블의 시작 주소를 가져와 계산하여 바로 원하는 page table entry에 접근할 수 있다.

     

     

    📁 page table entry

     

    page table entry란 page table의 칸을 말한다.
    각 entry에는 프레임 넘버가 4byte=32bit 길이로 저장되어있다.
    이때 page하나의 크기가 4KB = 4096byte = 2의 12제곱byte이므로 offset이 12bit, page number는 나머지 부분인 20bit이다. 즉 프레임 넘버도 페이지와 크기가 같으므로 20bit이다.
    entry에는 32bit 길이로 프레임 넘버를 저장해야하는데, 20bit를 저장하면 12bit가 빈 공간으로 남는다.
    그래서 각 페이지마다의 정보를 이 12bit에 저장한다.
    이때 저장하는 정보는 3가지가 있다.

     

    1. Present bit(Vaild bit) P(V)
    해당 페이지가 메인메모리에 존재하느냐를 나타내는 1bit 정보이다.
    단순 paging 방법에서는 page로 나누었다 하더라도 모든 페이지가 메모리로 들어오니까 P bit가 통일되었을텐데, demand paging에서는 들어오는 페이지도 있고 들어오지 않은 페이지도 있으므로 들어와 있는 페이지는 1로, 들어있지 않은 페이지는 0으로 표시한다.

    2. Reference bit(Use bit) R
    해당 페이지가 메인 메모리로 들어온 이후 read혹은 write로 접근한 적이 있는지를 나타내는 1bit 정보이다.
    접근한적이 있으면 1, 없으면 0으로 표시한다.

    3. User mode bit U
    해당 페이지가 유저 콘텍스트에 해당되는 페이지임을 나타내는 1bit 정보이다.

    4. COW bit
    자식프로세스를 만들 때 부모 프로세스에서 user context를 복사하는데, 그때 시간이 많이 걸리기 때문에 일단은 부모 프로세스의 것을 공유하고, 변경이 일어나는 시점에 복사 후 변경을 한다. 해당 방법을 Copy on Write 방법이라고 하는데, COW bit는 현재 COW 방법으로 부모와 공유중인 페이지임을 나타내는 정보이다.

    5. Modified bit(Dirty bit) M
    보조기억장치의 virtual address space에 있던 페이지가 메인 메모리로 들어온 이후 내용이 변경되었음을 나타내는 비트이다.
    virtual address space로부터 필요한 page를 메모리로 가지고 들어오는데, 언젠가 메인 메모리가 꽉 차서 더이상 빈 프레임이 없는 상황이 올 수 있다. 그러면 메모리에 있는 페이지 중 어떤것을 골라서 보조기억장치로 빼내야한다. 즉 보조기억장치로 write하는 것이고, 이때 시간이 걸린다.
    만약 어떤 페이지를 메모리에서 보조기억장치로 옮기는데 그 페이지가 메모리에 들어와있는 동안 내용 변경이 없었다고 가정하자. 그러면 같은 내용을 중복해서 다시 쓸 필요가 없으므로, 이때 write하지 않으면 그만큼 시간이 절약될 수 있다.
    즉 M bit는 페이지가 보조기억장치로 돌아갈 때 write를 해야하는지 여부를 결정한다.
    만약 변경되지 않은 페이지라면 메모리에서 그냥 지워버리면 된다.
    변경되면 1, 아니면 0으로 표시된다.

    위 그림은 P bit가 쓰이는 예시이다.


    paging 방법으로 메모리를 관리하는 경우, 프로세스들 사이에 메모리 공유가 일어나는 방법이다.
    위 그림을 보면 p1, p2, p3 세개의 프로세스가 동작하고 있는데, 세 프로세스는 모두 에디터라는 똑같은 프로그램을 이용하고있다. 예를 들면 한글파일 3개를 띄운 것이다.
    ed1, ed2, ed3은 각각 한글파일 프로그램의 코드를 의미한다. 즉 코드가 세 개의 page로 구성되어 있다.
    위 ed1, ed2, ed3이라는 똑같은 코드를 메인 메모리에 3개 복사본을 두는것은 메모리의 낭비이다.
    data1, data2, data3은 각각 다른 프로세스에서 입력된 독립적인 데이터이므로 메모리에 따로따로 자리를 잡아 넣고, ed1, ed2, ed3은 위 그림처럼 메모리에 한번만 잡아주고 공유하는 것이 효율적이다.

    이때 ed1, ed2, ed3을 세 프로세스가 공유하기 위해, 각 프로세스의 페이지 테이블이 메인 메모리의 똑같은 프레임을 가리키도록 하면 공유가 가능하다. 위 그림처럼 세 page table의 위 3개의 entry가 3, 4, 6으로 메인메모리에서 ed1, ed2, ed3이 들어있는 프레임을 똑같이 가리키고 있다. 이렇게 하면 공유가 가능하고, 결과적으로 운영체제가 메모리를 절약할 수 있다.

    이때 말하는 공유는 shared memory와 다르다.
    shared memory는 프로그램 사용자가 필요해서 운영체제에게 잡아주도록 요청하고 의도적으로 만드는것이지만, 위에서 설명한 공유는 운영체제가 알아서 내부적으로 공유하는것이다.

    728x90
    반응형
    LIST