PINTOS - Project 1 : ๊ณผ์ œ ์„ค๋ช…

JinJinJaraยท2023๋…„ 9์›” 22์ผ
2

PINTOS

๋ชฉ๋ก ๋ณด๊ธฐ
1/10

Directory

Project 1

๐Ÿ“‚ threads/ : base kernel์˜ ์†Œ์Šค ์ฝ”๋“œ

๐Ÿ“‚ devices/ : (ํ‚ค๋ณด๋“œ, ํƒ€์ด๋จธ, ๋””์Šคํฌ ๋“ฑ) I/O ์žฅ์น˜ interfacing ์„ ์œ„ํ•œ ์†Œ์Šค์ฝ”๋“œ

  • ์ด ์ค‘ timer ์ฝ”๋“œ ์ˆ˜์ • (๊ทธ ์™ธ์—” ์ด ์ฝ”๋“œ๋“ค์„ ์ˆ˜์ •ํ•  ํ•„์š”๋Š” ์—†์Œ)

๊ธฐํƒ€

๐Ÿ“‚ include/ : ํ—ค๋”ํŒŒ์ผ๋“ค(.h) ์˜ ์†Œ์Šค์ฝ”๋“œ

๐Ÿ“‚ include/lib/kernel/ : Pintos ์ปค๋„์—๋งŒ ํฌํ•จ๋œ C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ผ๋ถ€

  • bitmaps, doubly linked lists, hash tables ๊ฐ™์€ ์ž๋ฃŒํ˜•์ด ๊ตฌํ˜„
  • ์ปค๋„์—์„œ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ : #include <...> ํ‘œ๊ธฐ๋ฒ• ์‚ฌ์šฉ

๐Ÿ“‚ include/lib/user/ : Pintos user programs ์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ผ๋ถ€

  • user programs์—์„œ, ์ด ๋””๋ ‰ํ† ๋ฆฌ์˜ ํ—ค๋”๋“ค์€ #include <...> ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ํฌํ•จ

๐Ÿ“‚ tests/ : ๊ฐ project ์šฉ ํ…Œ์ŠคํŠธ๋“ค๋กœ, ๊ฒฐ๊ณผ๋ฌผ์„ ํ…Œ์ŠคํŠธํ•ด๋ณด๊ธฐ ํŽธํ•˜๋„๋ก ์ˆ˜์ •ํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  • ( ์‹ค์ œ ํ…Œ์ŠคํŠธ๋Š” ์›๋ž˜ ๋ฒ„์ „์œผ๋กœ ๋ฐ”๊ฟ”์„œ ํ…Œ์ŠคํŠธ ํ•จ )

๐Ÿ“‚ examples/ : project 2 ์—์„œ ์‚ฌ์šฉํ•  user programs ์šฉ ์˜ˆ์ œ๋“ค


Building

๐Ÿ“‚ Makefile : pinots/src/Makefile.build ์˜ ๋ณต์‚ฌ๋ณธ์œผ๋กœ, kernel์„ ๋นŒ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…

๐Ÿ“‚ kernel.o : ์ปค๋„ ์ „์ฒด์„ ์œ„ํ•œ Object file

  • ๊ฐ๊ฐ์˜ ์ปค๋„ ์†Œ์Šค ํŒŒ์ผ๋“ค์—์„œ ์ปดํŒŒ์ผ๋œ object ํŒŒ์ผ๋“ค์„ ํ•˜๋‚˜์˜ object ํŒŒ์ผ๋กœ ๋งํ‚นํ•œ ๊ฒฐ๊ณผ
  • ๋””๋ฒ„๊ทธ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ ์žˆ๊ณ , ์ด ์ •๋ณด๋กœ GDB๋‚˜ Backtraces ๋ฅผ ์‹คํ–‰

๐Ÿ“‚ kernel.bin : ์ปค๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ์ด๋ฏธ์ง€

  • Pintos ์ปค๋„์„ ๋Œ๋ฆฌ๊ธฐ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋˜๋Š” ์ •ํ™•ํ•œ ๋ฐ”์ดํŠธ๋“ค์˜ ์ด๋ฏธ์ง€
  • kernel.o ์—์„œ ๋””๋ฒ„๊ทธ ์ •๋ณด๊ฐ€ ๋น ์ง„ ๊ฒƒ
  • ๋””๋ฒ„๊ทธ ์ •๋ณด๋ฅผ ์—†์• ๋ฏ€๋กœ ๋งŽ์€ ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•ด์„œ, ์ปค๋„ loader์˜ ์„ค๊ณ„์—์˜ํ•ด ๋ถ€๊ณผ๋œ 512kB ์‚ฌ์ด์ฆˆ ์ œํ•œ์„ ํ˜น์‹œ๋ผ๋„ ๋„˜์ง€์•Š๊ฒŒ ํ•ด์คŒ

