๐ 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);