๐ threads/ : base kernel์ ์์ค ์ฝ๋
๐ devices/ : (ํค๋ณด๋, ํ์ด๋จธ, ๋์คํฌ ๋ฑ) I/O ์ฅ์น interfacing ์ ์ํ ์์ค์ฝ๋
timer ์ฝ๋ ์์ (๊ทธ ์ธ์ ์ด ์ฝ๋๋ค์ ์์ ํ ํ์๋ ์์)๐ include/ : ํค๋ํ์ผ๋ค(.h) ์ ์์ค์ฝ๋
๐ include/lib/kernel/ : Pintos ์ปค๋์๋ง ํฌํจ๋ C ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๋ถ
#include <...> ํ๊ธฐ๋ฒ ์ฌ์ฉ๐ include/lib/user/ : Pintos user programs ์์๋ง ์ฌ์ฉ๋๋ C ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๋ถ
#include <...> ํ๊ธฐ๋ฒ์ผ๋ก ํฌํจ๐ tests/ : ๊ฐ project ์ฉ ํ
์คํธ๋ค๋ก, ๊ฒฐ๊ณผ๋ฌผ์ ํ
์คํธํด๋ณด๊ธฐ ํธํ๋๋ก ์์ ํด ์ฌ์ฉ ๊ฐ๋ฅ
๐ examples/ : project 2 ์์ ์ฌ์ฉํ user programs ์ฉ ์์ ๋ค
๐ Makefile : pinots/src/Makefile.build ์ ๋ณต์ฌ๋ณธ์ผ๋ก, kernel์ ๋น๋ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
๐ kernel.o : ์ปค๋ ์ ์ฒด์ ์ํ Object file
๐ kernel.bin : ์ปค๋์ ๋ฉ๋ชจ๋ฆฌ ์ด๋ฏธ์ง
๐ loarder.bin : kernel loader์ ๋ฉ๋ชจ๋ฆฌ ์ด๋ฏธ์ง
build ์ ํ์ ๋๋ ํ ๋ฆฌ๋ค์ ์ปดํ์ผ๋ฌ๊ฐ ๋ง๋ object ํ์ผ๋ค(.o)๊ณผ dependency ํ์ผ๋ค(.d)์ ํฌํจ
struct thread
threads/thread.h์ ์ ์- ์ค๋ ๋๋ค์ ์ํ Pintos์ ๋ฉ์ธ ์๋ฃ๊ตฌ์กฐ
- ์ค๋ ๋, ๋๋ ์ ์ ํ๋ก์ธ์ค๋ฅผ ์๋ฏธ
4 kB +---------------------------------+
| kernel stack |
| | |
| V |
| grows downward |
| |
| |
sizeof (struct thread) +---------------------------------+
| * magic * |
| intr_frame |
struct thread; >> | : |
| status |
| tid |
0 kB +---------------------------------+
ํ๋ก์ ํธ ์งํ ์ค struct thread(์ค๋ ๋ ๊ตฌ์กฐ์ฒด)์ ๊ตฌํํ ๋ฉค๋ฒ๋ฅผ ์ถ๊ฐํ๊ธฐ
๊ธฐ์กด ๋ฉค๋ฒ๋ค์ ์ ์๋ฅผ ์์ /์ญ์ ๊ฐ๋ฅ
๊ฐ ์ค๋ ๋ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง์ ์์ ๋ถ๋ถ์ ์ฐจ์ง
๋จ์ ํ์ด์ง๋ ์ค๋ ๋์ ์คํ์ผ๋ก ์ฌ์ฉ (ํ์ด์ง ๋์์๋ถํฐ ์๋ ๋ฐฉํฅ์ผ๋ก ์ฆ๊ฐ)
struct thread๋ ํ 1 kB ๋ฏธ๋ง์ผ๋ก ์ ์ง
์ปค๋ ํจ์๋ค์์ ํฐ ๊ตฌ์กฐ์ฒด, ๋ฐฐ์ด์ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น โ malloc(), palloc_get_page() ์ฌ์ฉ
- tid : ์ค๋ ๋์ ์ค๋ ๋์๋ณ์
- tid_t : intํ typedef
tid_t tid;
enum thread_status status;
THREAD_RUNNING : ์ค๋ ๋๊ฐ ์คํ ์ค์ธ ์ํ
thread_current()ํจ์ : ์คํ์ค์ธ ์ค๋ ๋๋ฅผ ๋ฐํTHREAD_READY : ์ค๋ ๋๊ฐ ์คํํ ์ค๋น๋ ๋์์ผ๋, ์์ง ์คํ๋์ง๋ ์์ ์ํ
ready_list๋ผ๋ doubly-linked-list์ ์ ์ฅ๋๋ค.THREAD_BLOCKED : ์ค๋ ๋๊ฐ ๋ญ๊ฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ์ํ
ex) ๋ค์ ์ฌ์ฉ๊ฐ๋ฅํ๋๋ก ํ๊ธฐ ์ํด ๋ฝ ๋์๊ฑฐ๋, ํธ์ถ๋๊ธฐ ์ํด ์ธํฐ๋ฝํธ ๋ ๊ฒ
์ค๋ ๋๋ thread_unblock()ํธ์ถ์ ์ํด THREAD_READY ์ํ๋ก ๋ฐ๋๊ธฐ ์ ๊น์ง๋ ์ค์ผ์ฅด๋์ง ์์ ๊ฒ์ด๋ค. ์ด๋ ๋ธ๋ก๊ณผ ์ธ๋ธ๋ก์ ์๋์ผ๋ก ํด์ฃผ๋ Pintos ๋๊ธฐํ ๊ธฐ๋ณธ ์์ ์ค ํ๋๋ฅผ ์ฐ๋ฉด ๊ฐ์ ์ ์ผ๋ก ๊ฐ์ฅ ํธํ๊ฒ ์๋ฃ๋ ์ ์๋ค.(๋๊ธฐํ๋ฅผ ์ฐธ์กฐ)
๋ธ๋ก๋ ์ค๋ ๋๊ฐ ๋ญ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋์ง๋ ๋น์ฅ์ ์ ๋ฐฉ๋ฒ์ด ์์ง๋ง, ๋ฐฑํธ๋ ์ด์ค๊ฐ ๋์์ด ๋ ๊ฒ์ด๋ค (๋ฐฑํธ๋ ์ด์ค ์ฐธ์กฐ)
THREAD_DYING : ๋ค์ ์ค๋ ๋๋ก ์ ํ๋ ์ดํ, ์ค์ผ์ฅด๋ฌ์ ์ํด ์์ด์ง ์์ ์ธ ์ํ๋ค
๋ฌธ์์ด ํ์์ ์ค๋ ๋ ์ด๋ฆ
(๋ง์ฝ ์ค๋ ๋ ์ด๋ฆ์ด ๋๋ฌด ๊ธธ๋ฉด) ์ต์ํ ์ด๋ฆ ์์ชฝ์ ๋ช ๊ธ์๋คchar name[16];
์ปจํ ์คํธ ์ค์์นญ์ ์ํ ์ ๋ณด๋ฅผ ๋ด๋ ๊ตฌ์กฐ์ฒด
๋ ์ง์คํฐ ์ ์คํ ํฌ์ธํฐ ๋ฅผ ํฌํจ
struct intr_frame tf;
PRI_MIN (0)์์PRI_MAX (63)์ฌ์ด ๋ฒ์์ ์๋ ์ค๋ ๋ ์ฐ์ ์์
int priority;
์ซ์๊ฐ ์์ผ๋ฉด ๋ฎ์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง
0๋ฒ / 63๋ฒ์ด Pintos์์๋ ์ค๋ ๋ ์ฐ์ ์์๋ฅผ ๋ฌด์ํ๊ฒ ์ง๋ง, project 1์์ ์ฐ์ ์์ ์ค์ผ์ฅด๋ง์ ๊ตฌํํ๊ฒ ๋ ๊ฒ์ด๋ค (์ฐ์ ์์ ์ค์ผ์ฅด๋ง ์ฐธ์กฐ)
์ค๋ ๋๋ฅผ doubly-linked-list์ ๋ด์๋ ์ฐ๋ ๋ฆฌ์คํธ ์์
struct list_elem elem;
ready_list ์ sema_down()์ ์ธ๋งํฌ์ด์ ๋๊ธฐ์ค์ธ ์ค๋ ๋๋ค์ ๋ฆฌ์คํธ์์ ๋ชจ๋ ์ฐ์
thread์ elem ๋ฉค๋ฒ๋ณ์๋ ๋๊ฐ์ง ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
thread.c ์ run ํ์ ์์
synch.c ์ semaphore ๋๊ธฐ ๋ฆฌ์คํธ์ ์์
threads/thread.c์ ์ ์๋ ์์์ ์ซ์ THREAD_MAGIC์ผ๋ก ํญ์ ์ค์ ๋์ด ์์ผ๋ฉฐ, ์คํ ์ค๋ฒํ๋ก์ฐ๋ฅผ ํ์งํ๊ธฐ ์ํด ์ฐ์
unsigned magic
thread_current()
์คํ ์ค๋ฒํ๋ก์ฐ๋ ์ด ๊ฐ์ ๋ฐ๊ฟ์ assertion์ ๋ฐ์์ํค๋ ๊ฒฝํฅ์ด ์์
์คํ ์ค๋ฒํ๋ก์ฐ๋ magic ์ ๊ฐ์ ๋ฐ๊ฟ assertion ๋ฐ์์ํด
์ต์์ ์ด์ต์ ์ํด์, struct thread์ ๋ฉค๋ฒ๋ฅผ ์ถ๊ฐํ ๋ magic์ ๋์ ๋จ๊ธฐ๊ธฐ
4 kB +---------------------------------+
| kernel stack |
| | |
| V |
| grows downward |
| |
| |
sizeof (struct thread) +--------- * magic * ------------+ stack overflow!!
| intr_frame |
| : |
| status |
| tid |
0 kB +---------------------------------+
Project 2 ์ดํ์ ์ฐ์ (ํ์ด์ง ํ ์ด๋ธ ์ฐธ์กฐ)
uint64_t *pml4;
Thread Functions
- ์ค๋ ๋ ์์คํ ์ ์์ํ๊ธฐ ์ํด์ main() ์ผ๋ก๋ถํฐ ํธ์ถ
- Pintos์ ์ด๊ธฐ ์ค๋ ๋๋ฅผ ์ํ struct thread๋ฅผ ์์ฑ
void thread_init (void);
์ด๋ Pintos ๋ก๋๊ฐ ์ด๊ธฐ ์ค๋ ๋์ ์คํ์ ๋ค๋ฅธ Pintos ์ค๋ ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ์ด์ง์ ๊ผญ๋๊ธฐ ๋ถ๋ถ์ ๋๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅ
thread_init()์ด ์คํ๋๊ธฐ ์ ์๋ thread_current()๋ ์คํจ
Pintos ์ด๊ธฐํ๊ณผ์ ์์ ์ด๋ฅธ ์๊ธฐ์ ํธ์ถ๋์ด์ผ ํจ
lock_acquire() ๊ฐ์ ์๋ง์ ํจ์๋ค์ด thread_current() ๋ฅผ ์ง์ ํน์ ๊ฐ์ ์ ์ผ๋ก ํธ์ถํ๊ธฐ ๋๋ฌธ์ค์ผ์ฅด๋ฌ๋ฅผ ์์์ํค๊ธฐ ์ํด main() ์ผ๋ก๋ถํฐ ํธ์ถ
void thread_start (void);
์ค๋น๋ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์์ ๋ ์ค์ผ์ฅด๋๋ ์ค๋ ๋์ธ ์ ํด ์ค๋ ๋(Idle thread)๋ฅผ ๋ง๋ ๋ค
์ค์ผ์ฅด๋ฌ๊ฐ ํ์ฑํ๋๋๋ก ํ๋ side effect๊ฐ ์๋ ์ธํฐ๋ฝํธ๋ฅผ ํ์ฑํ ํจ
intr_yield_on_return()๋ฅผ ์ฌ์ฉํด์ ํ์ด๋จธ ์ธํฐ๋ฝํธ๊ฐ ๋ฐํ๋๋ฉด ์ค์ผ์ฅด๋ฌ๊ฐ ์คํ๋๊ธฐ ๋๋ฌธ์ ์ธํฐ๋ฝํธ๋ฅผ ํ์ฑํํ๋ ๊ฒ์ด๋ค.
๐คโ์ ํด ์ค๋ ๋(Idle Thread):
- ์์คํ ์ด ์๋ฌด๋ฐ ์์ ์ ์ํํ์ง ์์ ๋ ์คํ๋๋ ํน๋ณํ ์ค๋ ๋
์์คํ ์ด ๋๊ณ ์์ ๋ CPU๋ฅผ ์ ์ ํ์ง ์๊ณ ๋๊ธฐํ๋ฉฐ, ์์คํ ์ ์์์ ํจ์จ์ ์ผ๋ก ํ์ฉํ๊ธฐ ์ํด ์กด์ฌ
๊ฐ ํ์ด๋จธ tick์์ ๋ฐ์ํ๋ ํ์ด๋จธ ์ธํฐ๋ฝํธ๋ก๋ถํฐ ํธ์ถ
void thread_tick (void);
Pintos๊ฐ ์ข ๋ฃ๋ ๋ ์ค๋ ๋ ํต๊ณ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด ํธ์ถ
void thread_print_stats (void);
์ ์ค๋ ๋๋ฅผ ์์ฑํ๊ณ tid๋ฅผ ๋ฐํ
tid_t thread_create (const char *name, int priority, thread func *func, void *aux);
์ ์ค๋ ๋์ ์ด๋ฆ = name, ์ฐ์ ์์ =priority
๋จ์ผ ์ธ์๋ก aux๋ฅผ ์ ๋ฌํ๋ฉด์ func๋ฅผ ์คํ
์ค๋ ๋์ย struct threadย ์ ์คํ์ ์ํด ํ์ด์ง๋ฅผ ํ ๋นํ๊ณ ๊ทธ ๋ฉค๋ฒ๋ค์ ์ด๊ธฐํ
๊ฐ์ง ์คํ ํ๋ ์์ ๋ง๋ ๋ค
: ์ค๋ ๋์ ์ด๊ธฐ ์คํ์ ์ง์, ์ค์ ๋ก๋ ์ค๋ ๋๊ฐ ๋ณธ๊ฒฉ์ ์ผ๋ก ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ์์๋ก ํ์
์ค๋ ๋๋ ๋ธ๋ก๋ ์ํ๋ก ์ด๊ธฐํ๋๊ณ , ์๋ก์ด ์ค๋ ๋๊ฐ ์ค์ผ์ฅด ๋ ์ ์๋๋ก ํ๊ธฐ ์ํด์ ๋ฐํ๋๊ธฐ ์ง์ ์ ์ธ๋ธ๋ก ๋จ
(= ์ค์ผ์ค๋ฌ์๊ฒ ์คํ์ ์์ฒญํ๋ ์ํ๋ก ์ ํ)
thread_create() ๋ก ์ ๋ฌ๋๋ ํจ์ ํ์
aux ์ธ์๋ ์ด ํจ์์ ์ธ์๋ก์จ ๊ฐ์ด ์ ๋ฌ๋จ
void thread_func (void *aux);
์คํ๋๊ณ ์๋ ์ค๋ ๋๋ฅผ ์คํ ์ํ์์ ๋ธ๋ก ์ํ๋ก ์ ํ
void thread_block (void);
๋ธ๋ก๋ ์ํ์ ์ค๋ ๋๋ฅผ
THREAD_READY๋ก ์ ํ (=๋ค์ ์คํ๋๋๋ก ํ๊ฐ)
void thread_unblock (struct thread *thread);
ํ์ฌ ์คํ์ค์ธ ์ค๋ ๋๋ฅผ ๋ฐํํ
struct thread *thread_current (void);
ํ์ฌ ์คํ์ค์ธ ์ค๋ ๋์ tid๋ฅผ ๋ฐํ
thread_current()-> tid ์ ๊ฐ์
tid_t thread_tid (void);
ํ์ฌ ์คํ์ค์ธ ์ค๋ ๋์ name์ ๋ฐํ
thread_current ()->name ๊ณผ ๊ฐ์
const char *thread_name (void);
ํ์ฌ ์ค๋ ๋๊ฐ ์ข ๋ฃ๋๋๋ก ํจ (๋ฐํ X)
void thread_exit (void) NO_RETURN;
์คํํ ์ ์ค๋ ๋๋ฅผ ์ ํํ๋ ์ค์ผ์ฅด๋ฌ์๊ฒ CPU๋ฅผ ์ ๊ณต
void thread_yield (void);
์ค๋ ๋ ์ฐ์ ์์๋ฅผ ์ค์ ํ๊ณ ๊ฐ์ ธ์ค๋ ํ ๋ง(stub)์ด๋ค. ์ฐ์ ์์ ์ค์ผ์ฅด๋ง์ ์ฐธ์กฐํ๋ผ
int thread_get_priority (void);
void thread_set_priority (int new_priority);
๊ณ ๊ธ ์ค์ผ์ฅด๋ฌ๋ฅผ ์ํ ํ ๋ง๋ค(stubs)
int thread_get_nice (void);
void thread_set_nice (int new_nice);
int thread_get_recent_cpu (void);
int thread_get_load_avg (void);