Pintos Projects: Virtual Memory - Paging (2)

차호성·2024년 9월 8일
0

Pintos

목록 보기
7/7

프로세스 지연 로딩(Process Lazy Loading)

이전까지는 pintos에서 프로세스를 실행하면 페이지가 하나 할당되고 여기에 코드와 데이터, 스택이 할당되었습니다. 이것을 이제는 프로세스가 요청하는 메모리에 대해서만 페이지를 할당하는 방식으로 변경합니다. 이를 통해서 윤영체제에서 메모리를 효율적으로 사용할 수 있습니다. 아무리 크기가 큰 프로그램이더라도 현재 사용 중인 영역만 불러오면 되기 때문입니다.

loag_segment() 함수를 수정하여 프로그램의 영역을 페이지 단위로 분할하여 해당 정보를 supplemental page table에 저장합니다.

/* process.c */

static bool
load_segment (struct file *file, off_t ofs, uint8_t *upage, uint32_t read_bytes, uint32_t zero_bytes, bool writable)
{
  ...
  
  struct thread *t = thread_current ();
  
  while (read_bytes > 0 || zero_bytes > 0)
    {
      size_t page_read_bytes = read_bytes < PGSIZE ? read_bytes : PGSIZE;
      size_t page_zero_bytes = PGSIZE - page_read_bytes;
      
      struct page *p = malloc (sizeof (struct page));
      p->address = upage;
      p->segment = SEG_CODE;
      p->writable = writable;
      p->file = file;
      p->position = ofs;
      p->read_bytes = page_read_bytes;
      p->zero_bytes = page_zero_bytes;
      page_table_insert (&t->extra_page_table, p);
      
      read_bytes -= page_read_bytes;
      zero_bytes -= page_zero_bytes;
      upage += PGSIZE;
      ofs += page_read_bytes;
    }
    
  return true;
}
profile
프로그래머

0개의 댓글