์๋ฐ์คํฌ๋ฆฝํธ SharedArrayBuffer ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ๊ณผ ์์์ ์ฐ์ฐ์ ํ๊ตฌํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ Node.js ํ๊ฒฝ์์ ํจ์จ์ ์ด๊ณ ์์ ํ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ๊ตฌํํ์ธ์. ๋ฐ์ดํฐ ๊ฒฝ์, ๋ฉ๋ชจ๋ฆฌ ๋๊ธฐํ์ ๋ณต์ก์ฑ๊ณผ ์์์ ์ฐ์ฐ ํ์ฉ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํดํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ SharedArrayBuffer ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ: ์์์ ์ฐ์ฐ ์๋งจํฑ
ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์
๊ณผ Node.js ํ๊ฒฝ์ ์ ์ ๋ ๋์ ์ฑ๋ฅ๊ณผ ๋ฐ์์ฑ์ ์๊ตฌํฉ๋๋ค. ์ด๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ๊ฐ๋ฐ์๋ค์ ์ข
์ข
๋์์ฑ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ ์ ์ฌ์ฉํฉ๋๋ค. ์ ํต์ ์ผ๋ก ๋จ์ผ ์ค๋ ๋์๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ด์ SharedArrayBuffer์ Atomics์ ๊ฐ์ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ์ฌ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋์์ฑ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ด ๋ธ๋ก๊ทธ ํฌ์คํธ์์๋ SharedArrayBuffer ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ๊น์ด ํ๊ณ ๋ค์ด, ์์์ ์ฐ์ฐ์ ์๋งจํฑ๊ณผ ์์ ํ๊ณ ํจ์จ์ ์ธ ๋์ ์คํ์ ๋ณด์ฅํ๋ ๋ฐ ์์ด ๊ทธ ์ญํ ์ ์ค์ ์ ์ผ๋ก ๋ค๋ฃฐ ๊ฒ์
๋๋ค.
SharedArrayBuffer์ Atomics ์๊ฐ
SharedArrayBuffer๋ ์ฌ๋ฌ ์๋ฐ์คํฌ๋ฆฝํธ ์ค๋ ๋(์ผ๋ฐ์ ์ผ๋ก ์น ์์ปค ๋๋ Node.js ์์ปค ์ค๋ ๋ ๋ด)๊ฐ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์
๋๋ค. ์ด๋ ์ค๋ ๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ ์ ํต์ ์ธ ๋ฉ์์ง ์ ๋ฌ ๋ฐฉ์๊ณผ ๋์กฐ๋ฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ๊ณต์ ํ๋ฉด ํน์ ์ ํ์ ๊ณ์ฐ ์ง์ฝ์ ์์
์์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต์ ๋ ๋ฐ์ดํฐ ๊ฒฝ์(data race)์ ์ํ์ ์ด๋ํฉ๋๋ค. ๋ฐ์ดํฐ ๊ฒฝ์์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์์น์ ์ ๊ทผํ๊ณ ์์ ํ๋ ค๊ณ ํ ๋ ๋ฐ์ํ๋ฉฐ, ์์ธกํ ์ ์๊ณ ์ ์ฌ์ ์ผ๋ก ์๋ชป๋ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค. Atomics ๊ฐ์ฒด๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ์์ ํ๊ณ ์์ธก ๊ฐ๋ฅํ ์ ๊ทผ์ ๋ณด์ฅํ๋ ์์์ ์ฐ์ฐ ์งํฉ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ์ฐ์ฐ์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์์น์ ๋ํ ์ฝ๊ธฐ, ์ฐ๊ธฐ ๋๋ ์์ ์์
์ด ๋จ์ผํ๊ณ ๋ถํ ํ ์ ์๋ ์์
์ผ๋ก ๋ฐ์ํ๋๋ก ๋ณด์ฅํ์ฌ ๋ฐ์ดํฐ ๊ฒฝ์์ ๋ฐฉ์งํฉ๋๋ค.
SharedArrayBuffer ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ ์ดํดํ๊ธฐ
SharedArrayBuffer๋ ์์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋
ธ์ถํฉ๋๋ค. ์๋ก ๋ค๋ฅธ ์ค๋ ๋์ ํ๋ก์ธ์์์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ด ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋๋์ง ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ํน์ ์์ค์ ๋ฉ๋ชจ๋ฆฌ ์ผ๊ด์ฑ์ ๋ณด์ฅํ์ง๋ง, ๊ฐ๋ฐ์๋ ์ฌ์ ํ ์ ์ฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ ๋ ฌ ๋ฐ ์บ์ฑ ํจ๊ณผ๋ฅผ ์ธ์งํด์ผ ํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ์ผ๊ด์ฑ ๋ชจ๋ธ
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ํ๋ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ(relaxed memory model)์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ํ ์ค๋ ๋์์ ์ฐ์ฐ์ด ์คํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์์๊ฐ ๋ค๋ฅธ ์ค๋ ๋์์ ์คํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์์์ ๋ค๋ฅผ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ปดํ์ผ๋ฌ์ ํ๋ก์ธ์๋ ๋จ์ผ ์ค๋ ๋ ๋ด์์ ๊ด์ฐฐ ๊ฐ๋ฅํ ๋์์ด ๋ณ๊ฒฝ๋์ง ์๋ ํ, ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด ๋ช ๋ น์ด๋ฅผ ์์ ๋กญ๊ฒ ์ฌ์ ๋ ฌํ ์ ์์ต๋๋ค.
๋ค์ ์์๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์(๋จ์ํ๋จ):
// ์ค๋ ๋ 1
sharedArray[0] = 1; // A
sharedArray[1] = 2; // B
// ์ค๋ ๋ 2
if (sharedArray[1] === 2) { // C
console.log(sharedArray[0]); // D
}
์ ์ ํ ๋๊ธฐํ ์์ด๋, ์ค๋ ๋ 2๊ฐ ์ค๋ ๋ 1์ด sharedArray[0]์ 1์ ์ฐ๋ ์์
(A)์ ๋ง์น๊ธฐ ์ ์ sharedArray[1]์ 2๋ก ๋ณผ ์ ์์ต๋๋ค(C). ๊ฒฐ๊ณผ์ ์ผ๋ก, console.log(sharedArray[0]) (D)๋ ์์์น ๋ชปํ ๊ฐ์ด๋ ์ค๋๋ ๊ฐ(์: ์ด๊ธฐ 0 ๊ฐ ๋๋ ์ด์ ์คํ์ ๊ฐ)์ ์ถ๋ ฅํ ์ ์์ต๋๋ค. ์ด๋ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ์ค์์ฑ์ ๊ฐ์กฐํฉ๋๋ค.
์บ์ฑ๊ณผ ์ผ๊ด์ฑ
ํ๋ ํ๋ก์ธ์๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์๋๋ฅผ ๋์ด๊ธฐ ์ํด ์บ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฐ ์ค๋ ๋๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ์์ฒด ๋ก์ปฌ ์บ์๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์์น์ ๋ํด ๋ค๋ฅธ ๊ฐ์ ๋ณด๋ ์ํฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ์ผ๊ด์ฑ ํ๋กํ ์ฝ์ ๋ชจ๋ ์บ์๊ฐ ์ผ๊ด๋๊ฒ ์ ์ง๋๋๋ก ๋ณด์ฅํ์ง๋ง, ์ด ํ๋กํ ์ฝ์๋ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค. ์์์ ์ฐ์ฐ์ ๋ณธ์ง์ ์ผ๋ก ์บ์ ์ผ๊ด์ฑ์ ์ฒ๋ฆฌํ์ฌ ์ค๋ ๋ ๊ฐ์ ์ต์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฅํฉ๋๋ค.
์์์ ์ฐ์ฐ: ์์ ํ ๋์์ฑ์ ํต์ฌ
Atomics ๊ฐ์ฒด๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์์น์ ์์ ํ๊ฒ ์ ๊ทผํ๊ณ ์์ ํ๊ธฐ ์ํด ์ค๊ณ๋ ์์์ ์ฐ์ฐ ์งํฉ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ์ฐ์ฐ์ ์ฝ๊ธฐ, ์ฐ๊ธฐ ๋๋ ์์ ์์
์ด ๋จ์ผํ๊ณ ๋ถํ ํ ์ ์๋(์์์ ) ๋จ๊ณ๋ก ๋ฐ์ํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
์์์ ์ฐ์ฐ์ ์ข ๋ฅ
Atomics ๊ฐ์ฒด๋ ๋ค์ํ ๋ฐ์ดํฐ ์ ํ์ ๋ํ ์ฌ๋ฌ ์์์ ์ฐ์ฐ์ ์ ๊ณตํฉ๋๋ค. ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ช ๊ฐ์ง๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
Atomics.load(typedArray, index):TypedArray์ ์ง์ ๋ ์ธ๋ฑ์ค์์ ๊ฐ์ ์์์ ์ผ๋ก ์ฝ์ต๋๋ค. ์ฝ์ ๊ฐ์ ๋ฐํํฉ๋๋ค.Atomics.store(typedArray, index, value):TypedArray์ ์ง์ ๋ ์ธ๋ฑ์ค์ ๊ฐ์ ์์์ ์ผ๋ก ์๋๋ค. ์ด ๊ฐ์ ๋ฐํํฉ๋๋ค.Atomics.add(typedArray, index, value): ์ง์ ๋ ์ธ๋ฑ์ค์ ๊ฐ์ ์ฃผ์ด์ง ๊ฐ์ ์์์ ์ผ๋ก ๋ํฉ๋๋ค. ๋ง์ ํ์ ์ ๊ฐ์ ๋ฐํํฉ๋๋ค.Atomics.sub(typedArray, index, value): ์ง์ ๋ ์ธ๋ฑ์ค์ ๊ฐ์์ ์ฃผ์ด์ง ๊ฐ์ ์์์ ์ผ๋ก ๋บ๋๋ค. ๋บ์ ํ์ ์ ๊ฐ์ ๋ฐํํฉ๋๋ค.Atomics.and(typedArray, index, value): ์ง์ ๋ ์ธ๋ฑ์ค์ ๊ฐ๊ณผ ์ฃผ์ด์ง ๊ฐ ์ฌ์ด์ ๋นํธ์์ด์ฆ AND ์ฐ์ฐ์ ์์์ ์ผ๋ก ์ํํฉ๋๋ค. ์ฐ์ฐ ํ์ ์ ๊ฐ์ ๋ฐํํฉ๋๋ค.Atomics.or(typedArray, index, value): ์ง์ ๋ ์ธ๋ฑ์ค์ ๊ฐ๊ณผ ์ฃผ์ด์ง ๊ฐ ์ฌ์ด์ ๋นํธ์์ด์ฆ OR ์ฐ์ฐ์ ์์์ ์ผ๋ก ์ํํฉ๋๋ค. ์ฐ์ฐ ํ์ ์ ๊ฐ์ ๋ฐํํฉ๋๋ค.Atomics.xor(typedArray, index, value): ์ง์ ๋ ์ธ๋ฑ์ค์ ๊ฐ๊ณผ ์ฃผ์ด์ง ๊ฐ ์ฌ์ด์ ๋นํธ์์ด์ฆ XOR ์ฐ์ฐ์ ์์์ ์ผ๋ก ์ํํฉ๋๋ค. ์ฐ์ฐ ํ์ ์ ๊ฐ์ ๋ฐํํฉ๋๋ค.Atomics.exchange(typedArray, index, value): ์ง์ ๋ ์ธ๋ฑ์ค์ ๊ฐ์ ์ฃผ์ด์ง ๊ฐ์ผ๋ก ์์์ ์ผ๋ก ๊ต์ฒดํฉ๋๋ค. ์๋ ๊ฐ์ ๋ฐํํฉ๋๋ค.Atomics.compareExchange(typedArray, index, expectedValue, replacementValue): ์ง์ ๋ ์ธ๋ฑ์ค์ ๊ฐ์expectedValue์ ์์์ ์ผ๋ก ๋น๊ตํฉ๋๋ค. ๊ฐ์ผ๋ฉด ๊ฐ์replacementValue๋ก ๊ต์ฒดํฉ๋๋ค. ์๋ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ด๋ ๋ฝ ํ๋ฆฌ(lock-free) ์๊ณ ๋ฆฌ์ฆ์ ์ค์ํ ๊ตฌ์ฑ ์์์ ๋๋ค.Atomics.wait(typedArray, index, expectedValue, timeout): ์ง์ ๋ ์ธ๋ฑ์ค์ ๊ฐ์ดexpectedValue์ ๊ฐ์์ง ์์์ ์ผ๋ก ํ์ธํฉ๋๋ค. ๊ฐ์ผ๋ฉด ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๋์ผํ ์์น์์Atomics.wake()๋ฅผ ํธ์ถํ๊ฑฐ๋timeout์ ๋๋ฌํ ๋๊น์ง ์ค๋ ๋๋ฅผ ๋ธ๋ก(์ ๋ค๊ฒ)ํฉ๋๋ค. ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด('ok', 'not-equal' ๋๋ 'timed-out')์ ๋ฐํํฉ๋๋ค.Atomics.wake(typedArray, index, count):TypedArray์ ์ง์ ๋ ์ธ๋ฑ์ค์์ ๋๊ธฐ ์ค์ธ ์ค๋ ๋๋ฅผcount๊ฐ์๋งํผ ๊นจ์๋๋ค. ๊นจ์ด๋ ์ค๋ ๋์ ์๋ฅผ ๋ฐํํฉ๋๋ค.
์์์ ์ฐ์ฐ ์๋งจํฑ
์์์ ์ฐ์ฐ์ ๋ค์์ ๋ณด์ฅํฉ๋๋ค:
- ์์์ฑ(Atomicity): ์ฐ์ฐ์ ๋จ์ผํ๊ณ ๋ถํ ํ ์ ์๋ ๋จ์๋ก ์ํ๋ฉ๋๋ค. ๋ค๋ฅธ ์ค๋ ๋๋ ์ค๊ฐ์ ์ฐ์ฐ์ ๋ฐฉํดํ ์ ์์ต๋๋ค.
- ๊ฐ์์ฑ(Visibility): ์์์ ์ฐ์ฐ์ผ๋ก ์ธํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ค๋ฅธ ๋ชจ๋ ์ค๋ ๋์ ์ฆ์ ํ์๋ฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ์ผ๊ด์ฑ ํ๋กํ ์ฝ์ ์บ์๊ฐ ์ ์ ํ๊ฒ ์ ๋ฐ์ดํธ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ์์(์ ํ ์์): ์์์ ์ฐ์ฐ์ ๋ค๋ฅธ ์ค๋ ๋์์ ์ฐ์ฐ์ด ๊ด์ฐฐ๋๋ ์์์ ๋ํ ์ผ๋ถ ๋ณด์ฅ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ํํ ์์ ์๋งจํฑ์ ํน์ ์์์ ์ฐ์ฐ๊ณผ ๊ธฐ๋ณธ ํ๋์จ์ด ์ํคํ ์ฒ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์์ ์ง์ (์: ์์ฐจ์ ์ผ๊ด์ฑ, ํ๋/ํด์ ์๋งจํฑ)๊ณผ ๊ฐ์ ๊ฐ๋ ์ด ๋ ๊ณ ๊ธ ์๋๋ฆฌ์ค์์ ์ค์ํด์ง๋ ๋ถ๋ถ์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ Atomics๋ ๋ค๋ฅธ ์ธ์ด๋ณด๋ค ์ฝํ ๋ฉ๋ชจ๋ฆฌ ์์ ๋ณด์ฅ์ ์ ๊ณตํ๋ฏ๋ก ์ฌ์ ํ ์ ์คํ ์ค๊ณ๊ฐ ํ์ํฉ๋๋ค.
์์์ ์ฐ์ฐ์ ์ค์ ์์
์์์ ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ ์ผ๋ฐ์ ์ธ ๋์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ช ๊ฐ์ง ์ค์ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. ๊ฐ๋จํ ์นด์ดํฐ
๋ค์์ ์์์ ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ์นด์ดํฐ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค:
const sab = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT); // 4๋ฐ์ดํธ
const counter = new Int32Array(sab);
function incrementCounter() {
Atomics.add(counter, 0, 1);
}
function getCounterValue() {
return Atomics.load(counter, 0);
}
// ์ฌ์ฉ ์์ (์๋ก ๋ค๋ฅธ ์น ์์ปค ๋๋ Node.js ์์ปค ์ค๋ ๋์์)
incrementCounter();
console.log("Counter value: " + getCounterValue());
์ด ์์ ๋ Atomics.add๋ฅผ ์ฌ์ฉํ์ฌ ์นด์ดํฐ๋ฅผ ์์์ ์ผ๋ก ์ฆ๊ฐ์ํค๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. Atomics.load๋ ์นด์ดํฐ์ ํ์ฌ ๊ฐ์ ๊ฒ์ํฉ๋๋ค. ์ด๋ฌํ ์ฐ์ฐ์ ์์์ ์ด๋ฏ๋ก ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋ฐ์ดํฐ ๊ฒฝ์ ์์ด ์์ ํ๊ฒ ์นด์ดํฐ๋ฅผ ์ฆ๊ฐ์ํฌ ์ ์์ต๋๋ค.
2. ๋ฝ(๋ฎคํ ์ค) ๊ตฌํํ๊ธฐ
๋ฎคํ
์ค(์ํธ ๋ฐฐ์ ๋ฝ)๋ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ๊ณต์ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ ๋๊ธฐํ ํ๋ฆฌ๋ฏธํฐ๋ธ์
๋๋ค. ์ด๋ Atomics.compareExchange์ Atomics.wait/Atomics.wake๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ ์ ์์ต๋๋ค.
const sab = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);
const lock = new Int32Array(sab);
const UNLOCKED = 0;
const LOCKED = 1;
function acquireLock() {
while (Atomics.compareExchange(lock, 0, UNLOCKED, LOCKED) !== UNLOCKED) {
Atomics.wait(lock, 0, LOCKED, Infinity); // ์ ๊ธ์ด ํด์ ๋ ๋๊น์ง ๋๊ธฐ
}
}
function releaseLock() {
Atomics.store(lock, 0, UNLOCKED);
Atomics.wake(lock, 0, 1); // ๋๊ธฐ ์ค์ธ ์ค๋ ๋ ํ๋๋ฅผ ๊นจ์
}
// ์ฌ์ฉ ์์
acquireLock();
// ์๊ณ ์์ญ: ์ฌ๊ธฐ์ ๊ณต์ ๋ฆฌ์์ค์ ์ ๊ทผ
releaseLock();
์ด ์ฝ๋๋ Atomics.compareExchange๋ฅผ ์ฌ์ฉํ์ฌ ๋ฝ ํ๋์ ์๋ํ๋ acquireLock์ ์ ์ํฉ๋๋ค. ๋ฝ์ด ์ด๋ฏธ ์ ์ ๋ ๊ฒฝ์ฐ(์ฆ, lock[0]์ด UNLOCKED๊ฐ ์๋ ๊ฒฝ์ฐ), ์ค๋ ๋๋ Atomics.wait๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ธฐํฉ๋๋ค. releaseLock์ lock[0]์ UNLOCKED๋ก ์ค์ ํ์ฌ ๋ฝ์ ํด์ ํ๊ณ Atomics.wake๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ธฐ ์ค์ธ ์ค๋ ๋ ํ๋๋ฅผ ๊นจ์๋๋ค. `acquireLock`์ ๋ฃจํ๋ ํ์ ๊นจ์ด๋จ(spurious wakeup, ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ง ์์์์๋ `Atomics.wait`๊ฐ ๋ฐํ๋๋ ๊ฒฝ์ฐ)์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
3. ์ธ๋งํฌ์ด ๊ตฌํํ๊ธฐ
์ธ๋งํฌ์ด๋ ๋ฎคํ ์ค๋ณด๋ค ๋ ์ผ๋ฐ์ ์ธ ๋๊ธฐํ ํ๋ฆฌ๋ฏธํฐ๋ธ์ ๋๋ค. ์นด์ดํฐ๋ฅผ ์ ์งํ๊ณ ํน์ ์์ ์ค๋ ๋๊ฐ ๊ณต์ ๋ฆฌ์์ค์ ๋์์ ์ ๊ทผํ๋๋ก ํ์ฉํฉ๋๋ค. ์ด๋ ๋ฎคํ ์ค(์ด์ง ์ธ๋งํฌ์ด)๋ฅผ ์ผ๋ฐํํ ๊ฒ์ ๋๋ค.
const sab = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);
const semaphore = new Int32Array(sab);
let permits = 2; // ์ฌ์ฉ ๊ฐ๋ฅํ ํ๊ฐ ์
Atomics.store(semaphore, 0, permits);
async function acquireSemaphore() {
let current;
while (true) {
current = Atomics.load(semaphore, 0);
if (current > 0) {
if (Atomics.compareExchange(semaphore, 0, current, current - 1) === current) {
// ์ฑ๊ณต์ ์ผ๋ก ํ๊ฐ ํ๋
return;
}
} else {
// ์ฌ์ฉ ๊ฐ๋ฅํ ํ๊ฐ ์์, ๋๊ธฐ
await new Promise(resolve => {
const checkInterval = setInterval(() => {
if (Atomics.load(semaphore, 0) > 0) {
clearInterval(checkInterval);
resolve(); // ํ๊ฐ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํด์ง๋ฉด ํ๋ผ๋ฏธ์ค๋ฅผ ํด๊ฒฐ
}
}, 10);
});
}
}
}
function releaseSemaphore() {
Atomics.add(semaphore, 0, 1);
}
// ์ฌ์ฉ ์์
async function worker() {
await acquireSemaphore();
try {
// ์๊ณ ์์ญ: ์ฌ๊ธฐ์ ๊ณต์ ๋ฆฌ์์ค์ ์ ๊ทผ
console.log("Worker executing");
await new Promise(resolve => setTimeout(resolve, 100)); // ์์
์๋ฎฌ๋ ์ด์
} finally {
releaseSemaphore();
console.log("Worker released");
}
}
// ์ฌ๋ฌ ์์ปค๋ฅผ ๋์์ ์คํ
worker();
worker();
worker();
์ด ์์ ๋ ๊ณต์ ์ ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ํ๊ฐ ์๋ฅผ ์ถ์ ํ๋ ๊ฐ๋จํ ์ธ๋งํฌ์ด๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ฐธ๊ณ : ์ด ์ธ๋งํฌ์ด ๊ตฌํ์ `setInterval`์ ์ฌ์ฉํ ํด๋ง์ ์ฌ์ฉํ๋ฏ๋ก `Atomics.wait` ๋ฐ `Atomics.wake`๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋นํจ์จ์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฌ์์ ๋๊ธฐ ์ค๋ ๋์ ๋ํ FIFO ํ๊ฐ ์๊ธฐ ๋๋ฌธ์ `Atomics.wait` ๋ฐ `Atomics.wake`๋ง ์ฌ์ฉํ์ฌ ๊ณต์ ์ฑ ๋ณด์ฅ์ด ์๋ ์์ ํ ์ค์ ์ธ๋งํฌ์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ์์ ํ POSIX ์ธ๋งํฌ์ด ์๋งจํฑ์ ์ํด์๋ ๋ ๋ณต์กํ ๊ตฌํ์ด ํ์ํฉ๋๋ค.
SharedArrayBuffer์ Atomics ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
SharedArrayBuffer์ Atomics๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด ์ ์คํ ๊ณํ๊ณผ ์ธ๋ถ ์ฌํญ์ ๋ํ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค. ๋ค์์ ๋ฐ๋ผ์ผ ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก์
๋๋ค:
- ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ต์ํ: ๋ฐ๋์ ๊ณต์ ํด์ผ ํ๋ ๋ฐ์ดํฐ๋ง ๊ณต์ ํ์ญ์์ค. ๊ณต๊ฒฉ ํ๋ฉด๊ณผ ์ค๋ฅ ๊ฐ๋ฅ์ฑ์ ์ค์ ๋๋ค.
- ์์์ ์ฐ์ฐ ์ ์คํ๊ฒ ์ฌ์ฉํ๊ธฐ: ์์์ ์ฐ์ฐ์ ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ๊ฒฝ์์ผ๋ก๋ถํฐ ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํด์ผ ํ ๋๋ง ์ฌ์ฉํ์ญ์์ค. ๋ ์ค์ํ ๋ฐ์ดํฐ์ ๋ํด์๋ ๋ฉ์์ง ์ ๋ฌ๊ณผ ๊ฐ์ ๋์ ์ ๋ต์ ๊ณ ๋ คํ์ญ์์ค.
- ๊ต์ฐฉ ์ํ(Deadlock) ํผํ๊ธฐ: ์ฌ๋ฌ ๋ฝ์ ์ฌ์ฉํ ๋ ์ฃผ์ํ์ญ์์ค. ์ค๋ ๋๊ฐ ์ผ๊ด๋ ์์๋ก ๋ฝ์ ํ๋ํ๊ณ ํด์ ํ๋๋ก ํ์ฌ, ๋ ์ด์์ ์ค๋ ๋๊ฐ ์๋ก๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ๋ฌด๊ธฐํ ์ฐจ๋จ๋๋ ๊ต์ฐฉ ์ํ๋ฅผ ํผํ์ญ์์ค.
- ๋ฝ ํ๋ฆฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๊ณ ๋ คํ๊ธฐ: ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ช ์์ ์ธ ๋ฝ์ด ํ์ ์๋ ๋ฝ ํ๋ฆฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒฝ์์ ์ค์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฝ ํ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ์ค๊ณํ๊ณ ๋๋ฒ๊น ํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต์ต๋๋ค.
- ์ฒ ์ ํ ํ ์คํธ: ๋์์ฑ ํ๋ก๊ทธ๋จ์ ํ ์คํธํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต์ต๋๋ค. ์คํธ๋ ์ค ํ ์คํธ ๋ฐ ๋์์ฑ ํ ์คํธ๋ฅผ ํฌํจํ ์ฒ ์ ํ ํ ์คํธ ์ ๋ต์ ์ฌ์ฉํ์ฌ ์ฝ๋๊ฐ ์ ํํ๊ณ ๊ฒฌ๊ณ ํ์ง ํ์ธํ์ญ์์ค.
- ์ค๋ฅ ์ฒ๋ฆฌ ๊ณ ๋ คํ๊ธฐ: ๋์ ์คํ ์ค์ ๋ฐ์ํ ์ ์๋ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ ์ค๋น๋ฅผ ํ์ญ์์ค. ์ถฉ๋ ๋ฐ ๋ฐ์ดํฐ ์์์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ญ์์ค.
- ํ์ ๋ฐฐ์ด(Typed Arrays) ์ฌ์ฉํ๊ธฐ: ํญ์ SharedArrayBuffer์ ํจ๊ป ํ์ ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๊ณ ์ ํ ํผ๋์ ๋ฐฉ์งํ์ญ์์ค. ์ด๋ ์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ์์ ์ฑ์ ํฅ์์ํต๋๋ค.
๋ณด์ ๊ณ ๋ ค ์ฌํญ
SharedArrayBuffer์ Atomics API๋ ํนํ ์คํํฐ(Spectre)์ ์ ์ฌํ ์ทจ์ฝ์ ๊ณผ ๊ด๋ จํ์ฌ ๋ณด์ ์ฐ๋ ค์ ๋์์ด ๋์ด ์์ต๋๋ค. ์ด๋ฌํ ์ทจ์ฝ์ ์ ์
์ฑ ์ฝ๋๊ฐ ์์์ ๋ฉ๋ชจ๋ฆฌ ์์น๋ฅผ ์ฝ์ ์ ์๊ฒ ํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ์ด๋ฌํ ์ํ์ ์ํํ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ๋ ์ฌ์ดํธ ๊ฒฉ๋ฆฌ(Site Isolation) ๋ฐ ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ์ ์ฑ
(CORP), ๊ต์ฐจ ์ถ์ฒ ์คํ๋ ์ ์ฑ
(COOP)๊ณผ ๊ฐ์ ๋ค์ํ ๋ณด์ ์กฐ์น๋ฅผ ๊ตฌํํ์ต๋๋ค.
SharedArrayBuffer๋ฅผ ์ฌ์ฉํ ๋๋ ์ฌ์ดํธ ๊ฒฉ๋ฆฌ๋ฅผ ํ์ฑํํ๊ธฐ ์ํด ์น ์๋ฒ๊ฐ ์ ์ ํ HTTP ํค๋๋ฅผ ๋ณด๋ด๋๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ด ํ์์ ์
๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก Cross-Origin-Opener-Policy(COOP) ๋ฐ Cross-Origin-Embedder-Policy(COEP) ํค๋๋ฅผ ์ค์ ํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ ์ ํ๊ฒ ๊ตฌ์ฑ๋ ํค๋๋ ์น์ฌ์ดํธ๊ฐ ๋ค๋ฅธ ์น์ฌ์ดํธ๋ก๋ถํฐ ๊ฒฉ๋ฆฌ๋๋๋ก ๋ณด์ฅํ์ฌ ์คํํฐ์ ์ ์ฌํ ๊ณต๊ฒฉ์ ์ํ์ ์ค์
๋๋ค.
SharedArrayBuffer์ Atomics์ ๋์
SharedArrayBuffer์ Atomics๋ ๊ฐ๋ ฅํ ๋์์ฑ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, ๋ณต์ก์ฑ๊ณผ ์ ์ฌ์ ์ธ ๋ณด์ ์ํ๋ ๋ฐ๋ฆ
๋๋ค. ์ฌ์ฉ ์ฌ๋ก์ ๋ฐ๋ผ ๋ ๊ฐ๋จํ๊ณ ์์ ํ ๋์์ด ์์ ์ ์์ต๋๋ค.
- ๋ฉ์์ง ์ ๋ฌ: ์น ์์ปค ๋๋ Node.js ์์ปค ์ค๋ ๋์ ๋ฉ์์ง ์ ๋ฌ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋์์ฑ์ ๋ํ ๋ ์์ ํ ๋์์ ๋๋ค. ์ค๋ ๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํด์ผ ํ ์๋ ์์ง๋ง, ๋ฐ์ดํฐ ๊ฒฝ์ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์์์ ์ํ์ ์ ๊ฑฐํฉ๋๋ค.
- ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ: ํ๋ผ๋ฏธ์ค(promises) ๋ฐ async/await์ ๊ฐ์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ ์ ์ข ์ข ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ์์กดํ์ง ์๊ณ ๋์์ฑ์ ๋ฌ์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ์ ์ ์ผ๋ฐ์ ์ผ๋ก ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋์์ฑ๋ณด๋ค ์ดํดํ๊ณ ๋๋ฒ๊น ํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค.
- WebAssembly: WebAssembly(Wasm)๋ ๊ฑฐ์ ๋ค์ดํฐ๋ธ ์๋๋ก ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํ ์๋๋ฐ์ค ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค. ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ๋ณ๋์ ์ค๋ ๋๋ก ์คํ๋ก๋ํ๊ณ ๋ฉ์์ง ์ ๋ฌ์ ํตํด ๋ฉ์ธ ์ค๋ ๋์ ํต์ ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฌ์ฉ ์ฌ๋ก ๋ฐ ์ค์ ์ ํ๋ฆฌ์ผ์ด์
SharedArrayBuffer์ Atomics๋ ๋ค์๊ณผ ๊ฐ์ ์ ํ์ ์ ํ๋ฆฌ์ผ์ด์
์ ํนํ ์ ํฉํฉ๋๋ค:
- ์ด๋ฏธ์ง ๋ฐ ๋น๋์ค ์ฒ๋ฆฌ: ํฐ ์ด๋ฏธ์ง๋ ๋น๋์ค๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๊ณ์ฐ ์ง์ฝ์ ์ผ ์ ์์ต๋๋ค.
SharedArrayBuffer๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์ด๋ฏธ์ง๋ ๋น๋์ค์ ๋ค๋ฅธ ๋ถ๋ถ์์ ๋์์ ์์ ํ์ฌ ์ฒ๋ฆฌ ์๊ฐ์ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค. - ์ค๋์ค ์ฒ๋ฆฌ: ๋ฏน์ฑ, ํํฐ๋ง, ์ธ์ฝ๋ฉ๊ณผ ๊ฐ์ ์ค๋์ค ์ฒ๋ฆฌ ์์
์
SharedArrayBuffer๋ฅผ ์ฌ์ฉํ ๋ณ๋ ฌ ์คํ์ ์ด์ ์ ๋๋ฆด ์ ์์ต๋๋ค. - ๊ณผํ ์ปดํจํ
: ๊ณผํ ์๋ฎฌ๋ ์ด์
๋ฐ ๊ณ์ฐ์ ์ข
์ข
๋๋์ ๋ฐ์ดํฐ์ ๋ณต์กํ ์๊ณ ๋ฆฌ์ฆ์ ํฌํจํฉ๋๋ค.
SharedArrayBuffer๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์ค๋ ๋์ ์์ ๋ถํ๋ฅผ ๋ถ์ฐ์์ผ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. - ๊ฒ์ ๊ฐ๋ฐ: ๊ฒ์ ๊ฐ๋ฐ์ ์ข
์ข
๋ณต์กํ ์๋ฎฌ๋ ์ด์
๋ฐ ๋ ๋๋ง ์์
์ ํฌํจํฉ๋๋ค.
SharedArrayBuffer๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์์ ์ ๋ณ๋ ฌํํ์ฌ ํ๋ ์ ์๋์ ๋ฐ์์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. - ๋ฐ์ดํฐ ๋ถ์: ๋์ฉ๋ ๋ฐ์ดํฐ์
์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
SharedArrayBuffer๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์ค๋ ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฐ์์ผ ๋ถ์ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋๊ท๋ชจ ์๊ณ์ด ๋ฐ์ดํฐ์ ๋ํ ๊ณ์ฐ์ด ์ํ๋๋ ๊ธ์ต ์์ฅ ๋ฐ์ดํฐ ๋ถ์์ด ์์ต๋๋ค.
๊ตญ์ ์ ์ธ ์์
๋ค์์ SharedArrayBuffer์ Atomics๊ฐ ๋ค์ํ ๊ตญ์ ์ ๋งฅ๋ฝ์์ ์ด๋ป๊ฒ ์ ์ฉ๋ ์ ์๋์ง์ ๋ํ ์ด๋ก ์ ์ธ ์์์
๋๋ค:
- ๊ธ์ต ๋ชจ๋ธ๋ง (๊ธ๋ก๋ฒ ๊ธ์ต): ๊ธ๋ก๋ฒ ๊ธ์ต ํ์ฌ๋
SharedArrayBuffer๋ฅผ ์ฌ์ฉํ์ฌ ํฌํธํด๋ฆฌ์ค ์ํ ๋ถ์์ด๋ ํ์ ์ํ ๊ฐ๊ฒฉ ์ฑ ์ ๊ณผ ๊ฐ์ ๋ณต์กํ ๊ธ์ต ๋ชจ๋ธ์ ๊ณ์ฐ์ ๊ฐ์ํํ ์ ์์ต๋๋ค. ๋ค์ํ ๊ตญ์ ์์ฅ์ ๋ฐ์ดํฐ(์: ๋์ฟ ์ฆ๊ถ ๊ฑฐ๋์์ ์ฃผ๊ฐ, ํ์จ, ์ฑ๊ถ ์์ต๋ฅ )๋ฅผSharedArrayBuffer์ ๋ก๋ํ์ฌ ์ฌ๋ฌ ์ค๋ ๋์์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. - ์ธ์ด ๋ฒ์ญ (๋ค๊ตญ์ด ์ง์): ์ค์๊ฐ ์ธ์ด ๋ฒ์ญ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ํ์ฌ๋
SharedArrayBuffer๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ์ญ ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋ฌธ์๋ ๋ํ์ ๋ค๋ฅธ ๋ถ๋ถ์์ ๋์์ ์์ ํ์ฌ ๋ฒ์ญ ํ๋ก์ธ์ค์ ์ง์ฐ ์๊ฐ์ ์ค์ผ ์ ์์ต๋๋ค. ์ด๋ ์ ์ธ๊ณ์ ๋ค์ํ ์ธ์ด๋ฅผ ์ง์ํ๋ ์ฝ์ผํฐ์์ ํนํ ์ ์ฉํฉ๋๋ค. - ๊ธฐํ ๋ชจ๋ธ๋ง (ํ๊ฒฝ ๊ณผํ): ๊ธฐํ ๋ณํ๋ฅผ ์ฐ๊ตฌํ๋ ๊ณผํ์๋ค์
SharedArrayBuffer๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐํ ๋ชจ๋ธ์ ์คํ์ ๊ฐ์ํํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ชจ๋ธ์ ์ข ์ข ์๋นํ ๊ณ์ฐ ์์์ ํ์๋ก ํ๋ ๋ณต์กํ ์๋ฎฌ๋ ์ด์ ์ ํฌํจํฉ๋๋ค. ์์ ๋ถํ๋ฅผ ์ฌ๋ฌ ์ค๋ ๋์ ๋ถ์ฐ์ํด์ผ๋ก์จ ์ฐ๊ตฌ์๋ค์ ์๋ฎฌ๋ ์ด์ ์ ์คํํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ค์ผ ์ ์์ต๋๋ค. ๋ชจ๋ธ ๋งค๊ฐ๋ณ์์ ์ถ๋ ฅ ๋ฐ์ดํฐ๋ ์ฌ๋ฌ ๊ตญ๊ฐ์ ์์นํ ๊ณ ์ฑ๋ฅ ์ปดํจํ ํด๋ฌ์คํฐ์์ ์คํ๋๋ ํ๋ก์ธ์ค ๊ฐ์ `SharedArrayBuffer`๋ฅผ ํตํด ๊ณต์ ๋ ์ ์์ต๋๋ค. - ์ ์์๊ฑฐ๋ ์ถ์ฒ ์์ง (๊ธ๋ก๋ฒ ์๋งค): ๊ธ๋ก๋ฒ ์ ์์๊ฑฐ๋ ํ์ฌ๋
SharedArrayBuffer๋ฅผ ์ฌ์ฉํ์ฌ ์ถ์ฒ ์์ง์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์์ง์ ์ฌ์ฉ์ ๋ฐ์ดํฐ, ์ ํ ๋ฐ์ดํฐ ๋ฐ ๊ตฌ๋งค ๋ด์ญ์SharedArrayBuffer์ ๋ก๋ํ๊ณ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ์ฌ ๊ฐ์ธํ๋ ์ถ์ฒ์ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ ์ ๋ฝ, ์์์, ๋ถ๋ฏธ ๋ฑ ์ฌ๋ฌ ์ง์ญ์ ๋ฐฐํฌ๋์ด ์ ์ธ๊ณ ๊ณ ๊ฐ์๊ฒ ๋ ๋น ๋ฅด๊ณ ๊ด๋ จ์ฑ ๋์ ์ถ์ฒ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
SharedArrayBuffer์ Atomics API๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋์์ฑ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ๊ณผ ์์์ ์ฐ์ฐ์ ์๋งจํฑ์ ์ดํดํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ํจ์จ์ ์ด๊ณ ์์ ํ ๋์์ฑ ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ๋๊ตฌ๋ฅผ ์ ์คํ๊ฒ ์ฌ์ฉํ๊ณ ์ ์ฌ์ ์ธ ๋ณด์ ์ํ์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ ์ ํ๊ฒ ์ฌ์ฉ๋ ๋ SharedArrayBuffer์ Atomics๋ ํนํ ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์
์์ ์น ์ ํ๋ฆฌ์ผ์ด์
๊ณผ Node.js ํ๊ฒฝ์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๋์์ ๊ณ ๋ คํ๊ณ , ๋ณด์์ ์ฐ์ ์ํ๋ฉฐ, ๋์์ฑ ์ฝ๋์ ์ ํ์ฑ๊ณผ ๊ฒฌ๊ณ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ฒ ์ ํ ํ
์คํธํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.