본문 바로가기
정글/TIL

[크래프톤 정글] 85일 - 🛫

by 위대한초밥V 2023. 6. 27.
오늘 한 일 👩‍💻
- 3주차 마무리
- 알고리즘 문제 풀이
- 객체지향 사실과 오해 책 읽기

알고리즘

https://www.acmicpc.net/problem/11399

 

11399번: ATM

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

www.acmicpc.net

 


 

3주차 Pintos

3주차는 Virtual Memory를 구현하는 것이 과제이다. 

많은 분들이 이 과제는 구현할 것도 많고, 내용도 많아서 쉽지 않다고 많이 들었는데 막상 해보니 어렵기도 했지만 재미난 부분도 있었다고 생각한다. 

 

과제는 크게 3가지로 구분된다.

- Memory Management

- Anonymous Page

- Stack Growth

- Memory Mapped Files

- Swap In/Out

- Copy-on-Write (Extra)

 

본인은 Memory Mapped Files까지 진행했고, Swap In/Swap Out은 시작도 하지 못했다.

공부 방향은 gitbook 중심으로 진행하였고, 처음에는 구현 할 때 속도가 잘 안나서 수도코드를 참고해 진행하였다.

https://hongchangsub.com/pintos-project3-anonymous-page/

 

pintos - project3(Anonymous Page) 수도 코드

저번 포스팅에 이어 두번째 과제인 Anonymous Page에 대한 포스팅 진행하겠습니다. 이번 과제에서는 Lazy-Loading을 구현해야합니다.본격적으로 구현을 하기 앞서 필수적으로 알아야할 지식들을 먼저

hongchangsub.com

 

도전한 점💪

✅ 테스트하면서 프로젝트 진행하기

이전 TIL에도 작성했지만 구현 내역을 테스트를 하면서 프로젝트를 진행하려고 했다.(일종의 TDD라고 해야하나...?)

 

이유는 주어진 테스트 케이스는 특정 함수만을 테스트하는 것이 아니라, 테스트 범위가 넓어서 작은 단위로 구현한 함수들이 잘 동작하는지 알고 싶었다. 이러한 이유로 ASSERT문을 사용하여 작은 단위로 기능을 확인하는 습관을 갖는 것이 이번 과제에 스스로 부여한 목표가 되었다.

 

내가 생각한 테스트 방법은 다음과 같다. 

/* Initialize new supplemental page table */
void
supplemental_page_table_init (struct supplemental_page_table *spt UNUSED) {
	// supplemental_page_table 테이블을 초기화한다.
	
	// ✅ TEST: supplemental_page_table_init
	// bool initialize_hash = hash_init(&spt->spt_hash, hashing, hash_less, NULL);
	// ASSERT(initialize_hash != true);	// initialize_hash가 true라면 프로그램을 종료시킨다.

	hash_init(&spt->spt_hash, hashing, hash_less, NULL);
}

예를들어, supplemental_page_table_init은 hash_init으로 supplemental page table을 초기화한다. 

이때 hash_init은 성공 시, true를 반환하는 함수이므로 성공 여부를 ASSERT문으로 확인한다.

bool initialize_hash = hash_init(&spt->spt_hash, hashing, hash_less, NULL);
ASSERT(initialize_hash != true);	// initialize_hash가 true라면 프로그램을 종료시킨다.

함수 안의 동작이 잘 수행되고 종료되는 것까지 확인할 수 있다.

 

✔️ 생각한 점

어떤 부분을 테스트해야할지 충분한 고민이 필요하고, 테스트하려고 하는 함수가 어떤 함수에서 호출되는지 알아야 한다.

  • spt_find_page 함수를 테스트하려면, vm_get_frame 함수가 먼저 구현되어야 한다. => 이런 점에서 구현 흐름에 테스트에 맞춰져서 구현 방향을 찾는데 도움되었다✨.

 

테스트하기 어려운 테스트도 있다. 

  • spt_insert_page 함수는 해당 함수를 구현하고 테스트하는 시점에, 어떤 곳에서도 호출되지 않아 함수를 실행하기 어려웠다.

 

온전한 테스트할 수 있을까?

/* Find VA from spt and return page. On error, return NULL. */
struct page *
spt_find_page (struct supplemental_page_table *spt UNUSED, void *va UNUSED) {
	**// ✅ TEST: spt_find_page
	bool unit_test_spt_find_page = false;** 
	// struct page *page = NULL;
	/* TODO: Fill this function. */

	// page 객체를 만들어준다.
	struct page *page = (struct page *)malloc(sizeof(struct page));
	page->va = pg_round_down(va);

	// spt_hash에서 va 객체를 찾는다.
	struct hash_elem *e = hash_find(&spt->spt_hash, &page->hash_elem);
	free(page);

	**// ✅ TEST: spt_find_page**
	**unit_test_spt_find_page = true;
	ASSERT(unit_test_spt_find_page != true);	// unit_test_spt_find_page가 true이면 멈춘다.**

	return e != NULL ? hash_entry(e, struct page, hash_elem) : NULL;
}
bool
vm_alloc_page_with_initializer (enum vm_type type, void *upage, bool writable,
		vm_initializer *init, void *aux) {

	ASSERT (VM_TYPE(type) != VM_UNINIT)

	struct supplemental_page_table *spt = &thread_current ()->spt;

	/* Check wheter the upage is already occupied or not. */
	**if (spt_find_page (spt, upage) == NULL) {  // 👉 반환값을 테스트하려면 기존의 함수를 수정**
		/* TODO: Create the page, fetch the initialier according to the VM type,
		 * TODO: and then create "uninit" page struct by calling uninit_new. You
		 * TODO: should modify the field after calling the uninit_new. */

		/* TODO: Insert the page into the spt. */
	}
err:
	return false;
}

