๋์ ์ฝ๊ฒ ๋ฐฐ์ฐ๋ ์ด์์ฒด์ ์ ๊ฐ์ ์ด์์ฒด์ -๋ฐํจ๊ฒฝ ๋ฅผ ๋ณด๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
๐ Race Condition
2๊ฐ ์ด์์ ํ๋ก์ธ์ค์ฌ ๊ณต์ ์์์ ์ฝ๊ฑฐ๋ ์ฐ๋ ์ํฉ์ Race Condition ์ด๋ผ๊ณ ํ๋ค.
Race Condition์ด ๋ฐ์ํ๋ฉด ๊ณต์ ์์ ์ ๊ทผ ์์์ ๋ฐ๋ผ ์คํ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ์ง ์๋๋ก ํด์ผํ๋ค.
kernel ์ํ ์ค ์ธํฐ๋ฝํธ ๋ฐ์ ์
์ปค๋ ๋ชจ๋๋ก count๋ฅผ ์ฆ๊ฐ์ํค๊ณ ์๋ ์์ค์ ์ธํฐ๋ฝํธ๊ฐ ๋ค์ด์ค๋ฉด ์ธํฐ๋ฝํธ ์ฒ๋ฆฌ ๋ฃจํด์ผ๋ก ๋ค์ด๊ฐ๋ค.
์ธํฐ๋ฝํธ ์์ ์ด ์ปค๋๋ชจ๋๋ก ์ํํ๋ count๋ฅผ ๊ฐ์์ํค๋ ์์ ์ ์งํํ๋ค.
๋ค์ ์ปค๋๋ชจ๋๋ก ๋์์์ ์์ ์ ์ํํ ๋์๋, ์ธํฐ๋ฝํธ์ ์์ ์ด ๋ฐ์๋ count๊ฐ ์๋
์ด์ ์ ์งํ์ค์ด์๋ ์์ ์ ์ด์ด์ ์ํํ๊ธฐ ๋๋ฌธ์, ์ธํฐ๋ฝํธ๊ฐ ํ๋ ์์ ์ ๊ฒฐ๊ณผ๋ ๋ฐ์๋์ง ์๋๋ค.
๐ก ๋ฐ๋ผ์, ์ปค๋๋ชจ๋๋ก ์ํ ์ค์ผ๋๋ ์ธํฐ๋ฝํธ๊ฐ ๋ค์ด์ค์ง ๋ชปํ๊ฒ ๋ง์์ผ๋ก์ ํด๊ฒฐํ ์ ์๋ค.
kernel mode ์ํ ์ค ๋ฌธ๋งฅ๊ตํ์ด ์ผ์ด๋๋ ๊ฒฝ์ฐ
์ ์ํฉ์ ๊ฒฝ์ฐ, ํ๋ก์ธ์ค A๊ฐ ์์คํ ์ฝ๋ก count๋ฅผ ์ฆ๊ฐ์ํค๋ ์์ ์ ํ๋ค๊ฐ
๋ฌธ๋งฅ๊ตํ์ด ์ผ์ด๋์ ํ๋ก์ธ์ค B๋ก CPU๊ฐ ๋์ด๊ฐ๋ค.
๊ทผ๋ฐ, ํ๋ก์ธ์ค B๋ ์์คํ ์ฝ๋ก count ๋ฅผ ์ฆ๊ฐ์ํค๋ ์์ ์ ์๋ฃํ๋ค.
๋ค์, ํ๋ก์ธ์ค A๋ก ๋์ด์๋๋ฐ, B๊ฐ ๋ฐ์์ํจ count ๊ฐ์ด ์๋ ์ด์ ์ ์งํ ์ค์ด์๋ count๊ฐ์ ๋ถ๋ฌ์ ์ฐ์ฐ์ ๋ค์ ์ํํ๊ธฐ ๋๋ฌธ์ ๋ ์์ ์ด ๋ฐ์๋ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋์ง ์๊ฒ ๋๋ค.
๐ก ๋ฐ๋ผ์, ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ ์ค ํ๋๋ ์ปค๋ ๋ชจ๋๋ก ๋์ํ ์ CPU๋ฅผ ๋๊ฒจ์ฃผ์ง ์๊ฒ ํจ์ผ๋ก์ ํด๊ฒฐํ ์ ์๋ค.
CPU๊ฐ ์ฌ๋ฌ๊ฐ์ธ ํ๊ฒฝ์ผ ๋
CPU๊ฐ ์ฌ๋ฌ๊ฐ์ธ ํ๊ฒฝ์์๋ ์ธํฐ๋ฝํธ๋ฅผ ๋ง๋ ๊ฒ์ผ๋ก ํด๊ฒฐ๋์ง ์๋๋ค.
์๋ํ๋ฉด, ํ๋์ CPU์ ์ธํฐ๋ฝํธ๋ฅผ ๋ง๋๋ผ๋ ๋ค๋ฅธ CPU์์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๐ก ๋ฐ๋ผ์, ํ๋ฒ์ ํ๋์ CPU๋ง์ด ์ปค๋์ ๋ค์ด๊ฐ ์ ์๋๋ก ํ๋ ํด๊ฒฐ์ฑ ์ด ์์ง๋ง ์์ ์ด ๋นํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌ๋ ์ ์๋ค.
ํน์ ์ปค๋ ๋ด๋ถ์ ์๋ ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ ์, ๊ทธ ๋ฐ์ดํฐ์ lock์ ๊ฑธ์ด ๋ค๋ฅธ CPU๊ฐ ์ ๊ทผํ ์ ์๋๋ก ๋ง๋ ๋ฐฉ๋ฒ์ด ์๋ค.
๐ ๊ณต์ ์์ ๋๊ธฐํ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
lock
์ด๋ผ๋ ๊ณต์ ๋ณ์๊ฐ ์๊ณ , ์๊ณ ๊ตฌ์ญ(๊ณต์ ์์)์ ์ง์
ํ ๋
lock
๋ณ์๊ฐ true
์ด๋ฉด ๋๊ธฐ๋ฅผ ํ๊ณ , false
์ธ ๊ฒฝ์ฐ๋ง ์ง์
ํ ์ ์๋๋ก ํ๋ค.
์ง์
ํ์๋ lock
์ true
๋ก ๋ณ๊ฒฝํ์ฌ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ๋ง๊ณ
์๊ณ ๊ตฌ์ญ์ ๋น ์ ธ๋์จ ๋ค, lock
์ false
๋ก ๋ณ๊ฒฝํ์ฌ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ ์ ๊ทผํ ์ ์๋๋ก ํ๋ค.
์ด๋ฌํ ๋ฐฉ์ ์ค ๋ํ์ ์ธ ๊ฒ์ด ๐ก ์ธ๋งํฌ์ด์ด๋ค.
์ธ๋งํฌ์ด
์ธ๋งํฌ์ด๋ ์ ์ญ์ผ๋ก ๊ณต์ ๋๋ ๋ณ์๋ฅผ ๊ฐ๊ณ ,
์ผ๋ฐ์ ์ผ๋ก, ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ ์ ์๋ ํ๋ก์ธ์ค์ ์๋ฅผ ๊ฐ์ผ๋ก ๋๋ค.
๊ทธ๋ฆฌ๊ณ , ํ๋ก์ธ์ค๊ฐ ์๊ณ๊ตฌ์ญ์ ์ง์ ํ ๋๋ง๋ค ๊ณต์ ๋ณ์๊ฐ 0๋ณด๋ค ํฐ ์ํฉ์ธ์ง ์ฒดํฌํ๊ณ
์ ์ญ ๋ณ์๋ฅผ -1 ํจ์ผ๋ก์ ์ง์
ํ ์ ์๋ ํ๋ก์ธ์ค์ ์๋ฅผ ์ ํํ ์ ์๋ค. (P(S)
)
์๊ณ๊ตฌ์ญ์ ๋น ์ ธ๋์ฌ๋, ์ ์ญ ๋ณ์๋ฅผ ๋ค์ +1 ํจ์ผ๋ก์ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์ง์
ํ ์ ์๋๋ก ํ๋ค. (V(S)
)
๐จ ํ์ง๋ง, ์ด ๋ฐฉ์์ ์๊ณ๊ตฌ์ญ์ ์ง์
ํ๋ ค๋ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ while()
๋ฌธ์ ๊ณ์ํด์ ์ฒดํฌํ๋ ๋ฐ์ ๋๊ธฐ ์ํ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์์์ ๋ญ๋นํ ์ ์๋ค.
๐ก ๊ทธ๋์, block()
& wake_up()
๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
์๊ณ๊ตฌ์ญ์ ์ง์
ํ์ง ๋ชปํ๋ ํ๋ก์ธ์ค๋ ๊ณต์ ๋ณ์๋ฅผ ์์๊ฐ์ผ๋ก ๋ง๋ค๊ณ block()
๋์ด ๋๊ธฐ ํ์ ๋ค์ด๊ฐ ๋๊ธฐํ๊ฒ ๋๋ค.
์์ ์ ๋ง์น๊ณ ์๊ณ๊ตฌ์ญ์ ๋น ์ ธ๋์ค๋ ํ๋ก์ธ์ค๋ ๊ณต์ ๋ณ์๋ฅผ +1 ํ๊ณ ๋์,
๊ณต์ ๋ณ์ ๊ฐ์ด ์ฌ์ ํ 0 ์ดํ๋ผ๋ฉด block()
๋ ํ๋ก์ธ์ค๊ฐ ๋๊ธฐ ํ์ ์กด์ฌํ๊ณ ์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก,
๋๊ธฐ ํ์ ์๋ ํ๋ก์ธ์ค๋ฅผ wake_up()
ํจ์ผ๋ก์ ์๊ณ๊ตฌ์ญ์ผ๋ก ์ง์
ํ ์ ์๊ฒ ํ๋ค.
์ผ๋ฐ์ ์ผ๋ก, ์๊ณ ๊ตฌ์ญ์ ์ง์ ํ๊ธฐ ์ํ ๊ณต์ ๋ณ์๊ฐ 1๋ก์, ํ ๊ฐ์ ํ๋ก์ธ์ค๋ง ๊ณต์ ๋ณ์์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ฉด ๋ฎคํ ์ค๋ผ ๋ถ๋ฅด๊ณ
๊ณต์ ๋ณ์ ๊ฐ์ด 2 ์ด์์ผ๋ก, 2๊ฐ ์ด์์ ํ๋ก์ธ์ค๊ฐ ์ ๊ทผํ ์ ์์ผ๋ฉด ์ธ๋งํฌ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ชจ๋ํฐ
์ธ๋งํฌ์ด๋ ์๊ณ๊ตฌ์ญ์ ๋ณดํธํ๋ ์ข์ ๋ฐฉ๋ฒ์ด์ง๋ง, ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ผ์ชฝ์ ๊ฒฝ์ฐ, ์ธ๋งํฌ์ด๋ฅผ ํ๋ํ๋ ์์ ๊ณผ ์ธ๋งํฌ์ด๋ฅผ ๋ฐํํ๋ ์์ ์ด ๋ฐ๋๋ก๋์ด ์๊ณ๊ตฌ์ญ์ ๋ณดํธํ ์ ์๋ ์ํฉ์ด๊ณ
์ค๋ฅธ์ชฝ์ ๊ฒฝ์ฐ, ์ธ๋ง ํฌ์ด๋ฅผ ๋ฐํํ์ง ์์์ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ค์ด ๋ฌดํ ๋๊ธฐํ๋ ์ํฉ์ด ๋ฐ์ํ๋ค.
๋ฐ๋ผ์, ์ง์ ์ธ๋งํฌ์ด๋ฅผ ๊ตฌํํด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ค์๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค๊ฐ ๋ชจ๋ํฐ์ด๋ค.
์๊ณ๊ตฌ์ญ ๋ณดํธ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ ์์ ์ ๋ชจ๋ํฐ์๊ฒ ์์ ์ ์์ฒญํ๋ค.
๋ชจ๋ํฐ๋ ์์ฒญ๋ฐ์ ์์ ์ ์์๋๋ก ์ฒ๋ฆฌํ๋ค.
์์๋๋ก ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์๊ณ๊ตฌ์ญ์ ๋ณดํธํ ์ ์๋ค.
๋ํ, ์ธ๋งํฌ์ด์ ๋น๊ตํ์ ๋ ๋ฝ์ ๊ฑธ์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ ์ฅ์ ์ด ์๋ค.