[Pintos-KAIST] Project 1 :: Alarm Clock (Sleep-Awake ๋ฐฉ์‹์˜ Alarm Clock ๊ตฌํ˜„ํ•˜๊ธฐ)

2023. 4. 25. 21:28ใ†Computer Science

728x90
๋ฐ˜์‘ํ˜•

Alarm Clock

๐Ÿ’ก ์Šค๋ ˆ๋“œ๋ฅผ ์ž ์‹œ ์žฌ์› ๋‹ค๊ฐ€ ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๊นจ์šฐ๋Š” ๊ธฐ๋Šฅ์ธ
Alarm Clock์„ Busy-waiting ๋ฐฉ์‹์—์„œ Sleep-Awake ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜์ž!

 

1) Busy-waiting๊ณผ Sleep-Awake์˜ ์ฐจ์ด

Busy waiting์€ ํŠน์ • ์กฐ๊ฑด์ด ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์ถฉ์กฑ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•˜๋ฉฐ,
Alarm clock์€ ์ผ์ • ์‹œ๊ฐ„ ์ดํ›„์— ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์ด ์žˆ์„ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

 

Busy waiting

  • ํ”„๋กœ๊ทธ๋žจ์ด ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋Œ€์‹ , ํŠน์ • ์กฐ๊ฑด์ด ์ถฉ์กฑ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ฒดํฌ๋ฅผ ํ•˜๋ฉด์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ CPU ์ž์›์„ ๋‚ญ๋น„ํ•˜๊ณ , ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ธฐํšŒ๋ฅผ ์ค„์—ฌ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Alarm Clock

  • ํ”„๋กœ๊ทธ๋žจ์ด ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„์— ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์˜ˆ์•ฝํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ด ๊ฒฝ์šฐ, ํ”„๋กœ๊ทธ๋žจ์€ ๋Œ€๊ธฐ ์ƒํƒœ์— ๋“ค์–ด๊ฐ„ ๋™์•ˆ CPU ์‚ฌ์ดํด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, Busy waiting ๋ฐฉ์‹์— ๋น„ํ•˜์—ฌ CPU ์ž์›์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2) Busy-waiting ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋œ ๊ธฐ์กด์˜ ์ฝ”๋“œ

void timer_sleep (int64_t ticks) 
{
    int64_t start = timer_ticks ();

    ASSERT (intr_get_level () == INTR_ON);
    while (timer_elapsed (start) < ticks)
        thread_yield ();
}
  • timer_sleep() ํ•จ์ˆ˜๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ticks๋งŒํผ ์ผ์‹œ ์ค‘์ง€ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
  • ํ˜„์žฌ ๊ตฌํ˜„๋œ ๋ฐฉ์‹์œผ๋กœ๋Š”, ํ˜„์žฌ ํƒ€์ด๋จธ ์‹œ๊ฐ„๊ณผ ticks๋ฅผ ๋น„๊ตํ•ด์„œ ์•„์ง ticks์— ๋„๋‹ฌํ•˜์ง€ ์•Š์•˜์œผ๋ฉด thread_yield() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—๊ฒŒ CPU๋ฅผ ์–‘๋ณดํ•œ๋‹ค.
  • ํ•˜์ง€๋งŒ CPU๋ฅผ ์–‘๋ณด ๋ฐ›์€ ์Šค๋ ˆ๋“œ๋„ ์•„์ง ticks์— ๋„๋‹ฌํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š”, CPU๋ฅผ ์–‘๋ณด ๋ฐ›์ž๋งˆ์ž ๋ฐ”๋กœ ๋‹ค์‹œ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—๊ฒŒ ์–‘๋ณด๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. (์ฆ‰, ๋ถˆํ•„์š”ํ•œ Context switching์ด ๋งŽ์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค.)
  • ๋”ฐ๋ผ์„œ ์•„์ง ticks์— ๋„๋‹ฌํ•˜์ง€ ์•Š์€ ์Šค๋ ˆ๋“œ๊ฐ€ ๊นจ์›Œ์ง€๋Š” ๊ฒƒ์ด ํฐ ๋น„ํšจ์œจ์„ ๋ฐœ์ƒ์‹œํ‚ค๊ณ , ์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์ด๋ฒˆ ๊ณผ์ œ์˜ ๋ชฉ์ ์ด๋‹ค.

 

