์ •๊ธ€/TIL

[TIL] - 2023.05.28

Casteira 2023. 5. 28. 20:54

๐Ÿ“Œ  ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ

 

Thread ๊ฐœ์„ 

sleep/awake ๋ฐฉ์‹

1๏ธโƒฃ - struct thread ๊ฐœ์„ 

์Šค๋ ˆ๋“œ ๊ตฌ์กฐ์ฒด ์•ˆ์— sleepํ•  ์‹œ ๊นจ์›Œ์ค˜์•ผ ํ•˜๋Š” ์‹œ๊ฐ์„ ์ง‘์–ด๋„ฃ๋Š”๋‹ค.

include/threads/thread.h/struct thread

struct thread {
	/* Owned by thread.c. */
	tid_t tid;                          /* Thread identifier. */
	enum thread_status status;          /* Thread state. */
	char name[16];                      /* Name (for debugging purposes). */
	int priority;                       /* Priority. */

...

	/* wakeup tick : ๊นจ์–ด๋‚˜์•ผ ํ•  tick(์‹œ๊ฐ) */
	int64_t wakeup_tick;

...

}

2๏ธโƒฃ - sleep_list ๋งŒ๋“ค๊ธฐ

threads/thread.c

/* sleep ์ƒํƒœ์˜ ์Šค๋ ˆ๋“œ๋“ค์„ ์ €์žฅํ•˜๋Š” ๋ฆฌ์ŠคํŠธ */
static struct list sleep_list;
static int64_t global_tick_to_awake; /* ready list์—์„œ ๋งจ ์ฒ˜์Œ์œผ๋กœ awakeํ•  ์Šค๋ ˆ๋“œ์˜ tick ๊ฐ’ */

threads/thread.c/thread_init()

main() ํ•จ์ˆ˜์—์„œ ํ˜ธ์ถœ๋œ๋‹ค. ๋งจ ์ฒ˜์Œ ์Šค๋ ˆ๋“œ์™€ ๊ด€๋ จ๋œ ๊ตฌ์กฐ์ฒด๋“ค๊ณผ main ์Šค๋ ˆ๋“œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค.

void thread_init (void) {

...
/* Init the global thread context */
	lock_init (&tid_lock);
	list_init (&ready_list);
	list_init (&destruction_req);
	list_init (&sleep_list);     // sleep ์Šค๋ ˆ๋“œ๋“ค์„ ์—ฐ๊ฒฐํ•ด๋†“์€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
	global_tick_to_awake = INT64_MAX;

}

3๏ธโƒฃ - global_ticks ๊ด€๋ฆฌ

thread/thread.c/update_global_tick_to_awake()

์ธ์ž๋กœ ๋ฐ›์€ ticks์™€ global_tick์„ ๋น„๊ตํ•˜๋ฉด์„œ ๋” ์ž‘์€ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.

sleep_list๋ฅผ ํ™•์ธํ•  ๋•Œ, global_tick์„ ๋ณด๊ณ  ํŒ๋‹จํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์ „๋ถ€ ๋‹ค ํ™•์ธ ํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†์–ด์„œ ๋” ํšจ์œจ์ ์ด๋‹ค.

void update_global_tick_to_awake(int64_t ticks){
	global_tick_to_awake = (global_tick_to_awake>ticks) ? ticks : global_tick_to_awake;
}

thread/thread.c/get_global_tick_to_awake()

global_tick_to_awake ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

4๏ธโƒฃ - thread_sleep ๊ตฌํ˜„

thread๋ฅผ sleep_list์— ์ถ”๊ฐ€ํ•˜๊ณ  sleep(BLOCKED) ์‹œํ‚จ๋‹ค.

thread/thread.c/thread_sleep()

void thread_sleep(int64_t ticks){
	/* ํ˜„์žฌ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ์ž‘์—…์ด๋ฏ€๋กœ. */
	struct thread* cur = thread_current();

	/* ์ธํ„ฐ๋ŸฝํŠธ disable*/
	enum intr_level old_level;
	ASSERT(!intr_context());
	old_level = intr_disable(); // ์Šค๋ ˆ๋“œ๋ฅผ list์— ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ์ผ์€ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๊ฑธ๋ฆฌ๋ฉด ์•ˆ ๋œ๋‹ค.	

	ASSERT(cur != idle_thread);  // idle thread๋ผ๋ฉด ์ข…๋ฃŒ.

	cur->wakeup_tick = ticks;						// wakeup_tick ์—…๋ฐ์ดํŠธ
	update_next_tick_to_awake(cur->wakeup_tick); 	// next_tick_to_awake ์—…๋ฐ์ดํŠธ
	list_push_back (&sleep_list, &cur->elem);		// sleep_list์— ์ถ”๊ฐ€

	/* ์Šค๋ ˆ๋“œ๋ฅผ sleep ์‹œํ‚จ๋‹ค. */
	thread_block();

	/* ์ธํ„ฐ๋ŸฝํŠธ ์›๋ณต */
	intr_set_level(old_level);
}

