๐ ๊ณต๋ถํ ๋ด์ฉ
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
์ฐ๋ฆญ๋ผ ์ผ์ ํตํด ์ถฉ์กฑ๊ฐ์ ๋๋ผ์ง ๋ชปํ๋ ๋๋ถ๋ถ์ ์ด์ ๋ ์ง์ง ํ๊ณ ์ถ์ ์ผ์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋๋ก๋ ์ฐ๋ฆฌ์๊ฒ ๋๋ฌด ๋ง์ ์๊ฐ์ด ์ฃผ์ด์ ธ ์๊ธฐ ๋๋ฌธ์ด๊ธฐ๋ ํ๋ค. ๋ ๋์ ๊ฒ์ ์ถฉ์กฑ๋์ง ๋ชปํ ๊ฐ์ ์ ๋นํ์ ๋ฉ์ฐ๊ธฐ ์ํด ๋จน๊ณ , ์๋นํ๊ณ , ์ฌํํ๊ณ , ๋๋ผ๋ง๋ฅผ ๋ณด๋ ๋ฐ ์๊ฐ์ ํ ์ ํ๊ณ ์๋ค๋ ์ฌ์ค์ด๋ค. ํ์ง๋ง ๊ทธ๋ ๊ฒ ํด๋ ํ์ ํจ์ ์ฌ์ ํ ๋จ๋๋ค. ํด๋ฒ์ ๊ฐ๋จํ๋ค. ๊ฐ์ฌํ๊ฒ๋ ์ฐ๋ฆฌ ์์์ ์๋ค.
๊ฑฐ๊ธฐ์ ๋ฒ์ด๋ ์ง์ง ์ผ์ ์ฐพ๋ ๊ฒ์ด๋ค.