๐Ÿค” tick์ด๋ž€?

  • tick์€ ์ผ์ • ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ์‹œ์Šคํ…œ์˜ ๊ธฐ๋ณธ์ ์ธ ์‹œ๊ฐ„ ๋‹จ์œ„์ด๋‹ค.
  • ์‹œ์Šคํ…œ ํƒ€์ด๋จธ๋Š” ์ด๋Ÿฌํ•œ ํ‹ฑ์„ ์ƒ์„ฑํ•˜๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์šด์˜ ์ฒด์ œ๋Š” ์ด๋Ÿฌํ•œ ํ‹ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์Šค์ผ€์ค„๋งํ•œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ์‹œ์Šคํ…œ ํƒ€์ด๋จธ๊ฐ€ 100๋ฒˆ์˜ ํ‹ฑ์„ ์ดˆ๋‹น ์ƒ์„ฑํ•œ๋‹ค๋ฉด, ์šด์˜ ์ฒด์ œ๋Š” 1์ดˆ๋ฅผ 100๊ฐœ์˜ ํ‹ฑ์œผ๋กœ ๋‚˜๋ˆ„์–ด ์‹œ์Šคํ…œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์ž‘์—…์„ ์Šค์ผ€์ค„๋งํ•œ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์‹œ์Šคํ…œ์ด ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

 

tick์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

1) ํ‹ฑ์€ ๊ณ ์ •๋œ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์šด์˜ ์ฒด์ œ๊ฐ€ ํŠน์ • ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ •ํ™•ํžˆ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

  - ์˜ˆ๋ฅผ ๋“ค์–ด, ์šด์˜ ์ฒด์ œ๊ฐ€ ํŠน์ • ์ž‘์—…์„ 5์ดˆ ํ›„์— ์‹คํ–‰ํ•˜๋„๋ก ์Šค์ผ€์ค„๋งํ–ˆ๋‹ค๋ฉด, ์šด์˜ ์ฒด์ œ๋Š” ํ‹ฑ์ด ๋ฐœ์ƒํ•˜๋Š” ์‹œ๊ฐ„์„ ์ด์šฉํ•˜์—ฌ ์ •ํ™•ํ•œ ์‹œ๊ฐ„์„ ์ธก์ •ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์šด์˜ ์ฒด์ œ๋Š” ํŠน์ • ์ž‘์—…์ด ์ •ํ™•ํžˆ 5์ดˆ ํ›„์— ์‹คํ–‰๋  ๊ฒƒ์ž„์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

2) ์‹œ๊ฐ„ ๋‹จ์œ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์‹œ์Šคํ…œ์ด ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ์‹œ๊ฐ„์ด ํ๋ฅผ ๋•Œ๋งˆ๋‹ค ์‹œ๊ฐ„์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€ํ•˜๊ฐ€ ์ปค์งˆ ์ˆ˜ ์žˆ๋‹ค.

  - ๋”ฐ๋ผ์„œ, ํ‹ฑ ๋‹จ์œ„๋กœ ์‹œ๊ฐ„์„ ์ถ”์ ํ•จ์œผ๋กœ์จ ์‹œ์Šคํ…œ์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ณ  ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  - ํ‹ฑ์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ๋„ ์ผ์ •ํ•œ ๋ถ€ํ•˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€๋งŒ, ์ด ๋ถ€ํ•˜๋Š” ๋Œ€๋ถ€๋ถ„ ๋ฌด์‹œํ•  ์ˆ˜์ค€์ด๋‹ค. ํ‹ฑ์€ ํ•˜๋“œ์›จ์–ด์—์„œ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๋Š” ๋‹จ์œ„์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

3) ํ‹ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ CPU ์‚ฌ์šฉ๋ฅ ์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค.

  - ํ‹ฑ์˜ ๊ฐ„๊ฒฉ์„ ๋” ์ž‘๊ฒŒ ์กฐ์ •ํ•˜๋ฉด, ์‹œ์Šคํ…œ์€ ๋” ์ž์ฃผ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ž‘์—…์„ ์Šค์ผ€์ค„๋งํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
  - ์ด๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์ž‘์—…์ด ๋” ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ๋ฐ˜์‘์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค.

 

