πŸ“€ KAIST:PINTOS | Implementation | Alarm - priority

μ΄μˆœκ°„Β·2025λ…„ 5μ›” 13일

KAIST:PINTOS

λͺ©λ‘ 보기
3/23

βœ… λͺ©ν‘œ

alarm-priority ν…ŒμŠ€νŠΈ 톡과

μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μΌν•œ μ‹œκ°„μ— κΉ¨μ–΄λ‚  λ•Œ, μš°μ„ μˆœμœ„(priority)κ°€ 높은 μŠ€λ ˆλ“œκ°€ λ¨Όμ € μ‹€ν–‰λ˜λ„λ‘ 보μž₯ν•΄μ•Ό 함


❗ μ‹€νŒ¨ 원인 μš”μ•½

μ²˜μŒμ—λŠ” alarm-priority ν…ŒμŠ€νŠΈκ°€ λ‹€μŒκ³Ό 같은 이유둜 μ‹€νŒ¨ν•¨:

  • ready_list에 μŠ€λ ˆλ“œλ₯Ό μ‚½μž…ν•  λ•Œ μš°μ„ μˆœμœ„ μ •λ ¬(priority ordering) 을 μ μš©ν•˜μ§€ μ•ŠμŒ
  • thread_unblock() ν•¨μˆ˜κ°€ 항상 리슀트 맨 뒀에 push (FIFO μ‚½μž…)
  • μš°μ„ μˆœμœ„ 높은 μŠ€λ ˆλ“œκ°€ READY μƒνƒœκ°€ λ˜μ—ˆμŒμ—λ„ CPUλ₯Ό 양보받지 λͺ»ν•¨

πŸ›  μˆ˜μ • 사항

1. thread_unblock() μˆ˜μ •

πŸ“ μœ„μΉ˜: threads/thread.c

// μˆ˜μ • μ „
list_push_back(&ready_list, &t->elem);

// μˆ˜μ • ν›„
list_insert_ordered(&ready_list, &t->elem, priority_cmp, NULL);

β†’ priority_cmpλ₯Ό κΈ°μ€€μœΌλ‘œ ready_listλ₯Ό μ •λ ¬ν•˜λ„λ‘ λ³€κ²½


2. priority_cmp() ν•¨μˆ˜ κ΅¬ν˜„

πŸ“ μœ„μΉ˜: threads/thread.c

bool priority_cmp(const struct list_elem *a, const struct list_elem *b, void *aux UNUSED) {
  struct thread *a_thread = list_entry(a, struct thread, elem);
  struct thread *b_thread = list_entry(b, struct thread, elem);
  return a_thread->priority > b_thread->priority;
}

β†’ μˆ«μžκ°€ 클수둝 높은 priorityμ΄λ―€λ‘œ > 비ꡐλ₯Ό μ‚¬μš©


3. priority_cmp() μ„ μ–Έ μΆ”κ°€

πŸ“ μœ„μΉ˜: threads/thread.h

bool priority_cmp(const struct list_elem *a, const struct list_elem *b, void *aux);

β†’ C μ–Έμ–΄μ—μ„œλŠ” ν•¨μˆ˜ μ •μ˜ 전에 μ„ μ–Έ(prototype)이 ν•„μš”ν•˜λ―€λ‘œ 헀더에 μ„ μ–Έν•΄μ€Œ


πŸ” ν…ŒμŠ€νŠΈ κ²°κ³Ό

make clean && make check
pass tests/threads/alarm-priority βœ…

🧠 배운 점

  • ready_listλŠ” λ‹¨μˆœ 큐가 μ•„λ‹ˆλΌ priority-aware ν•΄μ•Ό ν•œλ‹€
  • list_insert_ordered() + priority_cmp()λŠ” ν•„μˆ˜
  • 이 λ‘œμ§μ€ alarm-priority뿐 μ•„λ‹ˆλΌ priority-donate-*, priority-preempt, priority-fifo 같은 ν…ŒμŠ€νŠΈμ—λ„ 영ν–₯을 μ€€λ‹€
profile
μ„œνˆ΄μ§€μ–Έμ • 늘 행동이 먼저이기λ₯Ό

0개의 λŒ“κΈ€