์์ ๊ธ์์ ๋ฎคํ
์ค(Mutex)๋ฅผ ํตํด ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ์์์ ์ฌ์ฉํ๋ ๊ตฌ์กฐ๋ฅผ ์ดํด๋ณด์๋ค.
์ด๋ฒ์๋ ๋ฎคํ
์ค๋ฅผ ์ผ๋ฐํํ ๊ฐ๋
์ธ ์ธ๋งํฌ์ด(Semaphore)๋ฅผ ์์๋ณด์.
์ธ๋งํฌ์ด๋ ๋์์ ์ฌ๋ฌ ๊ฐ์ ์์์ ๊ด๋ฆฌํ ์ ์๋ค๋ ์ ์์ ๋ฎคํ
์ค๋ณด๋ค ํ์ฅ๋ ๊ตฌ์กฐ๋ค.
์ธ๋งํฌ์ด๋ ์ด์์ฒด์ ์์ ์์์ ๊ฐ์๋ฅผ ์ธ๋ ์ ์ ๋ณ์๋ก,
์์์ ์ฌ์ฉํ ์ ์๋ ๊ฐ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค๋ ๋์ ๋์์ ์ ์ดํ๋ ์ฅ์น๋ค.
์๋ฅผ ๋ค์ด, ์ฃผ์ฐจ์ฅ์ 3๊ฐ์ ๋น์๋ฆฌ๊ฐ ์๋ค๋ฉด ์ธ๋งํฌ์ด ๊ฐ์ 3์ผ๋ก ์ค์ ํ๋ค.
์ฐจ๊ฐ ํ๋ ๋ค์ด์ค๋ฉด 2, ๋ ํ๋ ๋ค์ด์ค๋ฉด 1... ๋ชจ๋ ์ฐจ๋ฉด 0์ด ๋๋ฉฐ,
๊ทธ๋ค์ ๋ค์ด์ค๋ ค๋ ์ฐจ๋ ์๋ฆฌ๊ฐ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๋ค.
์ธ๋งํฌ์ด๋ ๋ ๊ฐ์ง ์ฐ์ฐ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
| ์ฐ์ฐ | ์ค๋ช | ์ฌ์ด ๋ง๋ก |
|---|---|---|
sema_down() | ์์์ ์ป๊ธฐ ์ํ ์์ฒญ. ๊ฐ์ด 0์ด๋ฉด ๊ธฐ๋ค๋ฆฐ๋ค. | "๋ ๋ค์ด๊ฐ๋ ๋ ๊น?" |
sema_up() | ์์์ ๋ฐ๋ฉํ๊ณ ๋๊ธฐ ์ค์ธ ์ค๋ ๋๋ฅผ ๊นจ์ด๋ค. | "๋ ๋ค ์ผ์ด, ๋ค์ ์ฌ๋ ์!" |
์ด ๋ ์ฐ์ฐ์ ๋ฐ๋์ ์์์ ์ผ๋ก(atomic) ์คํ๋์ด์ผ ํ๋ค.
์ฆ, ์ค๊ฐ์ ๋ผ์ด๋ค ์ ์๊ณ ๋จ์ผ ๋์์ผ๋ก ์ฒ๋ฆฌ๋ผ์ผ ํ๋ค.
์ด ๊ตฌ์กฐ๊ฐ ๋ฐ๋ก ์ธ๋งํฌ์ด๋ค.
| ์ํฉ | ์ค๋ช |
|---|---|
| ์์ ์ ์ ํ | ํ ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ ์์์ ๊ด๋ฆฌํด์ผ ํ ๋ (์: ์ฐ๊ฒฐ ๊ฐ๋ฅํ ๋คํธ์ํฌ ์์ผ ์, ํ๋ฆฐํฐ ์ ๋ฑ) |
| ์ค๋ ๋ ๊ฐ ์์ ์ ์ด | ํ ์ค๋ ๋๊ฐ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ ๋ ๋ค๋ฅธ ์ค๋ ๋๋ฅผ ๊นจ์ฐ๋ ๋ฐ ์ฌ์ฉ๋๋ค. |
| ๋ฝ ๊ตฌํ | ์ธ๋งํฌ์ด(1)์ ์ด์ฉํ๋ฉด ๋ฎคํ ์ค์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค. ์ค์ ๋ก PintOS์ ๋ฝ์ ์ธ๋งํฌ์ด๋ก ๊ตฌํ๋์ด ์๋ค. |
PintOS์์๋ struct semaphore ๋ผ๋ ๊ตฌ์กฐ์ฒด๋ก ์ธ๋งํฌ์ด๊ฐ ์ ์๋์ด ์๋ค.
struct semaphore {
unsigned value; // ํ์ฌ ์์ ๊ฐ์
struct list waiters; // ๋๊ธฐ ์ค์ธ ์ค๋ ๋ ๋ฆฌ์คํธ
};
๊ทธ๋ฆฌ๊ณ ๋ค์๊ณผ ๊ฐ์ ํจ์๋ก ๋์ํ๋ค:
void sema_down(struct semaphore *sema); // ์์ ์์ฒญ
void sema_up(struct semaphore *sema); // ์์ ๋ฐํ
struct lock์ ๋ด๋ถ์ ์ผ๋ก struct semaphore๋ฅผ ํฌํจํ๋ค.sema_down()๊ณผ sema_up()์ด ๋ด๋ถ์์ ํธ์ถ๋๊ณ ์๋ ๊ฒ์ด๋ค.PintOS์ priority-* ํ
์คํธ์์๋ ์ธ๋งํฌ์ด๊ฐ ๋จ์ ์์ ์ ํ์ฉ์ด ์๋, ์ค๋ ๋ ์ฐ์ ์์ ์ค์ผ์ค๋ง์ ์ํฅ์ ์ค๋ค.
sema->waiters ๋ฆฌ์คํธ๋ priority ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋์ด์ผ ํ๋ค.sema_up() ์์๋ ๊ฐ์ฅ ๋์ priority์ ์ค๋ ๋๋ถํฐ ๊นจ์์ผ ํ๋ค.์ด๊ฑธ ๊ตฌํํ์ง ์์ผ๋ฉด priority-sema, priority-donate-sema, priority-condvar ๊ฐ์ ํ
์คํธ์์ ์คํจํ๊ฒ ๋๋ค.
sema_down()์ผ๋ก ์์์ ์์ฒญํ๊ณ , sema_up()์ผ๋ก ์์์ ๋ฐํํ๋ค.