์ด์์ฒด์ ๋ฅผ ๋ฐฐ์ฐ๋ค ๋ณด๋ฉด ์ฒ์ ๋ง์ฃผํ๋ ๊ฐ๋
์ค ํ๋๊ฐ ๋ฎคํ
์ค(Mutex)๋ค.
๋ฎคํ
์ค๋ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ด๋ค ์์(ํ์ผ, ๋ฉ๋ชจ๋ฆฌ ๋ฑ)์ ์ฌ์ฉํ๋ ค๊ณ ํ ๋
์๋ก ์ถฉ๋ํ์ง ์๋๋ก ๋์์ฃผ๋ ์ฅ์น๋ค.
๋ฎคํ
์ค(Mutual Exclusion)๋ ๋ง ๊ทธ๋๋ก ์ํธ ๋ฐฐ์ ๋ผ๋ ๋ป์ด๋ค.
์ด๋ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ด๋ค ์์์ ์ ๊ทผํ ์ ์๋๋ก ์๋ก ๋ฐฐ์ ํ๋ฉฐ
ํ ๋ฒ์ ํ๋์ฉ๋ง ์ ๊ทผํ๊ฒ ๋ง๋๋ ๊ตฌ์กฐ๋ค.
์๋ฅผ ๋ค์ด ํ์ฅ์ค์ ๋ฌธ์ด ํ๋ ์๊ณ , ํ ์ฌ๋๋ง ๋ค์ด๊ฐ ์ ์๋ค๊ณ ์์ํด๋ณด์.
ํ ์ฌ๋์ด ๋ค์ด๊ฐ๋ฉด ๋ฌธ์ ์ ๊ทธ๊ณ , ๋ค๋ฅธ ์ฌ๋์ ๋ฌธ์ด ์ด๋ฆด ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋ฐฉ์์ด๋ค.
์ด ๊ตฌ์กฐ๊ฐ ๋ฐ๋ก ๋ฎคํ
์ค์ ํต์ฌ ๊ฐ๋
์ด๋ค.
์ด์์ฒด์ ์์๋ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ๋์๊ฐ๋ค.
์ด๋ค์ด ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฑฐ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ๊ฐ ๊ผฌ์ด๊ฑฐ๋ ์๋ชป๋ ๊ฒฐ๊ณผ๋ฅผ ๋ผ ์ ์๋ค.
์ด๋ฐ ์ํฉ์ ๊ฒฝ์ ์ํ(Race Condition)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ฎคํ
์ค๋ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ๋ง๊ธฐ ์ํด, ๊ณต์ ์์์ ์ ๊ทธ๋ ์ญํ ์ ํ๋ค.
์์์ ์ฌ์ฉํ๋ ค๋ ์ค๋ ๋๋ ๋จผ์ ๋ฌธ์ ์ ๊ทธ๊ณ (lock), ๋ค ์ฐ๋ฉด ๋ฌธ์ ์ด์ด์ผ(unlock) ๋ค์ ์ฌ๋์ด ๋ค์ด๊ฐ ์ ์๋ค.
๋ฎคํ ์ค๋ ๋ณดํต ๋ค์๊ณผ ๊ฐ์ ํ๋ฆ์ผ๋ก ์ฌ์ฉ๋๋ค.
lock_acquire(&lock); // ์์ ์ฌ์ฉ ์ ๋ฌธ ์ ๊ทธ๊ธฐ
// ํฌ๋ฆฌํฐ์ปฌ ์น์
(๊ณต์ ์์ ์ ๊ทผ)
lock_release(&lock); // ์์ ์ฌ์ฉ ํ ๋ฌธ ์ด๊ธฐ
์์์ ์ฐ๊ธฐ ์ ์ ๊ผญ ๋ฌธ์ ์ ๊ฐ์ผ ํ๋ฉฐ,
๋ค ์ฐ๊ณ ๋๋ฉด ๋ค๋ฅธ ์ฌ๋์ด ๋ค์ด์ฌ ์ ์๋๋ก ๋ฌธ์ ์ด์ด์ผ ํ๋ค.
๋ฎคํ
์ค๋ ์ด "์ด์ "์ ๊ฐ์ ์กด์ฌ๋ค.
ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ์์์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ์ฅ์น๋ค.
| ํน์ง | ์ค๋ช |
|---|---|
| ๋จ์ผ ์์ ๋ณดํธ | ํ๋์ ์์์ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋ค. |
| ์์ ๊ฐ๋ ์กด์ฌ | ๋ฝ์ ํ๋ํ ์ค๋ ๋๋ง ํด์ ํ ์ ์๋ค. |
| ๊ฐ๋จํ๊ณ ๋น ๋ฅด๋ค | ๋ก์ง์ด ๋จ์ํด ๋น ๋ฅด๊ฒ ์ฌ์ฉํ ์ ์๋ค. |
| ๋ฐ๋๋ฝ ์ํ๋ ์๋ค | ์ ๊ทผ ์ฑ๋ก unlockํ์ง ์์ผ๋ฉด ์๋ก ๊ธฐ๋ค๋ฆฌ๋ค ๋ฉ์ถฐ๋ฒ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค. |
PintOS์์๋ struct lock์ด๋ผ๋ ๊ตฌ์กฐ์ฒด๊ฐ ๋ฎคํ
์ค ์ญํ ์ ํ๋ค.
๋ด๋ถ์ ์ผ๋ก๋ ์ธ๋งํฌ์ด๋ฅผ ์ฌ์ฉํ์ง๋ง, ์ธ๋ถ ์ธํฐํ์ด์ค๋ ๋ฎคํ
์ค์ฒ๋ผ ๋์ํ๋ค.
struct lock {
struct thread *holder;
struct semaphore semaphore; // ๋ด๋ถ ๊ตฌํ์ ์ธ๋งํฌ์ด์ง๋ง, ์ฌ์ฉ ๋ฐฉ์์ ๋ฎคํ
์ค
};
์ฆ, ์ฐ๋ฆฌ๋ PintOS์์ ๋ฎคํ ์ค๋ฅผ ์ง์ ๊ตฌํํ์ง ์์ง๋ง, ๋ฎคํ ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ ๋ฝ์ ๋ค๋ฃจ๊ฒ ๋๋ค.
๋ฎคํ
์ค๋ ํ ๋ฒ์ 1๊ฐ๋ง ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ์ค๊ณ๋ ๋ฐ๋ฉด,
์ธ๋งํฌ์ด๋ ์ฌ๋ฌ ๊ฐ์ ์์์ ๋์์ ๊ด๋ฆฌํ ์ ์๋ค.
์๋ฅผ ๋ค์ด, ์ฃผ์ฐจ์ฅ์ 3๊ฐ์ ๋น ๊ณต๊ฐ์ด ์๋ค๋ฉด ์ธ๋งํฌ์ด๋ฅผ 3์ผ๋ก ์ค์ ํ๋ฉด ๋๋ค.
์ธ๋งํฌ์ด๋ ๋ค์ ๊ธ์์ ๋ ์์ธํ ๋ค๋ฃจ๋๋ก ํ๊ฒ ๋ค.
lock_acquire()์ lock_release()๋ฅผ ํตํด ๋ฎคํ
์ค๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.