๐Ÿ“Œ ๋“ค์–ด๊ฐ€๋ฉฐ

์šด์˜์ฒด์ œ ์ˆ˜์—… ์ค‘ 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๋ผ๋ฉด?

์ธํ„ฐ๋ŸฝํŠธ ๋นˆ๋„๊ฐ€ 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์ผ ๊ฒฝ์šฐ
์ธํ„ฐ๋ŸฝํŠธ ๋นˆ๋„๊ฐ€ 4์ผ ๊ฒฝ์šฐ

์ธํ„ฐ๋ŸฝํŠธ ๋นˆ๋„๊ฐ€ 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 ์ฝ”๋“œ

์œ„ ์‚ฌ์ง„์€ 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๊ฐ€ ๋œ๋‹ค.

 

 

 ๐Ÿ“Œ ๋งˆ์น˜๋ฉฐ

์ฒ˜์Œ์— test-and-set ์ฝ”๋“œ๋ฅผ ์ž˜๋ชป ์ดํ•ดํ•ด์„œ ์ „ํ˜€ ๋‹ค๋ฅธ ๋‹ต์„ ์“ธ ๋ป” ํ–ˆ๋‹ค.

์ด ์‹ค์Šต ๊ณผ์ œ๊ฐ€ ์—†์—ˆ๋‹ค๋ฉด ์•„๋งˆ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ ์ฑ„๋กœ ์ˆ˜์—…์ด ๋๋‚ฌ์„์ง€๋„ ๋ชจ๋ฅด๊ฒ ๋‹ค.

 

์šด์˜ ์ฒด์ œ๋Š” ์–ด๋ ต๋‹ค ~

+ Recent posts