Pintos Project1 day 4

John Jean·2024년 8월 26일

pintos

목록 보기
4/7

핀토스

새로 수정한 점

// thread.c
// 재우는 함수 구현
void thread_sleep(int64_t ticks)
{
	enum intr_level old_level;

	struct thread *curr = thread_current();
	// 인터럽트 잠시 끄기
	old_level = intr_disable();
	// 기상시간 정해주기
	curr->wake_time = timer_ticks() + ticks;
	// 순서대로 넣을수도
	list_insert_ordered(&sleep_list, &curr->elem, compare_thread, NULL); // 리스트에 넣어주기
	// 일단 리스트 뒤에 넣어주자.
	// list_push_front(&sleep_list, &curr->elem);
	// 이제 재우자
	thread_block();
	// 작업이 끝난 후, 이전 인터럽트 상태로 복구
	intr_set_level(old_level);
}

// 깨우는 함수 구현

void thread_wake(void)
{
	int64_t current_ticks = timer_ticks();
	struct list_elem *e = list_begin(&sleep_list); // 첫 쓰레드 꺼내기

	while (e != list_end(&sleep_list))
	{
		struct thread *t = list_entry(e, struct thread, elem);
		if (t->wake_time <= current_ticks)
		{
			e = list_remove(e);
			thread_unblock(t);
		}
		else
		{
			// 리스트가 정렬되어 있으므로, 더 이상 깨울 스레드가 없으면 종료
			break;
		}
	}
}
  • 지금까지 했던 방법은 timer.c 에 있는 timer_sleep(), timer_interrupt() 에 직접 코드를 때려박아 재우기 깨우기를 했는데, 이런 방식을 사용한다면 thread.ctimer.c 에서 쓰이는 슬립리스트가 달라질 수 있기에, 리스트가 선언된 thread.c 에서 함수를 만들기로 했다.
  • 민석왈 디버깅하기에도 이방법이 좋다고 한다.
  • list_insert_ordered(&sleep_list, &curr->elem, compare_thread, NULL); // 리스트에 넣어주기 -> 지금까진 뒤에 계속 넣어줬는데, 이 방법을 쓰면 테스트 몇개 실패함. 순서대로 넣어주면 테스트 모두 성공.
profile
크래프톤 6기 정글러

0개의 댓글