๐Ÿ“‚ loarder.bin : kernel loader์˜ ๋ฉ”๋ชจ๋ฆฌ ์ด๋ฏธ์ง€

  • ์ปค๋„์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ disk๋กœ ์ฝ๊ณ  ์‹œ์ž‘์‹œํ‚ค๋Š” ์–ด์ƒ˜๋ธ”๋ฆฌ์–ด ์ฝ”๋“œ์˜ ์ž‘์€ chunck
  • PC BIOS์— ์˜ํ•ด ์ •ํ•ด์ง„ ์‚ฌ์ด์ฆˆ์ธ ๋”ฑ 512 bytes ๊ธธ์ด
  • build ์˜ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋“ค์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋งŒ๋“  object ํŒŒ์ผ๋“ค(.o)๊ณผ dependency ํŒŒ์ผ๋“ค(.d)์„ ํฌํ•จ
  • dependency ํŒŒ์ผ๋“ค์€ ๋‹ค๋ฅธ ์†Œ์Šค๋‚˜ ํ—ค๋”ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜๋ฉด, make ํ•œํ…Œ ์–ด๋–ค ์†Œ์ŠคํŒŒ์ผ์ด ๋‹ค์‹œ ์ปดํŒŒ์ผ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๋ ค์คŒ

Threads

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() ์‚ฌ์šฉ

    • non-static ์ง€์—ญ๋ณ€์ˆ˜๋กœ ํ• ๋‹น X
    • ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋กœ ์Šค๋ ˆ๋“œ ์ƒํƒœ ์†์ƒ์„ ๋ง‰๊ธฐ ์œ„ํ•จ

1. tid

  • tid : ์Šค๋ ˆ๋“œ์˜ ์Šค๋ ˆ๋“œ์‹๋ณ„์ž
  • tid_t : intํ˜• typedef
tid_t tid;
  • ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋Š”, ์ปค๋„์ด ๋Œ์•„๊ฐ€๋Š” ๋‚ด๋‚ด ์œ ์ผํ•˜๊ฒŒ ์œ ์ง€๋˜๋Š” tid๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
  • ์ƒˆ ์Šค๋ ˆ๋“œ๋Š” ์ฒ˜์Œ์— tid๋ฅผ ๋ถ€์—ฌ๋ฐ›์Œ
  • 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์ˆซ์ž์ƒ์œผ๋กœ ๋‹ค์Œ ๋†’์€ ๊ฐ’์ด ๋ถ€์—ฌ๋จ
  • ์›ํ•œ๋‹ค๋ฉด type์ด๋‚˜ ๋ฒˆํ˜ธ ๋งค๊ธฐ๊ธฐ ์ฒด๊ณ„๋ฅผ ์ˆ˜์ • ๊ฐ€๋Šฅ

2. thread_status

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 : ๋‹ค์Œ ์Šค๋ ˆ๋“œ๋กœ ์ „ํ™˜๋œ ์ดํ›„, ์Šค์ผ€์ฅด๋Ÿฌ์— ์˜ํ•ด ์—†์–ด์งˆ ์˜ˆ์ •์ธ ์ƒํƒœ๋‹ค


3. name

๋ฌธ์ž์—ด ํ˜•์‹์˜ ์Šค๋ ˆ๋“œ ์ด๋ฆ„
(๋งŒ์•ฝ ์Šค๋ ˆ๋“œ ์ด๋ฆ„์ด ๋„ˆ๋ฌด ๊ธธ๋ฉด) ์ตœ์†Œํ•œ ์ด๋ฆ„ ์•ž์ชฝ์˜ ๋ช‡ ๊ธ€์ž๋“ค

char name[16];

4. intr_frame

์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์„ ์œ„ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๊ตฌ์กฐ์ฒด
๋ ˆ์ง€์Šคํ„ฐ ์™€ ์Šคํƒ ํฌ์ธํ„ฐ ๋ฅผ ํฌํ•จ

struct intr_frame tf;

5. priority

PRI_MIN (0) ์—์„œ PRI_MAX (63) ์‚ฌ์ด ๋ฒ”์œ„์— ์žˆ๋Š” ์Šค๋ ˆ๋“œ ์šฐ์„ ์ˆœ์œ„

int priority;
  • ์ˆซ์ž๊ฐ€ ์ž‘์œผ๋ฉด ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง

    • ๊ฐ€์žฅ ๋‚ฎ์€/๋†’์€ ์šฐ์„ ์ˆœ์œ„ = 0๋ฒˆ / 63๋ฒˆ
  • ์ด Pintos์—์„œ๋Š” ์Šค๋ ˆ๋“œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ฌด์‹œํ•˜๊ฒ ์ง€๋งŒ, project 1์—์„œ ์šฐ์„ ์ˆœ์œ„ ์Šค์ผ€์ฅด๋ง์„ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค (์šฐ์„ ์ˆœ์œ„ ์Šค์ผ€์ฅด๋ง ์ฐธ์กฐ)


6. list_elem

์Šค๋ ˆ๋“œ๋ฅผ doubly-linked-list์— ๋‹ด์„๋•Œ ์“ฐ๋Š” ๋ฆฌ์ŠคํŠธ ์š”์†Œ

struct list_elem elem;
  • ready_list ์™€ sema_down()์˜ ์„ธ๋งˆํฌ์–ด์— ๋Œ€๊ธฐ์ค‘์ธ ์Šค๋ ˆ๋“œ๋“ค์˜ ๋ฆฌ์ŠคํŠธ์—์„œ ๋ชจ๋‘ ์“ฐ์ž„

  • thread์˜ elem ๋ฉค๋ฒ„๋ณ€์ˆ˜๋Š” ๋‘๊ฐ€์ง€ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    1. thread.c ์˜ run ํ์˜ ์›์†Œ

    2. synch.c ์˜ semaphore ๋Œ€๊ธฐ ๋ฆฌ์ŠคํŠธ์˜ ์›์†Œ

    • ์ด ๋‘ ๋ชฉ์ ์€ ์ƒํ˜ธ๋ฐฐํƒ€์ ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด !
      : ready ์ƒํƒœ์˜ ์“ฐ๋ ˆ๋“œ๋งŒ run ํ์— ์žˆ์„ ์ˆ˜ ์žˆ๊ณ ,
      blocked (์ค€๋น„X) ์ƒํƒœ์˜ ํ๋งŒ ๋Œ€๊ธฐ ๋ฆฌ์ŠคํŠธ์— ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ

7. magic

threads/thread.c์— ์ •์˜๋œ ์ž„์˜์˜ ์ˆซ์ž THREAD_MAGIC์œผ๋กœ ํ•ญ์ƒ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉฐ, ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ํƒ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์“ฐ์ž„

unsigned magic
  • thread_current()

    • ์‹คํ–‰์ค‘์ธ ์Šค๋ ˆ๋“œ struct thread์˜ magic ๋ฉค๋ฒ„๊ฐ€ THREAD_MAGIC์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌ
  • ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋Š” ์ด ๊ฐ’์„ ๋ฐ”๊ฟ”์„œ 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 +---------------------------------+

8. pml4

Project 2 ์ดํ›„์— ์“ฐ์ž„ (ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ์ฐธ์กฐ)

uint64_t *pml4;

Thread Functions

1. thread_init

  • ์Šค๋ ˆ๋“œ ์‹œ์Šคํ…œ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ main() ์œผ๋กœ๋ถ€ํ„ฐ ํ˜ธ์ถœ
  • Pintos์˜ ์ดˆ๊ธฐ ์Šค๋ ˆ๋“œ๋ฅผ ์œ„ํ•œ struct thread๋ฅผ ์ƒ์„ฑ
void thread_init (void);
  • ์ด๋Š” Pintos ๋กœ๋”๊ฐ€ ์ดˆ๊ธฐ ์Šค๋ ˆ๋“œ์˜ ์Šคํƒ์„ ๋‹ค๋ฅธ Pintos ์Šค๋ ˆ๋“œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŽ˜์ด์ง€์˜ ๊ผญ๋Œ€๊ธฐ ๋ถ€๋ถ„์— ๋†“๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅ

  • thread_init()์ด ์‹คํ–‰๋˜๊ธฐ ์ „์—๋Š” thread_current()๋Š” ์‹คํŒจ

    • ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์Šค๋ ˆ๋“œ์˜ magic ๊ฐ’์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ
  • Pintos ์ดˆ๊ธฐํ™”๊ณผ์ •์—์„œ ์ด๋ฅธ ์‹œ๊ธฐ์— ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•จ

    • lock_acquire() ๊ฐ™์€ ์ˆ˜๋งŽ์€ ํ•จ์ˆ˜๋“ค์ด thread_current() ๋ฅผ ์ง์ ‘ ํ˜น์€ ๊ฐ„์ ‘์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ

2. thread_start

์Šค์ผ€์ฅด๋Ÿฌ๋ฅผ ์‹œ์ž‘์‹œํ‚ค๊ธฐ ์œ„ํ•ด main() ์œผ๋กœ๋ถ€ํ„ฐ ํ˜ธ์ถœ

void thread_start (void);
  • ์ค€๋น„๋œ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์—†์„ ๋•Œ ์Šค์ผ€์ฅด๋˜๋Š” ์Šค๋ ˆ๋“œ์ธ ์œ ํœด ์Šค๋ ˆ๋“œ(Idle thread)๋ฅผ ๋งŒ๋“ ๋‹ค

  • ์Šค์ผ€์ฅด๋Ÿฌ๊ฐ€ ํ™œ์„ฑํ™”๋˜๋„๋ก ํ•˜๋Š” side effect๊ฐ€ ์žˆ๋Š” ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ํ™œ์„ฑํ™” ํ•จ

    • intr_yield_on_return()๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํƒ€์ด๋จธ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉด ์Šค์ผ€์ฅด๋Ÿฌ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

      ๐Ÿค”โ“์œ ํœด ์Šค๋ ˆ๋“œ(Idle Thread):

      • ์‹œ์Šคํ…œ์ด ์•„๋ฌด๋Ÿฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ํŠน๋ณ„ํ•œ ์Šค๋ ˆ๋“œ
        ์‹œ์Šคํ…œ์ด ๋†€๊ณ  ์žˆ์„ ๋•Œ CPU๋ฅผ ์ ์œ ํ•˜์ง€ ์•Š๊ณ  ๋Œ€๊ธฐํ•˜๋ฉฐ, ์‹œ์Šคํ…œ์˜ ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌ

3. thread_tick

๊ฐ ํƒ€์ด๋จธ tick์—์„œ ๋ฐœ์ƒํ•˜๋Š” ํƒ€์ด๋จธ ์ธํ„ฐ๋ŸฝํŠธ๋กœ๋ถ€ํ„ฐ ํ˜ธ์ถœ

void thread_tick (void);
  • ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์Šค๋ ˆ๋“œ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๊ณ , ์‹คํ–‰ ์‹œ๊ฐ„์ด ๋‹ค ๋˜๋ฉด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋กœ CPU๋ฅผ ์ „ํ™˜ํ•˜๋Š” ์—ญํ• 
  • ์Šค๋ ˆ๋“œ ํ†ต๊ณ„๋ฅผ ์ถ”์ ํ•˜๊ณ , ํƒ€์ž„ ์Šฌ๋ผ์ด์Šค๊ฐ€ ๋งŒ๋ฃŒ๋  ๋•Œ ์Šค์ผ€์ฅด๋Ÿฌ๋ฅผ ์ž‘๋™์‹œํ‚ด

4. thread_print_stats

Pintos๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ์Šค๋ ˆ๋“œ ํ†ต๊ณ„๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœ

void thread_print_stats (void);

5. thread_create

์ƒˆ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  tid๋ฅผ ๋ฐ˜ํ™˜

tid_t thread_create (const char *name, int priority, thread func *func, void *aux);
  • ์ƒˆ ์Šค๋ ˆ๋“œ์˜ ์ด๋ฆ„ = name, ์šฐ์„ ์ˆœ์œ„ =priority

  • ๋‹จ์ผ ์ธ์ž๋กœ aux๋ฅผ ์ „๋‹ฌํ•˜๋ฉด์„œ func๋ฅผ ์‹คํ–‰

  • ์Šค๋ ˆ๋“œ์˜ย struct threadย ์™€ ์Šคํƒ์„ ์œ„ํ•ด ํŽ˜์ด์ง€๋ฅผ ํ• ๋‹นํ•˜๊ณ  ๊ทธ ๋ฉค๋ฒ„๋“ค์„ ์ดˆ๊ธฐํ™”

    • ๊ฐ€์งœ ์Šคํƒ ํ”„๋ ˆ์ž„์„ ๋งŒ๋“ ๋‹ค
      : ์Šค๋ ˆ๋“œ์˜ ์ดˆ๊ธฐ ์‹คํ–‰์„ ์ง€์›, ์‹ค์ œ๋กœ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณธ๊ฒฉ์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ์ž„์‹œ๋กœ ํ•„์š”

    • ์Šค๋ ˆ๋“œ๋Š” ๋ธ”๋ก๋œ ์ƒํƒœ๋กœ ์ดˆ๊ธฐํ™”๋˜๊ณ , ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๊ฐ€ ์Šค์ผ€์ฅด ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐ˜ํ™˜๋˜๊ธฐ ์ง์ „์— ์–ธ๋ธ”๋ก ๋จ
      (= ์Šค์ผ€์ค„๋Ÿฌ์—๊ฒŒ ์‹คํ–‰์„ ์š”์ฒญํ•˜๋Š” ์ƒํƒœ๋กœ ์ „ํ™˜)