3) Sleep-Awake ๋ฐฉ์‹

๋ณ€๊ฒฝ ๋ฐฉ์•ˆ

ํ˜„์žฌ
์Šค๋ ˆ๋“œ๊ฐ€ ์ž ๋“ค๋ฉด ๋ชจ๋‘ ์Šค์ผ€์ค„๋ง ๋Œ€๊ธฐ์—ด์ธ ready_list์— ์ถ”๊ฐ€ํ•˜๊ณ  ์žˆ์–ด์„œ,
์•„์ง ๊นฐ ์‹œ๊ฐ„์ด ๋˜์ง€ ์•Š์€ (ticks์— ๋„๋‹ฌํ•˜์ง€ ์•Š์€) ์Šค๋ ˆ๋“œ๊ฐ€ ๊นจ์›Œ์ง€๋Š” ์ผ์ด ๋ฐœ์ƒํ•œ๋‹ค!

 

๋ณ€๊ฒฝ์•ˆ
์ƒˆ๋กœ์šด ๋ฐฉ์‹์—์„œ๋Š” ์ž ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊นฐ ์‹œ๊ฐ„(ticks์— ๋„๋‹ฌํ•  ๋•Œ)๊นŒ์ง€๋Š” ready_list์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ ,
๊นฐ ์‹œ๊ฐ„(ticks)์— ๋„๋‹ฌํ•œ ๊ฒฝ์šฐ์—๋งŒ ready_list์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ
์•„์ง ticks์— ๋„๋‹ฌํ•˜์ง€ ์•Š์€ ์Šค๋ ˆ๋“œ๊ฐ€ ๊นจ์›Œ์ง€๋Š” ์ผ์„ ์—†๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค!

 

๊ตฌํ˜„ ๋ฐฉ๋ฒ•

(1) sleep list ์„ ์–ธ & ์ดˆ๊ธฐํ™”

  • ticks์— ๋„๋‹ฌํ•˜์ง€ ์•Š์€ ์Šค๋ ˆ๋“œ๋ฅผ ๋‹ด์„ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ sleep_list๋ฅผ ์„ ์–ธํ•˜๊ณ  thread_init์—์„œ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
    /* thread.c */

    // 1. sleep_list ์„ ์–ธ
    static struct list sleep_list;

    ...

    // 2. sleep_list ์ดˆ๊ธฐํ™”
    void thread_init (void) {

    ...

        list_init (&sleep_list);

    ...

    }

 

(2) thread ๊ตฌ์กฐ์ฒด์— ํ•„๋“œ ์ถ”๊ฐ€

  • ์Šค๋ ˆ๋“œ ๊ตฌ์กฐ์ฒด์— ์ผ์–ด๋‚  ์‹œ๊ฐ์ธ ticks๋ฅผ ์ €์žฅํ•  wakeup_ticks ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
    /* thread.h */

    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. */

        int64_t wakeup_ticks;       // ์ผ์–ด๋‚  ์‹œ๊ฐ ์ถ”๊ฐ€

    ...

    };

 

(3) ์Šค๋ ˆ๋“œ ์žฌ์šฐ๊ธฐ ๋กœ์ง ๋ณ€๊ฒฝ

timer_sleep

  • ๊ธฐ์กด ์ฝ”๋“œ์— ์žˆ๋Š” thread_yield() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ž ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ready_list์— ์‚ฝ์ž…๋œ๋‹ค.
  • ์ž ๋“  ์Šค๋ ˆ๋“œ๋Š” ready_list๊ฐ€ ์•„๋‹Œ sleep_list์— ์‚ฝ์ž…ํ•˜๋Š” thread_sleep() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    • thread_sleep() ํ•จ์ˆ˜๋Š” ์•„๋ž˜์—์„œ ์ƒˆ๋กœ ์„ ์–ธํ•œ๋‹ค.
    /* timer.c */

    void timer_sleep(int64_t ticks)
    {
        int64_t start = timer_ticks(); // ํ˜„์žฌ ์‹œ๊ฐ
        ASSERT(intr_get_level() == INTR_ON);
        thread_sleep(start + ticks); // ํ˜„์žฌ ์‹œ๊ฐ (start) + ์ž ๋“ค ์‹œ๊ฐ„ (ticks)
    }

