pintos

[WIL] PROJECT1 - Alarm Clock

์žฅ์˜ 2023. 10. 3. 01:58

Alarm Clock


๐Ÿ™ˆ devices/timer.c ์— ์žˆ๋Š” timer_sleep()์„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•ด๋ด…์‹œ๋‹ค.

 

๐Ÿ“Œํ˜„์žฌ ํ•€ํ† ์Šค์— ๊ตฌํ˜„๋˜์–ด์žˆ๋Š” timer_sleep()

  •   ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค๋Š” ์•Œ๋žŒ์„ ์šธ๋ ค์ค˜์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ๋๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด, ready ์ƒํƒœ์™€ running ์ƒํƒœํƒœ๋ฅผ ์™”๋‹ค๊ฐ”๋‹ค ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ, ๋‘ ์ƒํƒœ ์‚ฌ์—์—์„œ ์™”๋‹ค๊ฐ”๋‹ค ํ•˜๋ฉด์„œ ์†Œ๋ชจ์ ์ธ cpu cycle์„ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋œ๋‹ค. ์“ฐ๋ ˆ๋“œ๊ฐ€ running ์ƒํƒœ์ผ ๋•Œ, alarm์„ ํ˜ธ์ถœํ•˜๋ฉด, ์ค€๋น„๋ฆฌ์ŠคํŠธ์˜ ๊ฐ€์žฅ ๋งจ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‹ค์‹œ ๋“ค์–ด๊ฐ€๊ณ , ๊ฒฐ๊ตญ ๋‹ค์‹œ ์‹คํ–‰๋œ๋‹ค. ๋”ฐ๋ผ์„œ, ํ˜„์žฌ ๊ตฌํ˜„๋œ ๋ฐฉ์‹์œผ๋กœ ์ค€๋น„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ฃจํ”„๋ฅผ ๊ณ„์† ๋Œ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ready_list -> running -> yield -> ready_list

 

๐Ÿ’ก๊ตฌํ˜„ ์•„์ด๋””์–ด

 

๐Ÿ‘‰๐Ÿปblocked ํ™œ์šฉํ•˜๊ธฐ

  • blocked ๋ผ๋Š” ๊ฐœ๋…์„ ํ™œ์šฉํ•ด timer_sleep()์„ ๊ตฌํ˜„ํ•œ๋‹ค.
  • timer_sleep()์„ ํ˜ธ์ถœํ•˜๋ฉด, os๊ฐ€ ์‹คํ–‰์ค‘์ด์—ˆ๋˜ running thread๋ฅผ blocked ์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด ์ค€๋‹ค. os๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹œ๊ฐ„์„ ์ฒดํฌํ•ด์„œ ,blocked ์ƒํƒœ์— ์žˆ๋Š” ์“ฐ๋ ˆ๋“œ๋ฅผ ๊นจ์›Œ์ฃผ๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ์ ‘๊ทผ๋ฐฉ๋ฒ•์œผ๋กœ cpu์‹ธ์ดํด๊ณผ ์ „๋ ฅ์†Œ๋ชจ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๊ฒŒ๋จ

  • ํ˜„์žฌ์˜ ํ•€ํ† ์Šค์—๋Š” all_list , ready_list ๋‘ ๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๋งŒ ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค. ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ sleep_list๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค. ์ด ๋ฆฌ์ŠคํŠธ๋Š” blocked ์ƒํƒœ์ธ ์Šค๋ ˆ๋“œ๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ timer_sleep()์„ ํ˜ธ์ถœํ•˜๋ฉด, os๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์ผ๋‹จ sleep_list์— ๋„ฃ๊ณ  os๋Š” ํƒ€์ด๋จธ๋ฅผ ๊ณ„์† ์ฒดํฌํ•˜๋‹ค๊ฐ€, ์‹œ๊ฐ„์ด ๋‹ค ๋˜๋ฉด, ๊ทธ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊นจ์›Œ์ค€๋‹ค.

 

alarm clock - ๊ตฌํ˜„


โœ๏ธthread.h

int64_t thread_tick_count;
  • thread ๊ตฌ์กฐ์ฒด์— ์ถ”๊ฐ€

 

โœ๏ธthread.c

void make_thread_sleep(int64_t ticks)
{
	enum intr_level old_level;
	old_level = intr_disable();
	ASSERT(!intr_context());
	ASSERT(intr_get_level() == INTR_OFF);
	// printf("in thread sleep\n");
	struct thread *t = thread_current();
	
	// ticks๋ฅผ ์–ด๋””๋‹ค ์“ธ๊นŒ
	// ๋„ฃ์„๋•Œ ์ •๋ ฌํ•ด์„œ ๋„ฃ๊ธฐ
	//  list_push_back(&blocked_list, &thread_current() -> elem);
	// list, ํ˜„์žฌ ๋ฆฌ์ŠคํŠธ์— ์‚ฝ์ž…ํ•˜๋ ค๋Š” thread, list์— ์žˆ๋Š” ์Šค๋ ˆ๋“œ

	t->thread_tick_count = ticks;
	t->status = THREAD_BLOCKED;
	list_insert_ordered(&blocked_list, &(t->elem), tick_less, NULL);
	schedule();
	intr_set_level(old_level);
}

