ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SW 정글 78일차] Project 3 - Memory Management
    기타/SW 사관학교 정글 2021. 10. 20. 02:09

    오늘은 project 3에서 아무런 구현을 하지 않고 make check를 해보았다.

    결과는 project 2까지 모두 fail이 떴다.

    지금 생각드는 이유는 project 2까지는 물리 메모리에 프로세스가 필요한 모든 것을 load했다.

    하지만 project 3부터는 paging 기법을 이용하여 그때그때 고정된 크기의 page를 할당받아 물리 메모리에 load해야하는데 이것이 구현되지 않아 project 2 test에도 영향을 미치는 것같다.

     

    그래서 일단은 깃북의 memory management부분 설명을 읽으면서 무엇을 해야하는지 파악해보고 내일부터 팀원들과 페어프로그래밍으로 구현을 해 볼 생각이다.

     

     

     

    1. Memory Management

    이전까지 공부한 가상 메모리 시스템을 구현하기 위해서는 가상 페이지와 물리 프레임을 효율적으로 관리해야한다.

    즉, 메모리 영역들이 사용되는지, 어떠한 목적으로 사용되는지, 누가 사용하는지 등등을 기록해야한다는 것이다.

    첫번째로 supplemental page table을 다뤄야하고 그 다음에 물리 프레임을 구현하면 된다.

     

     

     

    2. Page Structure and Operations

    pintos에서는 page structure가 기본적으로 구현되어 있다.

    struct page {
      const struct page_operations *operations;
      void *va;              /* Address in terms of user space */
      struct frame *frame;   /* Back reference for frame */
    
      union {
        struct uninit_page uninit;
        struct anon_page anon;
        struct file_page file;
    #ifdef EFILESYS
        struct page_cache page_cache;
    #endif
      };
    };

    구조체를 보면 page operations, virtual address, physical frame, 그리고 어떠한 종류의 page인지를 알려주는 union field가 있다.

    union field에는 4가지의 종류(project 3까지는 3가지 종류를 가짐)가 있지만 한 시점에는 한 가지의 member, 즉 page가 uninit인지 anonymous인지 file-backed인지 한 가지의 type만 가질 수 있다.

    * va는 virtual address로 해당 page의 시작 (가상) 주소를 가지고 있고 *frame은 프레임에서 역참조를 위해 mapping된 frame을 가지고 있는다.

     

    그러면 page operations 구조체를 알아보자.

    struct page_operations {
      bool (*swap_in) (struct page *, void *);
      bool (*swap_out) (struct page *);
      void (*destroy) (struct page *);
      enum vm_type type;
    };

    페이지는 swap in이나 swap out 혹은 destory되는 행동을 취할 수 있다.

    그래서 어떠한 행동을 취하는지를 담고 있고 이 3가지의 행동은 page type이 어떠한 것인지에 따라 세부적으로 보면 다르게 수행된다.

    swap in은 swap disk에서 physical memory로 load하는 행동이고  swap out은 physical memory을 차지하던 것을 swap disk로 내리는 행동이고 destroy는 해당 page를 없애는 행동이다.

     

     

     

    3. Implement Supplemental Page Table

    pintos에서는 가상 주소와 물리 주소를 매핑하기 위해 페이지 테이블이 존재하는데 멀티 레벨 페이지를 가지고 있고 레벨은 4단계이다.

    즉, 4개의 page table을 거쳐 가상 주소를 물리 주소로 매핑할 수 있다.

    inmplement supplemental page table은 page fault와 자원 관리를 다루기 위해 각각의 페이지에 대한 추가적인 정보를 가지고 있는 것이다.

    그래서 project 3에서는 첫 번째 과제로 supplemental page table을 위한 기본적인 함수를 구현해야한다.

     

    일단은 supplemental page table에 어떠한 멤버를 가질지 디자인해야하고 아래의 세가지 함수를 구현해야한다.

    /* supplemental page table를 초기화해주는 역할
    * 이 함수는 새로운 프로세스가 시작할 때와 (in initd of userprog/process.c)
    * 프로세스가 fork될 때 call된다. (in __do_fork of userprog/process.c).*/
    void supplemental_page_table_init (struct supplemental_page_table *spt);
    
    /* 주어진 supplemental page table에서 virtual memory와 일치하는 page를 찾는 역할
    * 찾는 것을 실패하면 null 반환 */
    struct page *spt_find_page (struct supplemental_page_table *spt, void *va);
    
    /* 주어진 supplemental page table에 페이지를 삽입하는 역할
    * 이 함수에서는 virtual address가 주어진 supplemental page table에 존재하는지 확인해야함. */
    bool spt_insert_page (struct supplemental_page_table *spt, struct page *page);

     

     

     

    4. Frame Management

    앞에서 얘기한 struc page는 virtual address, page type 등의 정보는 포함하고 있지만 physical memory에 대한 정보는 포함하고 있지 않다.

    physical memory를 할당받는palloc_get_page 등의 함수를 봐도 단순히 physical memory의 address만 반환하므로 추가적인 정보들을 담기 위한 것이 필요하고 pintos에서는 새로운 구조체 struct frame를 정의하고 struct page와 함께 이용한다.
    physical memory에 대한 추가적인 정보(metadata)는 physical memory의 address, 할당받은 memory pool, 할당된 시점, priority 등이 있다.

     

    현재 pintos에서 구현된 struct frame은 아래와 같다.

    /* The representation of "frame" */
    struct frame {
      void *kva;            /* kernel virtual address */
      struct page *page;
    };

    내가 구현해야하는 함수는 아래와 같다.

    /* palloc_get_page를 호출하여 user pool에서 새로운 physical page를 얻는 역할을 한다.
    * 성공정으로 user pool에서 page를 받았을 때, frme도 할당받고 프레임 구조체의 멤버도 초기화하고 frame 구조체를 반환.
    */
    static struct frame *vm_get_frame (void);
    
    /* claim page라는 말은 physical frame을 할당받는다는 의미임
    * 먼저 vm_get_frame을 호출하여 프레임을 얻고 MMU를 세팅해야함.
    * 즉, 페이지 테이블에 가상주소를 물리주소로 매핑하는 것을 추가해주어야함. */
    bool vm_do_claim_page (struct page *page);
    
    /* va를 인자로 받아 page를 calim해주는 역할.
    * 먼저 page를 가져온 다음에 가져온 page를 인자로 하는 vm_do_claim_page를 호출하면 됨. */
    bool vm_claim_page (void *va);

     


    [오늘의 나는 어땠을까?]

    어제 너무 큰 피로감을 느껴서 오늘은 푹 자봐야겠다는 생각으로 7시간정도 잔 뒤에 강의실에 나왔다.

    근데 이상하게도 졸은 것은 어제와 마찬가지였다.

    그래도 몸이 느끼는 피로감은 어제보다는 훨씬 나았다.

    잠시 졸은 뒤에도 다시 공부에 집중을 할 수 있었지만 이렇게 많이 자도 조는 내 모습을 보며 왜 이렇게 조는지 궁금해졌다.

    몸에 이상이 있는건가...

     

    오늘은 다시 잠을 5시간정도 자고 나올 생각인데 몸이 최대한 버텨줬으면 좋겠다.

    꾸준한 운동이 동반되면 더 잘 버틸 수 있을 것같은데 지금 상황에서는 운동할 시간을 따로 두기에는 시간이 부족하다.

    개발자 커리어를 시작한다면 운동도 꾸준히 할 수 있도록 하루의 계획을 세워야겠다.

    내 목표를 달성하는 것도 중요하지만 내가 생각하는 개발자로서의 로드맵을 완주하기 위해서는 건강도 중요하다.

    어렵다. 한 가지만 할 수 있다는 것도 어렵고 챙겨야할 것들이 많다.

    댓글

Designed by Tistory.