thread_sleep

  • ์ž ๋“  ์Šค๋ ˆ๋“œ๋ฅผ sleep_list์— ์‚ฝ์ž…ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ ์„ ์–ธํ•œ๋‹ค.
  • ์Šค๋ ˆ๋“œ ๊ตฌ์กฐ์ฒด์— ์ผ์–ด๋‚  ์‹œ๊ฐ์ธ ticks๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • sleep_list์— ticks๊ฐ€ ์ž‘์€ ์Šค๋ ˆ๋“œ๊ฐ€ ์•ž๋ถ€๋ถ„์— ์œ„์น˜ํ•˜๋„๋ก ์ •๋ ฌํ•˜์—ฌ ์‚ฝ์ž…ํ•œ๋‹ค.
    • ์ •๋ ฌ์— ํ™œ์šฉํ•  cmp_thread_ticks() ํ•จ์ˆ˜๋Š” ์•„๋ž˜์—์„œ ์ƒˆ๋กœ ์„ ์–ธํ•œ๋‹ค.
  • ํ˜„์žฌ ์Šค๋ ˆ๋“œ๋Š” ์ž ๋“ค์–ด์•ผ ํ•˜๋‹ˆ thread_block() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    /* thread.h */

    void thread_sleep (int64_t ticks);
    /* thread.c */

    void thread_sleep(int64_t ticks)
    {
        struct thread *curr;
        enum intr_level old_level;
        old_level = intr_disable(); // ์ธํ„ฐ๋ŸฝํŠธ ๋น„ํ™œ์„ฑ

        curr = thread_current();     // ํ˜„์žฌ ์Šค๋ ˆ๋“œ
        ASSERT(curr != idle_thread); // ํ˜„์žฌ ์Šค๋ ˆ๋“œ๊ฐ€ idle์ด ์•„๋‹ ๋•Œ๋งŒ

        curr->wakeup_ticks = ticks;     // ์ผ์–ด๋‚  ์‹œ๊ฐ ์ €์žฅ
        list_insert_ordered(&sleep_list, &curr->elem, cmp_thread_ticks, NULL); // sleep_list์— ์ถ”๊ฐ€
        thread_block(); // ํ˜„์žฌ ์Šค๋ ˆ๋“œ ์žฌ์šฐ๊ธฐ

        intr_set_level(old_level); // ์ธํ„ฐ๋ŸฝํŠธ ์ƒํƒœ๋ฅผ ์›๋ž˜ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ
    }

cmp_thread_ticks

  • sleep_list์— ์ผ์–ด๋‚  ์‹œ๊ฐ„์ด ์ด๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์•ž๋ถ€๋ถ„์— ์œ„์น˜ํ•˜๋„๋ก ์ •๋ ฌํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ •๋ ฌ ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ ์„ ์–ธํ•œ๋‹ค.
    /* thread.h */

    bool cmp_thread_ticks(const struct list_elem *a, const struct list_elem *b, void *aux);
    /* thread.c */

    // ๋‘ ์Šค๋ ˆ๋“œ์˜ wakeup_ticks๋ฅผ ๋น„๊ตํ•ด์„œ ์ž‘์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
    bool cmp_thread_ticks(const struct list_elem *a, const struct list_elem *b, void *aux UNUSED)
    {
        struct thread *st_a = list_entry(a, struct thread, elem);
        struct thread *st_b = list_entry(b, struct thread, elem);
        return st_a->wakeup_ticks < st_b->wakeup_ticks;
    }

 

(4) ์Šค๋ ˆ๋“œ ๊นจ์šฐ๊ธฐ ๋กœ์ง ์ถ”๊ฐ€