6. thread_func

thread_create() ๋กœ ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜ ํƒ€์ž…
aux ์ธ์ž๋„ ์ด ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ์จ ๊ฐ™์ด ์ „๋‹ฌ๋จ

void thread_func (void *aux);

7.thread_block

์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์‹คํ–‰ ์ƒํƒœ์—์„œ ๋ธ”๋ก ์ƒํƒœ๋กœ ์ „ํ™˜

void thread_block (void);
  • thread_unblock()์ด ํ˜ธ์ถœ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋‹ค์‹œ ๋™์ž‘ํ•˜์ง€ ์•Š๊ณ , thread_block()์ด ๋„ˆ๋ฌด ๋กœ์šฐ-๋ ˆ๋ฒจ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ด ํ•จ์ˆ˜ ๋Œ€์‹  ๋™๊ธฐํ™” ๊ธฐ์ดˆ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์“ฐ๊ธฐ ex) semaphore..).

8. thread_unblock

๋ธ”๋ก๋œ ์ƒํƒœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ THREAD_READY๋กœ ์ „ํ™˜ (=๋‹ค์‹œ ์‹คํ–‰๋˜๋„๋ก ํ—ˆ๊ฐ€)

void thread_unblock (struct thread *thread);
  • ์Šค๋ ˆ๋“œ๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ๋˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋œ๋‹ค.
    ex)์Šค๋ ˆ๋“œ๊ฐ€ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋˜ ๋ฝ์ด ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋  ๋•Œ

9. thread_current

ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ

struct thread *thread_current (void);

10. thread_tid

ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์Šค๋ ˆ๋“œ์˜ tid๋ฅผ ๋ฐ˜ํ™˜
thread_current() -> tid ์™€ ๊ฐ™์Œ

tid_t thread_tid (void);

11. thread_name

ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์Šค๋ ˆ๋“œ์˜ name์„ ๋ฐ˜ํ™˜
thread_current () ->name ๊ณผ ๊ฐ™์Œ

const char *thread_name (void);

12. thread_exit

ํ˜„์žฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋„๋ก ํ•จ (๋ฐ˜ํ™˜ X)

void thread_exit (void) NO_RETURN;

13. thread_yield

์‹คํ–‰ํ•  ์ƒˆ ์Šค๋ ˆ๋“œ๋ฅผ ์„ ํƒํ•˜๋Š” ์Šค์ผ€์ฅด๋Ÿฌ์—๊ฒŒ CPU๋ฅผ ์ œ๊ณต

void thread_yield (void);
  • ์ƒˆ ์Šค๋ ˆ๋“œ๊ฐ€ ํ˜„์žฌ ์Šค๋ ˆ๋“œ์ผ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์–ด๋–ค ํŠน์ • ์‹œ๊ฐ„ ๋™์•ˆ ์Šค๋ ˆ๋“œ ์‹คํ–‰์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ ค ํ•  ๋•Œ, ์ด ํ•จ์ˆ˜์— ์˜์กดํ•ด์„  ์•ˆ๋จ

14. thread_get_priority / thread_set_priority

์Šค๋ ˆ๋“œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ฐ€์ ธ์˜ค๋Š” ํ† ๋ง‰(stub)์ด๋‹ค. ์šฐ์„ ์ˆœ์œ„ ์Šค์ผ€์ฅด๋ง์„ ์ฐธ์กฐํ•˜๋ผ

int thread_get_priority (void);
void thread_set_priority (int new_priority);

15. ๊ณ ๊ธ‰ ์Šค์ผ€์ฅด๋Ÿฌ๋ฅผ ์œ„ํ•œ ํ† ๋ง‰๋“ค(stubs)

๊ณ ๊ธ‰ ์Šค์ผ€์ฅด๋Ÿฌ๋ฅผ ์œ„ํ•œ ํ† ๋ง‰๋“ค(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);

0๊ฐœ์˜ ๋Œ“๊ธ€