๐ ๋ค์ด๊ฐ๋ฉฐ
์ด์์ฒด์ ์์ ์ค race condition์ ๋ํ ๊ณผ์ ๋ฅผ ๋ฐ์๋ค.
x86 CPU ์๋ฎฌ๋ ์ดํฐ๋ฅผ ํตํด race condition๊ณผ test-and-set์ ๋น๊ตํด์ race condition์ ๋ํด ๋ถ์ํ๊ณ ๋ฌธ์ ์ ๋ํ ๋ต๋ณ์ ์์ฑํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด.. race condition์ด๋?
๊ฒฝ์ ์ํ๋ผ๊ณ ๋ ํ๋ฉฐ
๋ ๊ฐ ์ด์์ ํ๋ก์ธ์ค๊ฐ ๊ณตํต ์์์ ์ฌ์ฉํ ๋,
ํ์ด๋ฐ์ด๋ ์์์ ๋ฐ๋ผ ์์คํ ๊ฒฐ๊ณผ๊ฐ์ด ๋ฌ๋ผ์ง๋ ๊ฒ์ ๋งํ๋ค.
race condition์ ๋๋ฒ๊น ํ ๋๋ ๋ฌธ์ ์ ์ ์ฐพ์ ์ ์๊ณ , ๋ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ์ ๋ณด์ฅํ์ง ๋ชปํ๋ฏ๋ก ์น๋ช ์ ์ธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ฐ๋ผ์ ๋์์ฑ ์ด์๋ฅผ ํด๊ฒฐํด์ค์ผํ๋ค.
๐ ์ค์ต ํ๊ฒฝ
- Ubuntu OS๊ฐ ์ค์น๋Linux ์ค์ตํ๊ฒฝ
- Python๋ฒ์ 2.x ์ด์ (Python 3 ์๋์ ์ฃผ์!)
๐ ๋ถ์์ ํ์ํ ํ์ผ
๊ต์๋๊ป์ ๊นํ๋ธ ๋งํฌ๋ฅผ ์ฃผ์
์ clone ๋ฐ์ ํ ์ค์ต์ ์งํํ๋ค.
๊นํ ๋งํฌ๋ฅผ ์ฒจ๋ถํ๊ธฐ๊ฐ.. ์กฐ๊ธ ๊ทธ๋์ ํ์ผ ๋ช
์ ๊ฐ์ง๊ณ ์ค๋ช
ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
- x86.py
- race.s (race condition ๋ฐ์ o)
- test-and-set.s (race condition ๋ฐ์ x)
์ฌ๊ธฐ์ x86.py๋ x86 ์๋ฎฌ๋ ์ดํฐ ํ์ผ์ด๋ฉฐ,
race.s์ test-and-set.s์ count ๋ณ์์ ๊ฐ์ 1 ์ฆ๊ฐ์ํค๋ ์ด์
๋ธ๋ฆฌ instruction ์ฝ๋์ด๋ค.
๐ ๊ฒฐ๊ณผ๊ฐ ์์
์ผ์ชฝ์ count๋ ๋ณ์, ax๋ ๋ ์ง์คํฐ์ด๋ฉฐ Thread 0, Thread 1์ ๊ณตํต๋ ์์(count)๋ฅผ ๊ณต์ ํ๋ ์ฐ๋ ๋์ด๋ค.
ํ์ฌ๋ ์ธํฐ๋ฝํธ๊ฐ ์๋ฌด ๊ฒ๋ ๊ฑธ๋ฆฌ์ง ์์์ผ๋ฏ๋ก Thread 0์์ count๊ฐ์ 1 ๋ํด์ฃผ๊ณ , Thread 1์ด 1์ด ์ ์ฅ๋ count๊ฐ์ ๋ฐ์ 1์ ๋ํด์ฃผ์๋ค. ๋ฐ๋ผ์ ์ต์ข ๊ฒฐ๊ณผ๊ฐ์ count๊ฐ 2์ธ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋ง์ฝ, ์ด ์ฝ๋์์ ์ธํฐ๋ฝํธ๊ฐ ๊ฑธ๋ ค์ ์ฝ๋์ ํ์ด๋ฐ์ด ๋ณ๊ฒฝ๋๋ค๋ฉด ๊ฒฐ๊ณผ๊ฐ์ด ๋ฌ๋ผ์ง ์๋ ์์ ๊ฒ์ด๋ค.
๐ race.s ์ฝ๋์์ ์ธํฐ๋ฝํธ ๋น๋๊ฐ 1 ๋๋ 2๋ผ๋ฉด?
๋ ์คํ ๊ฒฐ๊ณผ ๋ชจ๋ count๊ฐ์ด 1์ด ๋๋ค.
์ธํฐ๋ฝํธ ๋น๋๊ฐ 1์ด๋ 2์ผ ๋๋ Thread 0์์ ax๊ฐ์ count์ ์ ์ฅํ๋ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ง์ ์ ์ธํฐ๋ฝํธ๊ฐ ๊ฑธ๋ฆฐ๋ค.
์ด ๊ฒฝ์ฐ์๋ count๊ฐ์ด ๊ณต์ ๋๋ ๋ฐ์ดํฐ์ด๋ฏ๋ก Thread1์ด 1000๋ฒ ๋ช ๋ น์ด์ธ count๊ฐ์ ax๋ ์ง์คํฐ๋ก ๊ฐ์ง๊ณ ์ฌ ๋ 1๋ก ๋ฐ๋์ง ์๊ณ ์์ง 0์ผ๋ก ์ ํ ๋ count๊ฐ์ ๊ฐ์ง๊ณ ์ค๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋๋ค.
์ฆ Thread0์์ ax์ 1์ ๋ํ๋ ๊ฒ๊ณผ ax๊ฐ์ count์ ๋ฃ๋ ์ฝ๋๊ฐ ์ฐ๋ฌ์ ์คํ๋์ง ์์์ Thread1์ ๋ณ๊ฒฝ๋์ง ์์ count ๊ฐ์ ๊ฐ์ง๊ณ ๋ช ๋ น์ด๋ฅผ ์ํํ๊ธฐ ๋๋ฌธ์ ์ต์ข count๊ฐ์ด 1์ด๋๋ค.
๐ race.s ์ฝ๋์์ ์ธํฐ๋ฝํธ ๋น๋๊ฐ 3์ด์์ด๋ผ๋ฉด?
์ธํฐ๋ฝํธ ๋น๋๊ฐ 3 ์ด์์ด๋ผ๋ฉด count ๊ฐ์ ๊ฒฐ๊ณผ์ ์ผ๋ก 2๊ฐ ๋์จ๋ค.
์ธํฐ๋ฝํธ ๋น๋๊ฐ 3์ด๋ 4์ผ ๋, ๊ทธ๋ฆฌ๊ณ 5์ด์(Thread0์ ์ฝ๋๊ฐ ์ด๋ฏธ ๋๋ ๊ฒฝ์ฐ)์ผ ๋์๋ ์ธํฐ๋ฝํธ ๋น๋๊ฐ 2 ์ดํ์ผ ๊ฒฝ์ฐ์๋ ๋ค๋ฅด๊ฒ 1001, 1002๋ฒ ๋ช ๋ น์ด์ธ ax์ 1์ ๋ํ๋ ๊ฒ๊ณผ ax๊ฐ์ count์ ์ ์ฅํ๋ ์ฝ๋๊ฐ ์ฐ๋ฌ์ ์ํ๋๊ธฐ ๋๋ฌธ์ ์ต์ข count๊ฐ์ 2๊ฐ ๋๋ค.
๐ race.s ์ฝ๋์ race condition ๋ฌธ์ ์
ax ๋ ์ง์คํฐ์ ๊ฐ ์ค๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ ๋ถ๋ถ์ด ์ฌ๋ฐ๋ฅธ ํ์ด๋ฐ์ ์คํ๋์ง ์์ผ๋ฉด ๊ฒฐ๊ณผ๊ฐ์ด ๋ฌ๋ผ์ง๋ ์น๋ช ์ ์ธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์ด ์ฝ๋์์๋ 1001, 1002๋ฒ ๋ช ๋ น์ด๊ฐ ํ ๋ฒ์ ์คํ๋์ง ์์ ๊ฒฝ์ฐ์ ํด๋นํ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ธํฐ๋ฝํธ ๋น๋๊ฐ 1 ๋๋ 2์ผ ๊ฒฝ์ฐ์ count ๊ฒฐ๊ณผ๊ฐ์ด ๋ฌ๋ผ์ง๋ฏ๋ก race condition ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๊ณ ๋ณผ ์ ์๋ค.
๐ test-and-set.s ์ฝ๋์์ ์ธํฐ๋ฝํธ ๋น๋์ ๋ฐ๋ฅธ count ๊ฐ์?
์ ์ฌ์ง์ test-and-set.s๋ฅผ ์ธํฐ๋ฝํธ ์์ด ์คํ์ํจ ์ฝ๋์ด๋ค.
์ด ์ฝ๋๋ ์๊น race.s ์ฝ๋์๋ ๋ค๋ฅด๊ฒ ์ธํฐ๋ฝํธ ๋น๋๋ฅผ ๋ค์ํ๊ฒ ๊ฑธ์ด๋ race condition ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
๋จผ์ count์ mutex๋ ๊ณต์ ๋๋ ๋ฐ์ดํฐ, ax๋ ๊ฐ๊ฐ์ด ๊ฐ์ง ๋ ์ง์คํฐ์ด๋ค.
์ฌ๊ธฐ์ mutex๊ฐ์ lock์ ๊ฑธ์ด์คฌ๋์ง ์๋์ง๋ฅผ ์ ์ ์๋ ๋ฐ์ดํฐ๋ก ์ฌ์ฉ๋๋ค.
์คํ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด 1004๋ฒ ๋ช ๋ น์ด๊ฐ ํ์ฌ count๊ฐ์ ์์ ์ ax๋ ์ง์คํฐ๋ก ๊ฐ์ ธ์ค๋ ๋ช ๋ น์ด์ด๋ค. ์ด ๋ช ๋ น์ด๊ฐ ์ ๋๋ก ๋ณ๊ฒฝ๋ ํ์ count๊ฐ์ ๊ฐ์ง๊ณ ์ค๋ฉด ๋ฌธ์ ๊ฐ ์์ ๊ฒ์ด๋ค.
์ด ์ฝ๋์์ ์ธํฐ๋ฝํธ๊ฐ ์๊ด์๋ ์ด์ ๋ 1004๋ฒ ์ด์ ์ ๋ช ๋ น์ด์ 1007๋ฒ ๋ช ๋ น์ด ๋๋ฌธ์ด๋ค.
Thread1์ ์ธํฐ๋ฝํธ๋ฅผ ๊ฑธ๊ณ ax๊ฐ์ 1๋ก ์ ํ ํด์ ํ์ฌ์ mutex๊ฐ๊ณผ ๋น๊ตํ๋ค. Thread0์ด count๊ฐ์ ๊ฐ์ ธ์ค๊ณ (1004) ax์ 1์ ๋ํ๊ณ (1005), ax๋ฅผ count์ ์ ์ฅํ๋(1006) critical section์ ํด๋นํ๋ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ง์ ์ mutex๊ฐ์ 1๋ก ์ ํ ํ๊ธฐ ๋๋ฌธ์ Thread1์ mutex๊ฐ์ ๋ณด๊ณ 1์ด๋ฉด Thread0์ด ์์ง critical section์ฝ๋๋ฅผ ์ํํ๊ณ ์๋ค๊ณ ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋ค์ 1000๋ฒ ๋ช ๋ น์ด๋ก ์ ํํ๊ฒ ๋๋ค.
์ฆ, ์ธํฐ๋ฝํธ๊ฐ ์ธ์ ๊ฑธ๋ฆฌ๋ ํญ์ Thread1์ mutex๊ฐ ๋น๊ต๋ฅผ ํตํด Thread0์ด count๊ฐ ์ ์ฅ์ ๋๋๋์ง๋ฅผ ์ ์ ์๋ค. ๋ฐ๋ผ์ Thread0์ด 1์ฆ๊ฐ๋ ax๊ฐ์ count์ ์ ์ฅํ๋ ์ฝ๋์ธ 1006๋ฒ ์ฝ๋๊ฐ ๋๋๊ณ mutex๊ฐ์ ๋ค์ 0์ผ๋ก ๋ณํํด์ฃผ๊ธฐ ์ ๊น์ง๋ Thread1์ด 1000๋ฒ ์ฝ๋๋ก ๊ฒ์ ์ ํํ๊ฒ ๋๋ค. ๋ง์ฝ ๊ฒ์ฌ ํ์ ๋ mutex๊ฐ์ด 0์ด๋ผ๋ฉด Thread1์์๋ ๋์ด์ 1000๋ฒ์ฝ๋๋ก ์ ํํ์ง ์๊ณ (๊ฒ์ฌํ์ง ์๊ณ ) ๋น๋ก์ 1004๋ฒ ์ฝ๋๋ก ๋์ด๊ฐ๊ฒ ๋๋ค.
์ด ์ฝ๋์์ mutex๊ฐ์ 1๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฒ์ critical section์ lock์ ๊ฑฐ๋ ๊ฒ์ด๊ณ mutex๊ฐ์ 0์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฒ์ lock์ ํด์ ํ๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค. ๋ฐ๋ผ์ Thread1์ lock์ด ๊ฑธ๋ฆฐ์ง ์๋์ง๋ฅผ ํ์ธํ๊ณ lock์ด ํด์ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ ํด์ ๋์๋ค๊ณ ํ๋จ๋๋ฉด ํ์ฌ count๊ฐ์ ๊ฐ์ง๊ณ ์์ ๋ค์ ๋ช ๋ น์ด๋ค์ ์คํํ๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก Thread1์ count๊ฐ์ด 1๋ก ๋ณ๊ฒฝ๋๊ณ ๋์ ๊ฐ์ง๊ณ ์ค๊ธฐ ๋๋ฌธ์ ์ต์ข ๊ฒฐ๊ณผ๊ฐ์ ์ธํฐ๋ฝํธ ๋น๋์ ์๊ด์์ด 2๊ฐ ๋๋ค.