๋์์ฑ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์ ์ํ ์ค๋ ๋-์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ฐ ๋๊ธฐํ ๊ธฐ๋ฒ์ ํ์ํ์ฌ, ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ฑ๋ฅ์ ๋ณด์ฅํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋์์ฑ ์ปฌ๋ ์ ๋๊ธฐํ: ์ค๋ ๋-์์ ๊ตฌ์กฐ ์กฐ์
์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์น ์์ปค ๋ฐ ๋ค๋ฅธ ๋์์ฑ ํจ๋ฌ๋ค์์ ๋์ ์ผ๋ก ๋จ์ผ ์ค๋ ๋ ์คํ์ ๋์ด ๋ฐ์ ํจ์ ๋ฐ๋ผ, ๊ณต์ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๊ด๋ฆฌ๋ ์ ์ ๋ ๋ณต์กํด์ง๊ณ ์์ต๋๋ค. ๋์์ฑ ํ๊ฒฝ์์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๊ณ ๊ฒฝ์ ์กฐ๊ฑด์ ๋ฐฉ์งํ๋ ค๋ฉด ๊ฐ๋ ฅํ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ๊ณผ ์ค๋ ๋-์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ํ์ํฉ๋๋ค. ์ด ๊ธ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์์ฑ ์ปฌ๋ ์ ๋๊ธฐํ์ ๋ณต์ก์ฑ์ ๊น์ด ํ๊ณ ๋ค์ด, ์ ๋ขฐํ ์ ์๊ณ ์ฑ๋ฅ ์ข์ ๋ค์ค ์ค๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๋ค์ํ ๊ธฐ๋ฒ๊ณผ ๊ณ ๋ ค ์ฌํญ์ ํ์ํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋์์ฑ์ ์ด๋ ค์ ์ดํดํ๊ธฐ
์ ํต์ ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ๋ ์น ๋ธ๋ผ์ฐ์ ๋ด ๋จ์ผ ์ค๋ ๋์์ ์ฃผ๋ก ์คํ๋์์ต๋๋ค. ์ด๋ ํ ๋ฒ์ ํ๋์ ์ฝ๋ ์กฐ๊ฐ๋ง์ด ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์์๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ณ์ฐ ์ง์ฝ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฑ์ฅ๊ณผ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฒ๋ฆฌ์ ํ์์ฑ์ผ๋ก ์ธํด ์น ์์ปค๊ฐ ๋์ ๋์๊ณ , ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ง์ ํ ๋์์ฑ์ ๊ฐ๋ฅํ๊ฒ ํ์ต๋๋ค.
์ฌ๋ฌ ์ค๋ ๋(์น ์์ปค)๊ฐ ๊ณต์ ๋ฐ์ดํฐ์ ๋์์ ์ ๊ทผํ๊ณ ์์ ํ ๋, ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค:
- ๊ฒฝ์ ์กฐ๊ฑด(Race Conditions): ์ฌ๋ฌ ์ค๋ ๋์ ์์ธก ๋ถ๊ฐ๋ฅํ ์คํ ์์์ ๋ฐ๋ผ ๊ณ์ฐ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ๋ ๋ฐ์ํฉ๋๋ค. ์ด๋ ์๊ธฐ์น ์๊ณ ์ผ๊ด์ฑ ์๋ ๋ฐ์ดํฐ ์ํ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์์(Data Corruption): ์ ์ ํ ๋๊ธฐํ ์์ด ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋์์ ์์ ํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์์๋๊ฑฐ๋ ์ผ๊ด์ฑ์ด ์์ด์ง ์ ์์ต๋๋ค.
- ๊ต์ฐฉ ์ํ(Deadlocks): ๋ ์ด์์ ์ค๋ ๋๊ฐ ์๋ก๊ฐ ์์์ ํด์ ํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ๋ฌด๊ธฐํ์ผ๋ก ์ฐจ๋จ๋ ๋ ๋ฐ์ํฉ๋๋ค.
- ๊ธฐ์ ์ํ(Starvation): ํน์ ์ค๋ ๋๊ฐ ๊ณต์ ์์์ ๋ํ ์ ๊ทผ์ ๋ฐ๋ณต์ ์ผ๋ก ๊ฑฐ๋ถ๋นํ์ฌ ์งํํ์ง ๋ชปํ ๋ ๋ฐ์ํฉ๋๋ค.
ํต์ฌ ๊ฐ๋ : Atomics์ SharedArrayBuffer
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ๋ ๊ฐ์ง ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์ฑ ์์๋ฅผ ์ ๊ณตํฉ๋๋ค:
- SharedArrayBuffer: ์ฌ๋ฌ ์น ์์ปค๊ฐ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค. ์ด๋ ์ค๋ ๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ณต์ ํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
- Atomics: ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์์น์์ ์ฝ๊ธฐ, ์ฐ๊ธฐ ๋ฐ ์ ๋ฐ์ดํธ ์์ ์ ์์์ ์ผ๋ก ์ํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ์์์ ์ฐ์ฐ ์งํฉ์ ๋๋ค. ์์์ ์ฐ์ฐ์ ํด๋น ์ฐ์ฐ์ด ๋จ์ผํ๊ณ ๋ถํ ํ ์ ์๋ ๋จ์๋ก ์ํ๋จ์ ๋ณด์ฅํ์ฌ ๊ฒฝ์ ์กฐ๊ฑด์ ๋ฐฉ์งํ๊ณ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
์์: Atomics๋ฅผ ์ฌ์ฉํ ๊ณต์ ์นด์ดํฐ ์ฆ๊ฐ
์ฌ๋ฌ ์น ์์ปค๊ฐ ๊ณต์ ์นด์ดํฐ๋ฅผ ์ฆ๊ฐ์์ผ์ผ ํ๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ด ์๋ค. ์์์ ์ฐ์ฐ์ด ์์ผ๋ฉด ๋ค์ ์ฝ๋๋ ๊ฒฝ์ ์กฐ๊ฑด์ ์ ๋ฐํ ์ ์์ต๋๋ค:
// SharedArrayBuffer containing the counter
const sharedBuffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);
const counter = new Int32Array(sharedBuffer);
// Worker code (executed by multiple workers)
counter[0]++; // Non-atomic operation - prone to race conditions
Atomics.add()
๋ฅผ ์ฌ์ฉํ๋ฉด ์ฆ๊ฐ ์ฐ์ฐ์ด ์์์ ์์ ๋ณด์ฅํฉ๋๋ค:
// SharedArrayBuffer containing the counter
const sharedBuffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);
const counter = new Int32Array(sharedBuffer);
// Worker code (executed by multiple workers)
Atomics.add(counter, 0, 1); // Atomic increment
๋์์ฑ ์ปฌ๋ ์ ์ ์ํ ๋๊ธฐํ ๊ธฐ๋ฒ
์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ณต์ ์ปฌ๋ ์ (๋ฐฐ์ด, ๊ฐ์ฒด, ๋งต ๋ฑ)์ ๋ํ ๋์ ์ ๊ทผ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ๋ฌ ๋๊ธฐํ ๊ธฐ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
1. ๋ฎคํ ์ค (์ํธ ๋ฐฐ์ ์ ๊ธ)
๋ฎคํ ์ค๋ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ๊ณต์ ์์์ ์ ๊ทผํ ์ ์๋๋ก ํ์ฉํ๋ ๋๊ธฐํ ๊ธฐ๋ณธ ์์์ ๋๋ค. ์ค๋ ๋๊ฐ ๋ฎคํ ์ค๋ฅผ ํ๋ํ๋ฉด ๋ณดํธ๋ ์์์ ๋ํ ๋ ์ ์ ์ธ ์ ๊ทผ ๊ถํ์ ์ป์ต๋๋ค. ๋์ผํ ๋ฎคํ ์ค๋ฅผ ํ๋ํ๋ ค๋ ๋ค๋ฅธ ์ค๋ ๋๋ ์์ ์ค๋ ๋๊ฐ ์ด๋ฅผ ํด์ ํ ๋๊น์ง ์ฐจ๋จ๋ฉ๋๋ค.
Atomics๋ฅผ ์ฌ์ฉํ ๊ตฌํ:
class Mutex {
constructor() {
this.lock = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));
}
acquire() {
while (Atomics.compareExchange(this.lock, 0, 0, 1) !== 0) {
// Spin-wait (yield the thread if necessary to avoid excessive CPU usage)
Atomics.wait(this.lock, 0, 1, 10); // Wait with a timeout
}
}
release() {
Atomics.store(this.lock, 0, 0);
Atomics.notify(this.lock, 0, 1); // Wake up a waiting thread
}
}
// Example Usage:
const mutex = new Mutex();
const sharedArray = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 10));
// Worker 1
mutex.acquire();
// Critical section: access and modify sharedArray
sharedArray[0] = 10;
mutex.release();
// Worker 2
mutex.acquire();
// Critical section: access and modify sharedArray
sharedArray[1] = 20;
mutex.release();
์ค๋ช
:
Atomics.compareExchange
๋ ์ ๊ธ์ด ํ์ฌ 0์ผ ๊ฒฝ์ฐ ์์์ ์ผ๋ก 1๋ก ์ค์ ํ๋ ค๊ณ ์๋ํฉ๋๋ค. ๋ง์ฝ ์คํจํ๋ฉด(๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ด๋ฏธ ์ ๊ธ์ ๋ณด์ ํ๊ณ ์์), ์ค๋ ๋๋ ์ ๊ธ์ด ํด์ ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ์คํํฉ๋๋ค. Atomics.wait
๋ Atomics.notify
๊ฐ ๊นจ์ธ ๋๊น์ง ์ค๋ ๋๋ฅผ ํจ์จ์ ์ผ๋ก ์ฐจ๋จํฉ๋๋ค.
2. ์ธ๋งํฌ์ด
์ธ๋งํฌ์ด๋ ์ ํ๋ ์์ ์ค๋ ๋๊ฐ ๊ณต์ ์์์ ๋์์ ์ ๊ทผํ ์ ์๋๋ก ํ์ฉํ๋ ๋ฎคํ ์ค์ ์ผ๋ฐํ๋ ํํ์ ๋๋ค. ์ธ๋งํฌ์ด๋ ์ฌ์ฉ ๊ฐ๋ฅํ ํ๊ฐ(permit) ์๋ฅผ ๋ํ๋ด๋ ์นด์ดํฐ๋ฅผ ์ ์งํฉ๋๋ค. ์ค๋ ๋๋ ์นด์ดํฐ๋ฅผ ๊ฐ์์์ผ ํ๊ฐ๋ฅผ ํ๋ํ๊ณ , ์นด์ดํฐ๋ฅผ ์ฆ๊ฐ์์ผ ํ๊ฐ๋ฅผ ํด์ ํ ์ ์์ต๋๋ค. ์นด์ดํฐ๊ฐ 0์ด ๋๋ฉด ํ๊ฐ๋ฅผ ํ๋ํ๋ ค๋ ์ค๋ ๋๋ ํ๊ฐ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํด์ง ๋๊น์ง ์ฐจ๋จ๋ฉ๋๋ค.
class Semaphore {
constructor(permits) {
this.permits = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));
Atomics.store(this.permits, 0, permits);
}
acquire() {
while (true) {
const currentPermits = Atomics.load(this.permits, 0);
if (currentPermits > 0) {
if (Atomics.compareExchange(this.permits, 0, currentPermits, currentPermits - 1) === currentPermits) {
return;
}
} else {
Atomics.wait(this.permits, 0, 0, 10);
}
}
}
release() {
Atomics.add(this.permits, 0, 1);
Atomics.notify(this.permits, 0, 1);
}
}
// Example Usage:
const semaphore = new Semaphore(3); // Allow 3 concurrent threads
const sharedResource = [];
// Worker 1
semaphore.acquire();
// Access and modify sharedResource
sharedResource.push("Worker 1");
semaphore.release();
// Worker 2
semaphore.acquire();
// Access and modify sharedResource
sharedResource.push("Worker 2");
semaphore.release();
3. ์ฝ๊ธฐ-์ฐ๊ธฐ ์ ๊ธ
์ฝ๊ธฐ-์ฐ๊ธฐ ์ ๊ธ์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ณต์ ์์์ ๋์์ ์ฝ๋ ๊ฒ์ ํ์ฉํ์ง๋ง, ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ์์์ ์ธ ์ ์๋๋ก ํ์ฉํฉ๋๋ค. ์ด๋ ์ฐ๊ธฐ๋ณด๋ค ์ฝ๊ธฐ๊ฐ ํจ์ฌ ๋น๋ฒํ ๋ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๊ตฌํ: `Atomics`๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ธฐ-์ฐ๊ธฐ ์ ๊ธ์ ๊ตฌํํ๋ ๊ฒ์ ๋จ์ํ ๋ฎคํ ์ค๋ ์ธ๋งํฌ์ด๋ณด๋ค ๋ ๋ณต์กํฉ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ ์(reader)์ ์ ์(writer)๋ฅผ ์ํ ๋ณ๋์ ์นด์ดํฐ๋ฅผ ์ ์งํ๊ณ ์์์ ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ ์ ๊ทผ ์ ์ด๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
๊ฐ์ํ๋ ๊ฐ๋ ์ ์์ (์ ์ฒด ๊ตฌํ ์๋):
class ReadWriteLock {
constructor() {
this.readers = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));
this.writer = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));
}
readLock() {
// Acquire read lock (implementation omitted for brevity)
// Must ensure exclusive access with writer
}
readUnlock() {
// Release read lock (implementation omitted for brevity)
}
writeLock() {
// Acquire write lock (implementation omitted for brevity)
// Must ensure exclusive access with all readers and other writers
}
writeUnlock() {
// Release write lock (implementation omitted for brevity)
}
}
์ฐธ๊ณ : `ReadWriteLock`์ ์ ์ฒด ๊ตฌํ์ ์์์ ์ฐ์ฐ๊ณผ ์ ์ฌ์ ์ธ wait/notify ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ๋ ์์ ์ ์ ์นด์ดํฐ๋ฅผ ์ ์คํ๊ฒ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. `threads.js`์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ ๊ฒฌ๊ณ ํ๊ณ ํจ์จ์ ์ธ ๊ตฌํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
4. ๋์์ฑ ๋ฐ์ดํฐ ๊ตฌ์กฐ
์ผ๋ฐ์ ์ธ ๋๊ธฐํ ๊ธฐ๋ณธ ์์์๋ง ์์กดํ๊ธฐ๋ณด๋ค๋, ์ค๋ ๋-์์ ํ๋๋ก ์ค๊ณ๋ ํน์ํ ๋์์ฑ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์. ์ด๋ฌํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์ข ์ข ๋ด๋ถ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ํตํฉํ์ฌ ๋์์ฑ ํ๊ฒฝ์์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๊ณ ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ค์ดํฐ๋ธ, ๋ด์ฅ ๋์์ฑ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ ํ์ ์ ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ: `immutable.js`๋ `immer`์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์กฐ์์ ๋ ์์ธก ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ณ , ํนํ ์์ปค ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ์ง์ ์ ์ธ ๋ณ๊ฒฝ์ ํผํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์. ์๋ฐํ ๋งํด *๋์์ฑ* ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์๋์ง๋ง, ๊ณต์ ์ํ๋ฅผ ์ง์ ์์ ํ๋ ๋์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ด ๊ฒฝ์ ์กฐ๊ฑด์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์์: Immutable.js
import { Map } from 'immutable';
// Shared data
let sharedMap = Map({
count: 0,
data: 'Initial value'
});
// Worker 1
const updatedMap1 = sharedMap.set('count', sharedMap.get('count') + 1);
// Worker 2
const updatedMap2 = sharedMap.set('data', 'Updated value');
//sharedMap remains untouched and safe. To access the results, each worker will need to send back the updatedMap instance and then you can merge these on the main thread as necessary.
๋์์ฑ ์ปฌ๋ ์ ๋๊ธฐํ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
๋์์ฑ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ขฐ์ฑ๊ณผ ์ฑ๋ฅ์ ๋ณด์ฅํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ญ์์ค:
- ๊ณต์ ์ํ ์ต์ํ: ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณต์ ์ํ๊ฐ ์ ์์๋ก ๋๊ธฐํ ํ์์ฑ๋ ์ค์ด๋ญ๋๋ค. ์์ปค ๊ฐ์ ๊ณต์ ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ต์ํํ๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๊ณํ์ญ์์ค. ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ์์กดํ๊ธฐ๋ณด๋ค๋ ๋ฉ์์ง ์ ๋ฌ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํต์ ํ์ญ์์ค.
- ์์์ ์ฐ์ฐ ์ฌ์ฉ: ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ก ์์ ํ ๋๋ ํญ์ ์์์ ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ์ญ์์ค.
- ์ฌ๋ฐ๋ฅธ ๋๊ธฐํ ๊ธฐ๋ณธ ์์ ์ ํ: ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ์ ์ ํ ๋๊ธฐํ ๊ธฐ๋ณธ ์์๋ฅผ ์ ํํ์ญ์์ค. ๋ฎคํ ์ค๋ ๊ณต์ ์์์ ๋ํ ๋ ์ ์ ์ ๊ทผ์ ๋ณดํธํ๋ ๋ฐ ์ ํฉํ๋ฉฐ, ์ธ๋งํฌ์ด๋ ์ ํ๋ ์์ ์์์ ๋ํ ๋์ ์ ๊ทผ์ ์ ์ดํ๋ ๋ฐ ๋ ์ข์ต๋๋ค. ์ฝ๊ธฐ-์ฐ๊ธฐ ์ ๊ธ์ ์ฐ๊ธฐ๋ณด๋ค ์ฝ๊ธฐ๊ฐ ํจ์ฌ ๋น๋ฒํ ๋ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๊ต์ฐฉ ์ํ ๋ฐฉ์ง: ๊ต์ฐฉ ์ํ๋ฅผ ํผํ๊ธฐ ์ํด ๋๊ธฐํ ๋ก์ง์ ์ ์คํ๊ฒ ์ค๊ณํ์ญ์์ค. ์ค๋ ๋๊ฐ ์ผ๊ด๋ ์์๋ก ์ ๊ธ์ ํ๋ํ๊ณ ํด์ ํ๋๋ก ํ์ญ์์ค. ์ค๋ ๋๊ฐ ๋ฌด๊ธฐํ์ผ๋ก ์ฐจ๋จ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํ์์์์ ์ฌ์ฉํ์ญ์์ค.
- ์ฑ๋ฅ ์ํฅ ๊ณ ๋ ค: ๋๊ธฐํ๋ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ์๊ณ ์์ญ(critical section)์์ ์์๋๋ ์๊ฐ์ ์ต์ํํ๊ณ ๋ถํ์ํ ๋๊ธฐํ๋ฅผ ํผํ์ญ์์ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋กํ์ผ๋งํ์ฌ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ์ญ์์ค.
- ์ฒ ์ ํ ํ ์คํธ: ๊ฒฝ์ ์กฐ๊ฑด ๋ฐ ๊ธฐํ ๋์์ฑ ๊ด๋ จ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ์์ ํ๊ธฐ ์ํด ๋์์ฑ ์ฝ๋๋ฅผ ์ฒ ์ ํ ํ ์คํธํ์ญ์์ค. ์ ์ฌ์ ์ธ ๋์์ฑ ๋ฌธ์ ๋ฅผ ๊ฐ์งํ๊ธฐ ์ํด ์ค๋ ๋ ์ธ๋ํ์ด์ ์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- ๋๊ธฐํ ์ ๋ต ๋ฌธ์ํ: ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ์ดํดํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฝ๋๋ก ๋๊ธฐํ ์ ๋ต์ ๋ช ํํ๊ฒ ๋ฌธ์ํํ์ญ์์ค.
- ์คํ ๋ฝ ๋ฐฉ์ง: ์ค๋ ๋๊ฐ ๋ฃจํ์์ ์ ๊ธ ๋ณ์๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํ์ธํ๋ ์คํ ๋ฝ์ ์๋นํ CPU ๋ฆฌ์์ค๋ฅผ ์๋นํ ์ ์์ต๋๋ค. `Atomics.wait`๋ฅผ ์ฌ์ฉํ์ฌ ์์์ด ์ฌ์ฉ ๊ฐ๋ฅํด์ง ๋๊น์ง ์ค๋ ๋๋ฅผ ํจ์จ์ ์ผ๋ก ์ฐจ๋จํ์ญ์์ค.
์ค์ฉ์ ์ธ ์์ ๋ฐ ์ฌ์ฉ ์ฌ๋ก
1. ์ด๋ฏธ์ง ์ฒ๋ฆฌ: ์ฑ๋ฅ ํฅ์์ ์ํด ์ด๋ฏธ์ง ์ฒ๋ฆฌ ์์ ์ ์ฌ๋ฌ ์น ์์ปค์ ๋ถ์ฐํฉ๋๋ค. ๊ฐ ์์ปค๋ ์ด๋ฏธ์ง์ ์ผ๋ถ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ๊ฒฐ๊ณผ๋ ๋ฉ์ธ ์ค๋ ๋์์ ๊ฒฐํฉ๋ ์ ์์ต๋๋ค. SharedArrayBuffer๋ฅผ ์ฌ์ฉํ์ฌ ์์ปค ๊ฐ์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ณต์ ํ ์ ์์ต๋๋ค.
2. ๋ฐ์ดํฐ ๋ถ์: ์น ์์ปค๋ฅผ ์ฌ์ฉํ์ฌ ๋ณต์กํ ๋ฐ์ดํฐ ๋ถ์์ ๋ณ๋ ฌ๋ก ์ํํฉ๋๋ค. ๊ฐ ์์ปค๋ ๋ฐ์ดํฐ์ ์ผ๋ถ๋ฅผ ๋ถ์ํ๊ณ , ๊ฒฐ๊ณผ๋ ๋ฉ์ธ ์ค๋ ๋์์ ์ง๊ณ๋ ์ ์์ต๋๋ค. ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ฒฐํฉ๋๋๋ก ํฉ๋๋ค.
3. ๊ฒ์ ๊ฐ๋ฐ: ๊ณ์ฐ ์ง์ฝ์ ์ธ ๊ฒ์ ๋ก์ง์ ์น ์์ปค๋ก ์คํ๋ก๋ํ์ฌ ํ๋ ์ ์๋๋ฅผ ํฅ์์ํต๋๋ค. ๋๊ธฐํ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ ์ด์ด ์์น ๋ฐ ๊ฐ์ฒด ์์ฑ๊ณผ ๊ฐ์ ๊ณต์ ๊ฒ์ ์ํ์ ๋ํ ์ ๊ทผ์ ๊ด๋ฆฌํฉ๋๋ค.
4. ๊ณผํ ์๋ฎฌ๋ ์ด์ : ์น ์์ปค๋ฅผ ์ฌ์ฉํ์ฌ ๊ณผํ ์๋ฎฌ๋ ์ด์ ์ ๋ณ๋ ฌ๋ก ์คํํฉ๋๋ค. ๊ฐ ์์ปค๋ ์์คํ ์ ์ผ๋ถ๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๊ณ , ๊ฒฐ๊ณผ๋ ์์ ํ ์๋ฎฌ๋ ์ด์ ์ ์์ฑํ๊ธฐ ์ํด ๊ฒฐํฉ๋ ์ ์์ต๋๋ค. ๋๊ธฐํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๊ฐ ์ ํํ๊ฒ ๊ฒฐํฉ๋๋๋ก ํฉ๋๋ค.
SharedArrayBuffer์ ๋์
SharedArrayBuffer์ Atomics๋ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ์ง๋ง, ๋ณต์ก์ฑ๊ณผ ์ ์ฌ์ ์ธ ๋ณด์ ์ํ๋ ๋๋ฐํฉ๋๋ค. ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋์์ฑ์ ๋์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ฉ์์ง ์ ๋ฌ: ์น ์์ปค๋ ๋ฉ์์ง ์ ๋ฌ์ ์ฌ์ฉํ์ฌ ๋ฉ์ธ ์ค๋ ๋ ๋ฐ ๋ค๋ฅธ ์์ปค์ ํต์ ํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ฐ ๋๊ธฐํ์ ํ์์ฑ์ ํผํ์ง๋ง, ๋์ฉ๋ ๋ฐ์ดํฐ ์ ์ก์๋ ๋ ํจ์จ์ ์ผ ์ ์์ต๋๋ค.
- ์๋น์ค ์์ปค: ์๋น์ค ์์ปค๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ์ํํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์บ์ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ฃผ๋ก ๋์์ฑ์ ์ํด ์ค๊ณ๋์ง๋ ์์์ง๋ง, ๋ฉ์ธ ์ค๋ ๋์์ ์์ ์ ์คํ๋ก๋ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- OffscreenCanvas: ์น ์์ปค์์ ๋ ๋๋ง ์์ ์ ํ์ฉํ์ฌ ๋ณต์กํ ๊ทธ๋ํฝ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- WebAssembly (WASM): WASM์ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ์ธ์ด(์: C++, Rust)๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ์คํํ ์ ์์ต๋๋ค. WASM ์ฝ๋๋ ๋์์ฑ ๋ฐ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ํ๋๋ก ์ปดํ์ผ๋ ์ ์์ด ๋์์ฑ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌํํ๋ ๋์์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
- ์กํฐ ๋ชจ๋ธ ๊ตฌํ: ๋์์ฑ์ ์ํ ์กํฐ ๋ชจ๋ธ์ ์ ๊ณตํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ํด ๋ณด์ธ์. ์กํฐ ๋ชจ๋ธ์ ์ํ์ ๋์์ ๋ฉ์์ง ์ ๋ฌ์ ํตํด ํต์ ํ๋ ์กํฐ ๋ด์ ์บก์ํํ์ฌ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ๋จ์ํํฉ๋๋ค.
๋ณด์ ๊ณ ๋ ค ์ฌํญ
SharedArrayBuffer์ Atomics๋ ์คํํฐ(Spectre) ๋ฐ ๋ฉํธ๋ค์ด(Meltdown)๊ณผ ๊ฐ์ ์ ์ฌ์ ์ธ ๋ณด์ ์ทจ์ฝ์ ์ ์ผ๊ธฐํฉ๋๋ค. ์ด๋ฌํ ์ทจ์ฝ์ ์ ์ถ์ธก ์คํ์ ์ ์ฉํ์ฌ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ถํฉ๋๋ค. ์ด๋ฌํ ์ํ์ ์ํํ๋ ค๋ฉด ๋ธ๋ผ์ฐ์ ์ ์ด์ ์ฒด์ ๊ฐ ์ต์ ๋ณด์ ํจ์น๋ก ์ ๋ฐ์ดํธ๋์๋์ง ํ์ธํ์ญ์์ค. ๊ต์ฐจ ์ถ์ฒ ๋ถ๋ฆฌ(cross-origin isolation)๋ฅผ ์ฌ์ฉํ์ฌ ๊ต์ฐจ ์ฌ์ดํธ ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณดํธํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ๊ต์ฐจ ์ถ์ฒ ๋ถ๋ฆฌ๋ฅผ ์ํด์๋ `Cross-Origin-Opener-Policy` ๋ฐ `Cross-Origin-Embedder-Policy` HTTP ํค๋๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ์ ๋์์ฑ ์ปฌ๋ ์ ๋๊ธฐํ๋ ์ฑ๋ฅ ์ข๊ณ ์ ๋ขฐํ ์ ์๋ ๋ค์ค ์ค๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๋ณต์กํ์ง๋ง ํ์์ ์ธ ์ฃผ์ ์ ๋๋ค. ๋์์ฑ์ ์ด๋ ค์์ ์ดํดํ๊ณ ์ ์ ํ ๋๊ธฐํ ๊ธฐ๋ฒ์ ํ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋ฉํฐ์ฝ์ด ํ๋ก์ธ์์ ํ์ ํ์ฉํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ๋๊ธฐํ ๊ธฐ๋ณธ ์์, ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ฐ ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํ ์ ์คํ ๊ณ ๋ ค๋ ๊ฒฌ๊ณ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ๋์์ฑ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ๋จ์ํํ๊ณ ์ค๋ฅ ์ํ์ ์ค์ผ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์์ธ ํจํด์ ํ์ํ์ญ์์ค. ๋์์ฑ ์ฝ๋์ ์ ํ์ฑ๊ณผ ์ฑ๋ฅ์ ๋ณด์ฅํ๊ธฐ ์ํด์๋ ์ ์คํ ํ ์คํธ์ ํ๋กํ์ผ๋ง์ด ํ์์ ์ด๋ผ๋ ์ ์ ๊ธฐ์ตํ์ญ์์ค.