5๏ธโƒฃ - thread_awake ๊ตฌํ˜„

Thread๋ฅผ head๋ถ€ํ„ฐ tail๊นŒ์ง€ ์ˆœํšŒํ•˜๋ฉด์„œ ticks๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค์„ ๊ฐ€์ง„ ์Šค๋ ˆ๋“œ๋“ค์„ ๊นจ์›Œ์„œ ready_list์— ์ถ”๊ฐ€ํ•˜๊ณ  ์•„์ง ๊นจ์šธ ์‹œ๊ฐ„์ด ๋˜์ง€ ์•Š์€ ์Šค๋ ˆ๋“œ๋“ค์€ ์ตœ์†Œ ticks ์ผ ๊ฒฝ์šฐ global_tick์„ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

void thread_awake(int64_t ticks){
	struct list_elem* cur = list_begin(&sleep_list);
	struct thread* t;

	/* sleep list์˜ ๋๊นŒ์ง€ ์ˆœํ™˜ํ•œ๋‹ค. */
	while(cur != list_end(&sleep_list)){
		t = list_entry(cur, struct thread, elem);

		if (ticks >= t->wakeup_tick){  // ๊นจ์šธ ์‹œ๊ฐ„์ด ์ง€๋‚ฌ๋‹ค
			cur = list_remove(&t->elem);
			thread_unblock(t);
		}
		else{  // ์•„์ง ์•ˆ ๊นจ์›Œ๋„ ๋œ๋‹ค : ๋‹ค์Œ ์“ฐ๋ ˆ๋“œ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
			cur = list_next(cur);
			update_next_tick_to_awake(t->wakeup_tick);  // next_tick์ด ๋ฐ”๋€Œ์—ˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์—…๋ฐ์ดํŠธํ•ด์ค€๋‹ค.
		}
	}
}

6๏ธโƒฃ - timer_interrupt ์ˆ˜์ •

์œ„์—์„œ ์ˆ˜์ •ํ•œ global_tick์˜ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  interrupt๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋งค tick๋งˆ๋‹ค global_tick๋ณด๋‹ค ๋” ํด ๊ฒฝ์šฐ์—๋งŒ awake๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

 

 

 


 

๐Ÿ’ญ  ๋А๋‚€ ์  & ๋ฐฐ์šด ์ 

 

ํ•ด๋‹น ๋‚ด์šฉ๋“ค์„ ๋ณ€๊ฒฝํ•˜๋ฉด์„œ Thread๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ๋งŽ์ด ์ƒ๊ฐํ•˜๊ฒŒ ๋œ ๊ฒƒ ๊ฐ™๋‹ค. ํ•˜๋ฉด์„œ ๋งŽ์€ ๊ถ๊ธˆ์ฆ๋“ค์ด ์ƒ๊ธฐ๊ณ  ๋‹ค์Œ์— ํ•˜๊ฒŒ ๋  ์šฐ์„ ์ˆœ์œ„์— ๋Œ€ํ•ด์„œ๋„ ๋ง‰๋ง‰ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ์ž๋ฃŒ๋“ค์„ ์ฐธ๊ณ ํ•˜๊ณ  ํŒ€์›๋“ค๊ณผ ๋จธ๋ฆฌ๋ฅผ ๋งž๋Œ€๋ฉด์„œ ํ•ด๊ฒฐ์„ ํ•ด๋‚˜๊ฐ€๋Š” ๊ณผ์ •์ด ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

 


 

๐Ÿ”ฅ  ๋‚ด์ผ ๊ณต๋ถ€ํ•  ๋‚ด์šฉ

 

์šฐ์„ ์ˆœ์œ„

 

 


 

๐Ÿ—’๏ธ  ํฌ์ŠคํŒ…

 

 

 

 

๋”๋ณด๊ธฐ

