์ฌ๋ฌ ์ค๋ ๋๊ฐ lock, semaphore, condition variable ์ ์ป๊ธฐ ์ํด ๊ธฐ๋ค๋ฆด ๊ฒฝ์ฐ, ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ thread
๊ฐ CPU๋ฅผ ์ ์ ํ๋๋ก ๊ตฌํํ์!
ํ์ฌ pintos๋ semaphore๋ฅผ ๋๊ธฐ ํ๊ณ ์๋ ์ค๋ ๋๋ค์ list์ธ waiters๊ฐ FIFO๋ก ๊ตฌํ๋์ด์๋ค. ์ด๋ฅผ ์์ ํด์ฃผ์.
ํ์ฌ ์ํฉ
๋ชฉํ
์ฌ๋ฌ ์ค๋ ๋๊ฐ ์์์ ๊ณต์ ํ ๋, ์๋ก ๊ฒน์น๋ ์ผ์ด ์์ด์ผํ๋ค. ์ด๋ฐ ์ผ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ์ธ๋งํฌ์ด, ๋ฝ ์ด๋ผ๋ ๋๊ตฌ๋ฅผ ์ด์ฉํ๋ค.
struct semaphore {
unsigned value;
struct list waiters;
};
value
: ์์์ ์ ์ ํ๊ณ ์๋ ์ค๋ ๋๊ฐ ์๋์ง ์๋ ค์ฃผ๋ ๊ฐ (0์ด๋ฉด ์ ์ ์ค, 1์ด๋ฉด ์ฌ์ฉ๊ฐ๋ฅ)waiters
: ํด๋น ์์์ ์ ์ ํ๊ธฐ์ํด ๋๊ธฐํ๊ณ ์๋ ์ค๋ ๋๋ค์ ๋ชฉ๋กstruct lock {
struct thread *holder;
struct semaphore semaphore;
};
๋ฝ์ ์ธ๋งํฌ์ด์ธ๋ฐ, ํ์ฌ ์์ ์ ์ฅ๊ณ ์๋ ์ค๋ ๋๊ฐ ๋๊ตฌ์ธ์ง ์๊ณ ์๋ ์ธ๋งํฌ์ด!
์ด๋ฆํ๊ฐ ๋ฌ๋ฆฐ ์ธ๋งํฌ์ด
๋ค.
๊ตฌํ ์ ์ฃผ์ํ ์ ์, lock์ ์์ ์ holder์ค๋ ๋๋ฅผ ์์ง๋ง, ์ค๋ ๋ ์์ ์ ์์ ์ด ์ด๋ค lock์ ๊ฐ์ง๊ณ ์๋์ง ๋ชจ๋ฅธ๋ค. lock์ผ๋ก๋ถํฐ ์ค๋ ๋๋ก์ ์ ๊ทผ์ ๋ฐ๋ก ๊ฐ๋ฅํ์ง๋ง, ์ค๋ ๋๋ก๋ถํฐ lock์ผ๋ก์ ์ ๊ทผ์ ์ฝ์ง ์๋ค.
sema_down
: ์ธ๋งํฌ์ด๋ฅผ ๊ด๋ฆฌํ๋ ํจ์๋ค์์ waiter์ ์ค๋ ๋๋ฅผ ๋ฃ์ด์ค๋, ์ฐ์ ์์ ์์ผ๋ก ๋ฃ์ด์ฃผ๋๋ก ์์ ํ๋ค.sema_up
: ์ค๋ ๋๊ฐ waiter์ ์๋ ๋์ ์ฐ์ ์์๊ฐ ๋ณ๊ฒฝ ๋์์ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ ค ํ์ฌ waiter๋ฅผ ์ฐ์ ์์๋ก ์ ๋ ฌ ํ๋ค.bool cmp_sem_priority (const struct list_elem *a, const struct list_elem *b, void *aux UNUSED){
struct semaphore_elem *sa = list_entry(a, struct semaphore_elem, elem);
struct semaphore_elem *sb = list_entry(b, struct semaphore_elem, elem);
}
ํด๋น lock์ ๊ธฐ๋ค๋ฆฌ๋ ์ธ๋งํฌ์ด ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ฅ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋ ์ค๋ ๋์ ์ฐ์ ์์ ์์ผ๋ก ์ ๋ ฌํ๋๋ก ๊ตฌํํ๋ค.
์ฒซ ๋ฒ์งธ ์ธ์์ ์ฐ์ ์์๊ฐ ๋ ๋ฒ์งธ ์ธ์์ ์ฐ์ ์์๋ณด๋ค ๋์ผ๋ฉด 1 ๋ฐํ, ๋ฎ์ผ๋ฉด 0 ๋ฐํํ๋ bool ํจ์๋ก ๊ตฌํํ๋ค.
์ด๋๋ถํฐ ์ฌ์ฌ ์ด๋ ค์์ง๊ธฐ ์์ํ๋ค.
์ธ๋งํฌ์ด์ lock์ ๊ฐ๋
์ด ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ฑ์ฅํ๋ฉด์ ๋๊ฐ ๋๊ตด ๊ฐ๋ฆฌํค๊ณ , ๋๊ฐ ๋๊ตด ์์ ํ๊ณ ๋ง๊ตฌ ํท๊ฐ๋ฆฌ๊ธฐ ์์ํ๋ค. ํ์ง๋ง ์ด๊ฑด ๋ง๋ณด๊ธฐ์ ๋ถ๊ณผํ์ง..
๋ค์ ๋จ๊ณ์ธ Priority donation์ ์ ๋ง.. Lock, ์ธ๋งํฌ์ด์ ๋ํ์์ด๋ค..