void make_thread_wakeup(int64_t ticks)	
{
		
		// ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•ด์„œ ๋„ฃ์–ด์ค˜์•ผํž˜
		while (!list_empty(&blocked_list) && list_entry(list_front(&blocked_list), struct thread, elem) -> thread_tick_count <= ticks)
		{
			struct thread * t = list_entry(list_pop_front(&blocked_list), struct thread, elem);
			// list_pop_front(&blocked_list);
			thread_unblock(t);
		}
	}
		

static bool
tick_less(const struct list_elem *a_, const struct list_elem *b_,
		  void *aux UNUSED)
{
	const struct thread *a = list_entry(a_, struct thread, elem);
	const struct thread *b = list_entry(b_, struct thread, elem);

	return a->thread_tick_count < b->thread_tick_count;
}

 

โœ๏ธtimer.c

/* timer ์ธํ„ฐ๋ŸฝํŠธ๋Š” ๋งค tick ๋งˆ๋‹ค ticks ๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚ด์œผ๋กœ์„œ ์‹œ๊ฐ„์„ ์žฐ๋‹ค. 
	์ด๋ ‡๊ฒŒ ์ฆ๊ฐ€ํ•œ ticks ๊ฐ€ TIME_SLICE ๋ณด๋‹ค ์ปค์ง€๋Š” ์ˆœ๊ฐ„์— intr_yield_on_return() ์ด๋ผ๋Š” ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๋Š”๋ฐ, 
	์ด ์ธํ„ฐ๋ŸฝํŠธ๋Š” ๊ฒฐ๊ณผ์ ์œผ๋กœ thread_yield() ๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค. 
	์ฆ‰ ์œ„์˜ scheduling ํ•จ์ˆ˜๋“ค์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š๋”๋ผ๋„ ์ผ์ • ์‹œ๊ฐ„๋งˆ๋‹ค ์ž๋™์œผ๋กœ scheduling ์ด ๋ฐœ์ƒํ•œ๋‹ค. */
static void
timer_interrupt (struct intr_frame *args UNUSED) {
	ticks++;
	thread_tick ();
	make_thread_wakeup(ticks);
}

/* Suspends execution for approximately TICKS timer ticks. */
// void // timer_sleep() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด, ํ•ด๋‹น ์Šค๋ ˆ๋“œ๋Š” ready์ƒํƒœ๊ฐ€ ์•„๋‹Œ blocked์ƒํƒœ๋กœ ์ „ํ™˜๋œ๋‹ค. blocked๋œ ์Šค๋ ˆ๋“œ๋“ค์€ ์ผ์–ด๋‚  ์‹œ๊ฐ„์ด ๋˜๋ฉด ์ผ์–ด๋‚˜์•ผ ํ•œ๋‹ค.
// timer_sleep (int64_t ticks) { // system timer : ์ดˆ๋‹น 100ํšŒ์˜ ticks ๋ฐœ์ƒ. (1 tick = 10ms)
// 	/* Busy waiting : Thread๊ฐ€ CPU๋ฅผ ์ ์œ ํ•˜๋ฉด์„œ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ. CPU ์ž์›์ด ๋‚ญ๋น„ ๋˜๊ณ , ์†Œ๋ชจ ์ „๋ ฅ์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋‚ญ๋น„๋  ์ˆ˜ ์žˆ๋‹ค. */
void
timer_sleep (int64_t ticks) {
	// int64_t start = timer_ticks (); //ํ˜„์žฌ tic์„ start์— ๋„ฃ์–ด์„œ
	
	ASSERT (intr_get_level () == INTR_ON); //interrupt ์ƒํƒœ์ธ์ง€ ํ™•์ธ
	// printf("<1>\n");
	// while (timer_elapsed (start) < ticks) //start๋กœ ๋ถ€ํ„ฐ ์‹œ๊ฐ„์ด ์–ผ๋งˆ๋‚˜ ์ง€๋‚ฌ๋Š”์ง€

	// 	thread_yield ();
	// printf("Switch : %d\n", swch);
	
	// printf("in 'while' ... running\n");
	make_thread_sleep(timer_ticks () + ticks); //ํ˜„์žฌ ์‹œ๊ฐ„๋ถ€ํ„ฐ ์žฌ์›Œ์•ผํ•  tick์„ ๋”ํ•ด์ฃผ์–ด์•ผํ•จ
	// printf("timer_sleep finish\n");
	// thread_print_stats();
}

 

'pintos' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[WIL] Copy On Write  (1) 2023.10.24
[WIL]Project3: Virtual Memory  (1) 2023.10.11
[PROJECT 1 : THREADS]๊ณผ์ œ ์„ค๋ช…  (0) 2023.09.21