Project1 요약 정리
Pintos Project1이 끝났다. 첫 주차를 마치고서 정리하는글을 써보려고한다. 이 부분은 링크를 참고하길 바란다.
시작 전 개념 정리
과제
Project1 고민한 것들
int64_t MIN_alarm_time = INT64_MAX;
MIN_alarm_time
≥ 현재 ticks 일 때만 sleep list를 순회하며, blocked → ready list로 올려준다.new_MIN
변수를 두고, list 순회와 동시에 남은 스레드들 중 최솟값을 저장한다. MIN_alarm_time
을 new_MIN
으로 갱신한다.list_begin
/* Returns the beginning of LIST. */
struct list_elem *
list_begin (struct list *list) {
// 리스트가 초기화도 안 된 NULL일 경우 assert error
ASSERT (list != NULL);
return list->head.next;
}
list_front
/* Returns the front element in LIST.
Undefined behavior if LIST is empty. */
struct list_elem *
list_front (struct list *list) {
// 빈 리스트(head & tail은 있음)일 경우 assert error
ASSERT (!list_empty (list));
return list->head.next;
}
list_front
→ list_begin
으로 변경하여 해결했다.list.c
에 이미 list 정렬 관련 함수가 구현되어 있으니 활용하기로!list_sort()
O(n log n)
average caselist_insert_ordered()
O(n)
average caselist_entry
함수의 offset
설정 오류thread_set_priority()
함수priority
변경시 init_priority
를 함께 변경하지 않음// 틀린 코드
if (&thread_current()->donations != NULL)
// 옳은 코드
if (!list_empty(&thread_current()->donations))
lock_aquire(lock)
한 lock→holder
를 찾아가 donation한다. donation이 이루어지지 않으면 priority inversion 문제가 발생할 수 있다.lock→holder
뿐만 아니라, lock→holder→donations
에 있는 모든 스레드까지 donation이 이루어져야 한다. 그렇지 않으면 starvation 문제가 발생할 수 있다.어려웠던 점과 느낀점
처음엔 어떤식으로 접근해야 하는 것에 대한 어려움이 있었다. 다른 팀은 코드의 흐름을 먼저 파악한다던지 개념을 먼저 본다던지 각기 다른 방식으로 팀의 색깔에 맞게 진행되는 것 같았다.
우리 팀은 개념을 먼저 보고 난 후 코드를 보기로 했다. 개념을 보고 난 후 코드를 보니 막연했다. 개념으로 봤던 것이랑 아주 다른 세상(?)
이였다. 코드를 보면서 이해하는 시간도 많은 시간을 할애한 것 같다.
1주일 동안의 Project1이 끝나고 엄청난 양의 내용이 지나갔다. 왜 Pintos가 어렵다고 하는지 알게되었던 1주일의 시간이였던 것 같다.
PintOS Project1 GIthub 주소 PintOS