반환값을 테스트하려면 기존의 함수를 수정해야한다. ⇒ return 안에서 ASSERT문으로 함수 동작을 확인함

하나의 함수에 구현과 테스트가 함께 존재해서 코드가 너~무! 지저분해졌다.

 

다음에는 어떻게 잘 할 수 있을까?

 

일단 자동화 테스트 도구를 사용해서 환경을 구축하자.

예를들어, 자바에서는 JUnit을 이용해 단위 테스트를 진행하는 것처럼 c++은 cppunit 등의 단위 테스트 도구가 있다.

관련 글을 살펴보면 ASSERT문을 기반으로 하는 것 같긴하지만...

https://www.joinc.co.kr/w/Site/SoftWare_engineering/TDD?current=4 

 

C++ 프로그램에서 TDD - Test Driven Development 적용해보기

C++ 프로그램에서 TDD - Test Driven Development 적용해보기 는 소프트웨어 개발을 위한 방법론으로 짧은 개발 사이클을 반복적으로 수행하는것을 기본으로 하고 있습니다. 이를 위해서 개발자들은 자

www.joinc.co.kr

 

Mock 객체를 이해하자!

일단 Mock 객체라는 것은 시뮬레이션을 하기 위한 가상 객체를 만드는 것을 말한다. 

Pintos에서는 여러 함수와 모듈 흐름을 테스트해야하는 경우가 대부분이다. 각 함수의 상태가 변할 때 결과가 어떤 영향을 미칠지 잘 생각해보자. 

 

이 글을 작성하면서 느낀 점은 Pintos 프로젝트라는 것을 수행할 때 작성된 테스트 코드를 사용하여 검증하므로 테스트 코드를 잘 사용하는 것도 방법일 것 같다. 

 

이번 pintos 프로젝트에서는 잘 하지 못했지만 나만무에서는 경험할 수 있었음 좋겠다.

 

🎯 팀 포커스 타임

이번 팀 프로젝트부터는 팀 내 포커스 타임을 갖기도 하였다.

지난 주차와 다르게 이번 주차 팀원들은 모두 바이오리듬이 달라서 팀 내 집중 시간이 필요함을 느꼈다.

우리는 오후 2시부터 5시, 저녁 8시부터 10시로 설정했는데 만족도는 굿이다!

 

일단 모두 함께 있는 시간이 있으니 고민을 나눌 수 있었고, 팀이 함께 한다는 느낌을 받을 수 있었다.

또 모두가 그 시간에는 강의실에 있으려고 노력하는 점도 인상깊었다. 

 

이제 곧 나만무가 시작될텐데 포커스타임을 무조건 가져가고 싶다.

 

🧐 어려운 점 & 이렇게 해봤으면 어땠을까?

테스트 잘 살펴보기

과제를 수행하면서 테스트 조건을 잘 살펴봤다면, 해결될만한 것들이 일부 있었다. 

대부분 예외처리에 대한 내용이긴한데 테스트를 보지 않고서는 통과되기 어려울 것 같다. 

 

CS 지식을 함께 가져가는 법

구현 위주로 프로젝트를 진행하다보니 개인적으로 CS가 잘 정돈되지 않은 기분이 들었다. 

결국에는 CS 지식이 면접을 좌우할텐데 프로젝트를 진행하면서 공부의 필요성을 느낀 키워드를 정리하는 시간을 미리 갖었으면 더 좋았을 것 같다. 

 

그래도...

큰 산을 일부 넘어가는 것 같아서 만족스럽다. 

기능이 많아 일정을 잘 관리못해 일부 기능을 구현하지 못하고(+ 이해도) 넘어간 것은 아쉽지만 남은 한주동안 잘 정리해서 마무리하고 싶다.


 

이제 정글 퇴소까지 50일 정도 남았다.

마지막 주는 지원서 작성 및 프로젝트 개선 기간이니 이렇게 몰입하여 프로젝트를 진행할 수 있는 기간이 정말 얼마 남지 않았다. 

여러모로 마음이 조금해지려고 한다. 욕심이 조급함이 되지 않도록 경계해야겠다.

 

다음주부터 나만무 시작이라 약간 붕 뜨려고 하는데 일단 내가 당장 해야하는 것들이 무엇인지 리스트업하고, 나만무 준비도 슬슬 해보려고 한다. 50일을 촘촘하게 보내어 수료 후에 내가 원하는 상태에 도달하고 싶다. 홧팅!💪👊

 

[1주일 동안 할 것들]

- Algorithm 오답

- Pintos 정리

- Web Server 정리

- 객사오 읽기

- 우테코 프리코스 미션 1~2개 정도 해보기

- git/github 사용법 정리

 

내일 할 일 📝
- 객사오(4,5장)
- Pintos Alarm Clock
반응형