timer_interrupt

  • ๋งค tick๋งˆ๋‹ค ๋ฐœ์ƒํ•˜๋Š” ํƒ€์ด๋จธ ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ™œ์šฉํ•ด์„œ ๋งค tick๋งˆ๋‹ค ๊นจ์šธ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ๋‹ค.
  • ์ผ์–ด๋‚  ์‹œ๊ฐ„์ด ๋œ ์Šค๋ ˆ๋“œ๋ฅผ ready_list๋กœ ์ด๋™์‹œํ‚ค๋Š” ํ•จ์ˆ˜ thread_wakeup()์„ ํ˜ธ์ถœํ•œ๋‹ค.
    /* timer.c */

    static void timer_interrupt(struct intr_frame *args UNUSED)
    {
        ticks++;
        thread_tick();
        thread_wakeup(ticks);
    }

thread_wakeup

  • sleep_list์˜ ์Šค๋ ˆ๋“œ๋“ค์ด ์ผ์–ด๋‚  ์‹œ๊ฐ„์ด ๋˜๋ฉด ready_list๋กœ ์ด๋™์‹œํ‚จ๋‹ค.
  • ํ˜„์žฌ current_ticks๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ wakeup_ticks๋ฅผ ๊ฐ€์ง„ ์Šค๋ ˆ๋“œ๋Š” ๋ชจ๋‘ ๊นจ์šด๋‹ค.
    • ์—ฌ๊ธฐ์„œ ‘์Šค๋ ˆ๋“œ๋ฅผ ๊นจ์šด๋‹ค’๋Š” ๊ฒƒ์€, ๊นจ์šธ ์Šค๋ ˆ๋“œ๋ฅผ sleep_list์—์„œ ์ œ๊ฑฐํ•˜๊ณ  ready_list์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
    • 1) sleep_list์—์„œ ๊นจ์šธ ์Šค๋ ˆ๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. (list_remove)
    • 2) ๊นจ์šธ ์Šค๋ ˆ๋“œ๋ฅผ ready_list์— ์‚ฝ์ž…ํ•˜๊ณ , ์ƒํƒœ๋ฅผ THREAD_READY๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค. (thread_block)
    /* thread.h */

    void thread_wakeup (int64_t global_ticks);
    /* thread.c */

    void thread_wakeup(int64_t current_ticks)
    {
        enum intr_level old_level;
        old_level = intr_disable(); // ์ธํ„ฐ๋ŸฝํŠธ ๋น„ํ™œ์„ฑ

        struct list_elem *curr_elem = list_begin(&sleep_list);
        while (curr_elem != list_end(&sleep_list))
        {
            struct thread *curr_thread = list_entry(curr_elem, struct thread, elem); // ํ˜„์žฌ ๊ฒ€์‚ฌ์ค‘์ธ elem์˜ ์Šค๋ ˆ๋“œ

            if (current_ticks >= curr_thread->wakeup_ticks) // ๊นฐ ์‹œ๊ฐ„์ด ๋์œผ๋ฉด
            {
                curr_elem = list_remove(curr_elem); // sleep_list์—์„œ ์ œ๊ฑฐ, curr_elem์—๋Š” ๋‹ค์Œ elem์ด ๋‹ด๊น€
                thread_unblock(curr_thread);        // ready_list๋กœ ์ด๋™
            }
            else
                break;
        }
        intr_set_level(old_level); // ์ธํ„ฐ๋ŸฝํŠธ ์ƒํƒœ๋ฅผ ์›๋ž˜ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ
    }

 

Sleep-Awake ๋ฐฉ์‹์˜ Alarm Clock ๊ตฌํ˜„ ๋ ~ ๐Ÿ’–

 

Test

/* Test: /threads/build์—์„œ ์ž…๋ ฅ */

pintos -- -q run alarm-multiple

๐Ÿ‘‡๐Ÿป ๊ตฌํ˜„ ์ „

๐Ÿ‘‡๐Ÿป ๊ตฌํ˜„ ํ›„

0์ด์—ˆ๋˜ idle tick์ด 550์œผ๋กœ ์ฆ๊ฐ€ํ–ˆ๋‹ค!

728x90
๋ฐ˜์‘ํ˜•

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

[Pintos-KAIST] Project 1 :: Priority Scheduling  (0) 2023.04.25
Why Is Code Review Necessary?  (0) 2023.04.04
[CS:APP] 1-7) ์šด์˜์ฒด์ œ์˜ ์—ญํ•   (0) 2023.03.11