ใ€Œ ๋ฌด์—‡๋ณด๋‹ค ๋จผ์ € ์ƒ์‹ฌํ•˜์ง€ ๋ง๋ผ. ๋ชจ๋“  ์ผ์€ ์ž์—ฐ์˜ ๋ณธ์„ฑ์—์„œ ๋น„๋กฏ๋œ๋‹ค. ์šฐ๋ฆฌ๋Š” ์งง์€ ์‹œ๊ฐ„ ์•ˆ์— ๋ฌด์˜๋ฏธํ•œ ์กด์žฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ์œ„๋Œ€ํ•œ ํ™ฉ์ œ ํ•˜๋“œ๋ฆฌ์•„๋ˆ„์Šค์™€ ์•„๊ตฌ์Šคํˆฌ์Šค๋„ ์‹œ๊ฐ„์„ ์ด๊ธฐ์ง€ ๋ชปํ–ˆ๋‹ค. ๊ทธ๋‹ค์Œ์€ ์šฐ๋ฆฌ์—๊ฒŒ ์ฃผ์–ด์ง„ ๊ณผ์ œ์— ๋Œ€ํ•ด ์ฃผ์˜ ๊นŠ๊ฒŒ ์ƒ๊ฐํ•˜๋ผ. ์šฐ๋ฆฌ์˜ ๋ชฉ์ ์€ ์„ ํ•œ ์ธ๊ฐ„์ด ๋˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์ž„์„ ํ™˜๊ธฐํ•˜๋ผ. ์ž์—ฐ์˜ ๋ณธ์„ฑ์ด ์šฐ๋ฆฌ์—๊ฒŒ ์š”๊ตฌํ•˜๋Š” ๋Œ€๋กœ ํ–‰ํ•˜๋ผ. ๊ทธ๋ฆฌ๊ณ  ์นœ์ ˆํ•จ๊ณผ ์„ฑ์‹คํ•จ, ๊ฒธ์†ํ•จ๊ณผ ํ•จ๊ป˜ ์šฐ๋ฆฌ๊ฐ€ ๋ณธ ๊ทธ๋Œ€๋กœ๋ฅผ ๋งํ•˜๋ผ. ใ€

-๋งˆ๋ฅด์ฟ ์Šค ์•„์šฐ๋ ๋ฆฌ์šฐ์Šค, ๋ช…์ƒ๋ก, 8.5

 

๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์— ์žˆ์–ด์„œ ์šฐ๋ฆฌ๋Š” ๋‘๊ฐ€์ง€ ์‚ฌํ•ญ์„ ์ง€์ผœ์•ผ ํ•œ๋‹ค.

์ฒซ์งธ, ํ™”๋ฅผ ๋‚ด์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค. ๊ฒฐ์ •์— ๋ถ€์ •์ ์ธ ์ƒ‰๊น”์ด ๋”ํ•ด์ง€๋ฉด ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ํž˜๋“  ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‘˜์งธ, ๋ชฉ์ ๊ณผ ์›์น™์— ๋ถ€ํ•ฉํ•ด์•ผ ํ•œ๋‹ค. ํ™”๋ฅผ ๋‚ด์ง€ ๋ง ๊ฒƒ, ๋ฐ”๋ฅด๊ฒŒ ํ–‰๋™ํ•  ๊ฒƒ. ์ด๊ฒƒ์ด ์ „๋ถ€๋‹ค.

๋”๋ณด๊ธฐ

ใ€Œ ๊ณ ๊ท€ํ•œ ์˜ํ˜ผ์€ ๋…ธ๋™์„ ์–‘์‹์œผ๋กœ ์‚ผ๋Š”๋‹ค.  ใ€

-์„ธ๋„ค์นด, ๋„๋•์— ๊ด€ํ•œ ์„œํ•œ, 31.5

 

์šฐ๋ฆญ๋ผ ์ผ์„ ํ†ตํ•ด ์ถฉ์กฑ๊ฐ์„ ๋А๋ผ์ง€ ๋ชปํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ด์œ ๋Š” ์ง„์งœ ํ•˜๊ณ  ์‹ถ์€ ์ผ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋•Œ๋กœ๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„์ด ์ฃผ์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๊ธฐ๋„ ํ•˜๋‹ค. ๋” ๋‚˜์œ ๊ฒƒ์€ ์ถฉ์กฑ๋˜์ง€ ๋ชปํ•œ ๊ฐ์ •์˜ ๋นˆํ‹ˆ์„ ๋ฉ”์šฐ๊ธฐ ์œ„ํ•ด ๋จน๊ณ , ์†Œ๋น„ํ•˜๊ณ , ์—ฌํ–‰ํ•˜๊ณ , ๋“œ๋ผ๋งˆ๋ฅผ ๋ณด๋Š” ๋ฐ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•ด๋„ ํ—ˆ์ „ํ•จ์€ ์—ฌ์ „ํžˆ ๋‚จ๋Š”๋‹ค. ํ•ด๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค. ๊ฐ์‚ฌํ•˜๊ฒŒ๋„ ์šฐ๋ฆฌ ์†์•ˆ์— ์žˆ๋‹ค.

๊ฑฐ๊ธฐ์„œ ๋ฒ—์–ด๋‚˜ ์ง„์งœ ์ผ์„ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค.