사실 간단(?)했는데 솔직히 이번 3주차에서 가장 애먹었던 것 같다. swap은 개념도 생각보다 이해하기 쉽고 시간도 오래 걸리지 않았고, stack growth는 직관적이여서 처음에 개념만 이해하면 괜찮았는데 memory mapped file에서 시간이 엄청 오래 걸렸다.
게다가 처음에 구현한 방식대로 했다가 test case는 통과했으나 알고 보니 lazy loading이 아니여서 다음날 아침에 모두 날려버렸을 때의 기분은 정말 슬펐다. 그래도 수정을 거쳐 지금의 코드가 완성되어 정상적으로 출력이 가능했다.
void *do_mmap (void *addr, size_t length, int writable, struct file *f, off_t offset) {
uint64_t va = addr;
struct file *file = file_reopen(f);
int pg_cnt = DIV_ROUND_UP(length, PGSIZE);
size_t file_len = file_length(file);
size_t read_bytes = file_len < length ? file_len : length;
while (true) {
pg_cnt--;
size_t page_read_bytes = read_bytes < PGSIZE ? read_bytes : PGSIZE;
size_t page_zero_bytes = PGSIZE - page_read_bytes;
struct file_segment *file_segment = malloc(sizeof(struct file_segment));
file_segment->file = file;
file_segment->page_read_bytes = page_read_bytes;
file_segment->page_zero_bytes = page_zero_bytes;
file_segment->ofs = offset;
if (!vm_alloc_page_with_initializer(VM_FILE, va, writable, lazy_load_segment, file_segment)) {
return NULL;
}
struct page *page = spt_find_page(&thread_current()->spt, va);
page->marker = VM_DUMMY;
if(pg_cnt == 0) {
page->marker = VM_FILE_END;
break;
}
read_bytes -= page_read_bytes;
offset += page_read_bytes;
va += PGSIZE;
}
return addr;
}
void do_munmap (void *addr) {
while (true) {
struct page *page = spt_find_page(&thread_current()->spt, addr);
if (page->marker & VM_FILE_END) {
destroy(page);
break;
}
else {
destroy(page);
}
addr += PGSIZE;
}
}
위 코드는 팀원 형이 최종적으로 완료한 것으로 사실 나는 약간 다른 방식을 사용했다. 하지만 marker를 사용하는 방식이나 큰 틀은 비슷하여 (사실 비슷할 수밖에 없다. 팀이니까ㅋㅋㅋ) 가져왔다.
내 코드는 아니 코드라고 해야할까 나한테는 큰 문제가 있다. 자꾸 간헐적으로 syn_read와 swap_fork가 실패하는 것이였다. 아니 간헐적으로 성공하는 정도.. 1, 2주차 결과물의 차이도 있겠지만 그걸 찾으려 1, 2주차 부분을 다시 뜯어보기에는 시간이 부족하여 정상적으로 돌아가는 팀원들과 페어 프로그래밍을 주로 하게 된 것 같다.
1, 2주차 때는 오히려 개인적으로 코딩을 진행하는 일이 많았는데 사실 그 때보다 이렇게 여럿이 한 컴퓨터에 매달리며 페어 프로그래밍을 하는 것이 뭔가 재밌기도 하고 효율적으로도 좋은 것 같다.
룸메와 삼겹살을 사서 수육을 해먹었다. 요리하는데 거의 1시간 30분정도 소요됐고, 먹고 과일도먹고 하다보니 시간이 훌쩍 갔다. 뭔가 힐링한 기분이다.
다음에는 대패삽겹살을 요리해보기로 했다. 맛있을 것 같다!
사실 이정도 규모?의 요리는 처음이였다.(요리도 아닌데..ㅋㅋㅋㅋ) 그래도 나름 성공적으로 마무리해서 다행이다. 다음엔 더 잘해보고 싶다.