๋์ ๋ฐ๋ณต์๋ฅผ ์ฌ์ฉํ์ฌ JavaScript์์ ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ํ์ ๋ฐํํ์ธ์. Web Worker, SharedArrayBuffer ๋ฐ Atomics๊ฐ ๊ธ๋ก๋ฒ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๊ณ ์ฑ๋ฅ CPU ๋ฐ์ด๋ ์์ ์ ์ด๋ป๊ฒ ๊ฐ๋ฅํ๊ฒ ํ๋์ง ์์๋ณด์ธ์.
์ฑ๋ฅ ํฅ์: JavaScript ๋์ ๋ฐ๋ณต์ ๋ฐ ๋ณ๋ ฌ ์ฒ๋ฆฌ for a Global Web
ํ๋ ์น ๊ฐ๋ฐ์ ์ญ๋์ ์ธ ํ๊ฒฝ์์ ๊ธฐ๋ฅ๋ฟ๋ง ์๋๋ผ ๋ฐ์ด๋ ์ฑ๋ฅ์ ๊ฐ์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณต์กํด์ง๊ณ ๋ธ๋ผ์ฐ์ ๋ด์์ ๋์ฉ๋ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ง์ ์ฒ๋ฆฌํด์ผ ํ๋ ์๊ตฌ๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ ์ฌ๊ฐํ ๊ณผ์ ์ ์ง๋ฉดํด ์์ต๋๋ค. ์ฆ, ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ ์ง์ํค๊ฑฐ๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ํ์ํค์ง ์๊ณ CPU ์ง์ฝ์ ์ธ ์์ ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. JavaScript์ ๊ธฐ์กด ๋จ์ผ ์ค๋ ๋ ํน์ฑ์ ์ค๋ซ๋์ ๋ณ๋ชฉ ํ์์ด์์ง๋ง, ์ธ์ด ๋ฐ ๋ธ๋ผ์ฐ์ API์ ๋ฐ์ ์ผ๋ก ์ง์ ํ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ด ๋์ ๋์์ผ๋ฉฐ, ํนํ ๋์ ๋ฐ๋ณต์๋ผ๋ ๊ฐ๋ ์ ํตํด ๊ฐ๋ฅํด์ก์ต๋๋ค.
์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ JavaScript ๋์ ๋ฐ๋ณต์์ ์ธ๊ณ๋ฅผ ๊น์ด ํ๊ตฌํ์ฌ Web Workers, SharedArrayBuffer ๋ฐ Atomics์ ๊ฐ์ ์ต์ฒจ๋จ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์์ ์ ๋ณ๋ ฌ๋ก ์คํํ๋ ๋ฐฉ๋ฒ์ ํ๊ตฌํฉ๋๋ค. ๋ณต์ก์ฑ์ ๋ฒ๊ฒจ๋ด๊ณ , ์ค์ ์์๋ฅผ ์ ๊ณตํ๊ณ , ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ ผ์ํ๋ฉฐ, ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํํ๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐ์์ฑ์ด ๋ฐ์ด๋๊ณ ๊ณ ์ฑ๋ฅ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์๋ ์ง์์ ์ ๊ณตํฉ๋๋ค.
JavaScript ๋์ : ์ค๊ณ์ ๋จ์ผ ์ค๋ ๋
๋์ ๋ฐ๋ณต์์ ์ค์์ฑ์ ์ดํดํ๋ ค๋ฉด JavaScript์ ๊ธฐ๋ณธ์ ์ธ ์คํ ๋ชจ๋ธ์ ์ดํดํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค. JavaScript๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ๋จ์ผ ์ค๋ ๋์ ๋๋ค. ์ฆ, ํ๋์ 'ํธ์ถ ์คํ'๊ณผ ํ๋์ '๋ฉ๋ชจ๋ฆฌ ํ'์ ๊ฐ์ง๊ณ ์์ต๋๋ค. UI ์ ๋ฐ์ดํธ ๋ ๋๋ง๋ถํฐ ์ฌ์ฉ์ ์ ๋ ฅ ์ฒ๋ฆฌ ๋ฐ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ชจ๋ ์ฝ๋๊ฐ ์ด ๋จ์ผ ๋ฉ์ธ ์ค๋ ๋์์ ์คํ๋ฉ๋๋ค. ์ด๋ ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์ ๊ณ ์ ํ ๊ฒฝ์ ์กฐ๊ฑด์ ๋ณต์ก์ฑ์ ์ ๊ฑฐํ์ฌ ํ๋ก๊ทธ๋๋ฐ์ ๋จ์ํํ์ง๋ง, ์ค์ํ ์ ํ ์ฌํญ์ ๋์ ํฉ๋๋ค. ์ฆ, ์ค๋ ์คํ๋๋ CPU ์ง์ฝ์ ์์ ์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ตํ์ง ์๊ฒ ๋ฉ๋๋ค.
์ด๋ฒคํธ ๋ฃจํ ๋ฐ Non-Blocking I/O
JavaScript๋ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ํตํด ๋จ์ผ ์ค๋ ๋ ํน์ฑ์ ๊ด๋ฆฌํฉ๋๋ค. ์ด ์ฐ์ํ ๋ฉ์ปค๋์ฆ์ ํตํด JavaScript๋ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ณธ API์ I/O ์์ ์ ์คํ๋ก๋ํ๊ณ ์์ ์ด ์๋ฃ๋๋ฉด ์คํ๋ ์ฝ๋ฐฑ์ ๋ฑ๋กํ์ฌ ๋น์ฐจ๋จ I/O ์์ (๋คํธ์ํฌ ์์ฒญ ๋๋ ํ์ผ ์์คํ ์ก์ธ์ค)์ ์ํํ ์ ์์ต๋๋ค. I/O์๋ ํจ๊ณผ์ ์ด์ง๋ง, ์ด๋ฒคํธ ๋ฃจํ๋ CPU ๋ฐ์ด๋ ๊ณ์ฐ์ ๋ํ ์๋ฃจ์ ์ ๋ณธ์ง์ ์ผ๋ก ์ ๊ณตํ์ง ์์ต๋๋ค. ๋ณต์กํ ๊ณ์ฐ์ ์ํํ๊ฑฐ๋, ๋๊ท๋ชจ ๋ฐฐ์ด์ ์ ๋ ฌํ๊ฑฐ๋, ๋ฐ์ดํฐ๋ฅผ ์ํธํํ๋ ๊ฒฝ์ฐ ๋ฉ์ธ ์ค๋ ๋๊ฐ ํด๋น ์์ ์ด ์๋ฃ๋ ๋๊น์ง ์์ ํ ์ ์ ๋์ด UI๊ฐ ์ ์ง๋๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ด ์ ํ๋ฉ๋๋ค.
๊ธ๋ก๋ฒ ์ ์ ์๊ฑฐ๋ ํ๋ซํผ์์ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ๋ด์์ ๋๊ท๋ชจ ์ ํ ์นดํ๋ก๊ทธ์ ๋ณต์กํ ๊ฐ๊ฒฉ ์ฑ ์ ์๊ณ ๋ฆฌ์ฆ์ ๋์ ์ผ๋ก ์ ์ฉํ๊ฑฐ๋ ์ค์๊ฐ ๋ฐ์ดํฐ ๋ถ์์ ์ํํด์ผ ํ๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด์ญ์์ค. ์ด๋ฌํ ์์ ์ด ๋ฉ์ธ ์ค๋ ๋์์ ์คํ๋๋ ๊ฒฝ์ฐ ์ฌ์ฉ์๋ ์์น ๋๋ ์ฅ์น์ ๊ด๊ณ์์ด ์๋นํ ์ง์ฐ๊ณผ ์๋ต์ด ์๋ ์ธํฐํ์ด์ค๋ฅผ ๊ฒฝํํ๊ฒ ๋ฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ํ์์ฑ์ด ์ค์ํ ๊ณณ์ ๋๋ค.
๋ชจ๋ ธ๋ฆฌ์ค ๊นจ๊ธฐ: Web Workers๋ฅผ ์ฌ์ฉํ ๋์์ฑ ์๊ฐ
JavaScript์์ ์ง์ ํ ๋์์ฑ์ ํฅํ ์ฒซ ๋ฒ์งธ ์ค์ํ ๋จ๊ณ๋ Web Workers์ ๋์ ์ด์์ต๋๋ค. Web Workers๋ ์น ํ์ด์ง์ ๋ฉ์ธ ์คํ ์ค๋ ๋์ ๋ณ๊ฐ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ฒฉ๋ฆฌ๋ ํต์ฌ์ ๋๋ค. ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ์์ ์ ์ค๋ ๋์ ์์ํ์ฌ ๋ฉ์ธ ์ค๋ ๋๊ฐ UI ์ ๋ฐ์ดํธ ๋ฐ ์ฌ์ฉ์ ์ํธ ์์ฉ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค.
Web Workers ์๋ ๋ฐฉ์
- ๊ฒฉ๋ฆฌ: ๊ฐ Web Worker๋ ๋ฉ์ธ ์ค๋ ๋์
window
๊ฐ์ฒด์ ์์ ํ ๋ถ๋ฆฌ๋ ์์ฒด ์ ์ญ ์ปจํ ์คํธ์์ ์คํ๋ฉ๋๋ค. ์ฆ, ์์ ์๋ DOM์ ์ง์ ์กฐ์ํ ์ ์์ต๋๋ค. - ํต์ : ๋ฉ์ธ ์ค๋ ๋์ ์์
์ ๊ฐ(๋ฐ ์์
์ ๊ฐ)์ ํต์ ์
postMessage()
๋ฉ์๋์onmessage
์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์์ง ์ ๋ฌ์ ํตํด ์ด๋ฃจ์ด์ง๋๋ค.postMessage()
๋ฅผ ํตํด ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ ๊ณต์ ๋์ง ์๊ณ ๋ณต์ฌ๋๋ฏ๋ก ๋ณต์กํ ๊ฐ์ฒด๋ ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํ๋๋ฉฐ ๋งค์ฐ ํฐ ๋ฐ์ดํฐ ์ธํธ์ ๊ฒฝ์ฐ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. - ๋ ๋ฆฝ์ฑ: ์์ ์๋ ๋ฉ์ธ ์ค๋ ๋์ ์๋ต์ฑ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ๋ ๋ง์ ๊ณ์ฐ์ ์ํํ ์ ์์ต๋๋ค.
์ด๋ฏธ์ง ์ฒ๋ฆฌ, ๋ณต์กํ ๋ฐ์ดํฐ ํํฐ๋ง ๋๋ ๊ณต์ ์ํ ๋๋ ์ฆ๊ฐ์ ์ด๊ณ ๋๊ธฐ์ ์ธ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ์ง ์์ ์ํธํ ๊ณ์ฐ๊ณผ ๊ฐ์ ์์ ์ ๊ฒฝ์ฐ Web Workers๊ฐ ํ์ํ ์ ํ์ ๋๋ค. ๋ชจ๋ ์ฃผ์ ๋ธ๋ผ์ฐ์ ์์ ์ง์๋๋ฏ๋ก ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ ์ธ ๋๊ตฌ์ ๋๋ค.
์์: Web Workers๋ฅผ ์ฌ์ฉํ ๋ณ๋ ฌ ์ด๋ฏธ์ง ์ฒ๋ฆฌ
์ฌ์ฉ์๊ฐ ๊ณ ํด์๋ ์ด๋ฏธ์ง์ ๋ค์ํ ํํฐ๋ฅผ ์ ์ฉํ ์ ์๋ ๊ธ๋ก๋ฒ ์ฌ์ง ํธ์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํด ๋ณด์ญ์์ค. ๋ฉ์ธ ์ค๋ ๋์์ ํฝ์ ๋จ์๋ก ๋ณต์กํ ํํฐ๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ์ฌ์์ด ๋ ๊ฒ์ ๋๋ค. Web Workers๋ ์๋ฒฝํ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค.
๋ฉ์ธ ์ค๋ ๋ (index.html
/app.js
):
// Create an image element and load an image
const img = document.createElement('img');
img.src = 'large_image.jpg';
img.onload = () => {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0);
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const numWorkers = navigator.hardwareConcurrency || 4; // Use available cores or default
const chunkSize = Math.ceil(imageData.data.length / numWorkers);
const workers = [];
const results = [];
for (let i = 0; i < numWorkers; i++) {
const worker = new Worker('imageProcessor.js');
workers.push(worker);
worker.onmessage = (event) => {
results.push(event.data.processedChunk);
if (results.length === numWorkers) {
// All workers finished, combine results
const combinedImageData = new Uint8ClampedArray(imageData.data.length);
results.sort((a, b) => a.startIndex - b.startIndex);
let offset = 0;
results.forEach(chunk => {
combinedImageData.set(chunk.data, offset);
offset += chunk.data.length;
});
// Put combined image data back to canvas and display
const newImageData = new ImageData(combinedImageData, canvas.width, canvas.height);
ctx.putImageData(newImageData, 0, 0);
console.log('Image processing complete!');
}
};
const start = i * chunkSize;
const end = Math.min((i + 1) * chunkSize, imageData.data.length);
// Send a chunk of the image data to the worker
// Note: For large TypedArrays, transferables can be used for efficiency
worker.postMessage({
chunk: imageData.data.slice(start, end),
startIndex: start,
width: canvas.width, // Pass full width to worker for pixel calculations
filterType: 'grayscale'
});
}
};
์์
์ ์ค๋ ๋ (imageProcessor.js
):
self.onmessage = (event) => {
const { chunk, startIndex, width, filterType } = event.data;
const processedChunk = new Uint8ClampedArray(chunk.length);
for (let i = 0; i < chunk.length; i += 4) {
const r = chunk[i];
const g = chunk[i + 1];
const b = chunk[i + 2];
const a = chunk[i + 3];
let newR = r, newG = g, newB = b;
if (filterType === 'grayscale') {
const avg = (r + g + b) / 3;
newR = avg;
newG = avg;
newB = avg;
} // Add more filters here
processedChunk[i] = newR;
processedChunk[i + 1] = newG;
processedChunk[i + 2] = newB;
processedChunk[i + 3] = a;
}
self.postMessage({
processedChunk: processedChunk,
startIndex: startIndex
});
};
์ด ์๋ ๋ณ๋ ฌ ์ด๋ฏธ์ง ์ฒ๋ฆฌ๋ฅผ ํ๋ฅญํ๊ฒ ๋ณด์ฌ์ค๋๋ค. ๊ฐ ์์ ์๋ ์ด๋ฏธ์ง์ ํฝ์ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ฅผ ์์ ํ๊ณ ์ฒ๋ฆฌํ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๋ณด๋ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ฉ์ธ ์ค๋ ๋๋ ์ด๋ฌํ ์ฒ๋ฆฌ๋ ์ธ๊ทธ๋จผํธ๋ฅผ ํจ๊ป ์ฐ๊ฒฐํฉ๋๋ค. ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ ์ด์ ๊ฐ์ ๊ณผ๋ํ ๊ณ์ฐ์ ํ๋ ๋์์๋ ์๋ต์ฑ์ ์ ์งํฉ๋๋ค.
๋ค์ ํ๋ฐํฐ์ด: SharedArrayBuffer ๋ฐ Atomics๋ฅผ ์ฌ์ฉํ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ
Web Workers๊ฐ ์์
์ ํจ๊ณผ์ ์ผ๋ก ์คํ๋ก๋ํ๋ ๋ฐ๋ฉด, postMessage()
์ ๊ด๋ จ๋ ๋ฐ์ดํฐ ๋ณต์ฌ๋ ๋งค์ฐ ํฐ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋ ์ฌ๋ฌ ์์
์๊ฐ ๋์ผํ ๋ฐ์ดํฐ์ ์์ฃผ ์ก์ธ์คํ๊ณ ์์ ํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ด ๋ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ ํ์ผ๋ก ์ธํด SharedArrayBuffer์ ํจ๊ป ์ ๊ณต๋๋ Atomics API๊ฐ ๋์
๋์ด JavaScript์ ์ง์ ํ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋์์ฑ์ ์ ๊ณตํ๊ฒ ๋์์ต๋๋ค.
SharedArrayBuffer: ๋ฉ๋ชจ๋ฆฌ ๊ฒฉ์ฐจ ํด์
SharedArrayBuffer
๋ ArrayBuffer
์ ์ ์ฌํ์ง๋ง ํ ๊ฐ์ง ์ค์ํ ์ฐจ์ด์ ์ด ์๋ ๊ณ ์ ๊ธธ์ด ์์ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ๋ฒํผ์
๋๋ค. ์ฆ, ์ฌ๋ฌ Web Workers์ ๋ฉ์ธ ์ค๋ ๋ ๊ฐ์ ๋์์ ๊ณต์ ํ ์ ์์ต๋๋ค. ์์
์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ ๋์ ๋์ผํ ๊ธฐ๋ณธ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์์ ์๋ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํค๋๋ฅผ ๋ํญ ์ค์ด๊ณ ์ค๋ ๋ ๊ฐ์ ๋น๋ฒํ ๋ฐ์ดํฐ ์ก์ธ์ค ๋ฐ ์์ ์ด ํ์ํ ์๋๋ฆฌ์ค์ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
๊ทธ๋ฌ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ฉด ๊ณ ์ ์ ์ธ ๋ฉํฐ ์ค๋ ๋ฉ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฆ, ๊ฒฝ์ ์กฐ๊ฑด ๋ฐ ๋ฐ์ดํฐ ์์์
๋๋ค. ๋ ์ค๋ ๋๊ฐ ๋์์ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์์น์ ์ฐ๋ ค๊ณ ํ๋ฉด ๊ฒฐ๊ณผ๋ ์์ธกํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด Atomics
API๊ฐ ํ์์ ์ธ ์ด์ ์
๋๋ค.
Atomics: ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๋ฐ ๋๊ธฐํ ๋ณด์ฅ
Atomics
๊ฐ์ฒด๋ SharedArrayBuffer
๊ฐ์ฒด์์ ์์์ฑ(๋ถํ ๋ถ๊ฐ) ์์
์ ์ํํ๊ธฐ ์ํ ์ ์ ๋ฉ์๋ ์งํฉ์ ์ ๊ณตํฉ๋๋ค. ์์์ฑ ์์
์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์์น์ ์ก์ธ์คํ๊ธฐ ์ ์ ์ฝ๊ธฐ ๋๋ ์ฐ๊ธฐ ์์
์ด ์์ ํ ์๋ฃ๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฒฝ์ ์กฐ๊ฑด์ด ๋ฐฉ์ง๋๊ณ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ด ๋ณด์ฅ๋ฉ๋๋ค.
์ฃผ์ Atomics
๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Atomics.load(typedArray, index)
: ์ง์ ๋ ์์น์์ ๊ฐ์ ์์์ ์ผ๋ก ์ฝ์ต๋๋ค.Atomics.store(typedArray, index, value)
: ์ง์ ๋ ์์น์ ๊ฐ์ ์์์ ์ผ๋ก ์ ์ฅํฉ๋๋ค.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)
: ๊ฐ์ ์์์ ์ผ๋ก ๋น๊ตํ๊ณ ๊ตํํ๋ฉฐ, ์ ๊ธ ๊ตฌํ์ ์ค์ํฉ๋๋ค.Atomics.wait(typedArray, index, value, timeout)
: ํธ์ถ ์์ด์ ํธ๋ฅผ ์ ์๊ธฐ ์ํ๋ก ๋ง๋ค์ด ์๋ฆผ์ ๊ธฐ๋ค๋ฆฝ๋๋ค. ๋๊ธฐํ์ ์ฌ์ฉ๋ฉ๋๋ค.Atomics.notify(typedArray, index, count)
: ์ง์ ๋ ์์ธ์์ ๋๊ธฐ ์ค์ธ ์์ด์ ํธ๋ฅผ ๊นจ์๋๋ค.
์ด๋ฌํ ๋ฉ์๋๋ ๊ณต์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์์ ์์ ํ๊ฒ ์๋ํ๋ ์ ๊ตํ ๋์ ๋ฐ๋ณต์๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
๋์ ๋ฐ๋ณต์ ์ ์: ์ค์ ์๋๋ฆฌ์ค
๋์ ๋ฐ๋ณต์๋ ๊ฐ๋ ์ ์ผ๋ก ๋ฐ์ดํฐ ์ธํธ ๋๋ ์์ ์ ๋ ์๊ณ ๋ ๋ฆฝ์ ์ธ ์ฒญํฌ๋ก ๋๋๊ณ , ์ฌ๋ฌ ์์ ์์๊ฒ ์ด๋ฌํ ์ฒญํฌ๋ฅผ ๋ถ์ฐํ๊ณ , ๋ณ๋ ฌ๋ก ๊ณ์ฐ์ ์ํํ ๋ค์ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐํฉํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด ํจํด์ ๋ณ๋ ฌ ์ปดํจํ ์์ 'Map-Reduce'๋ผ๊ณ ๋ ํฉ๋๋ค.
์๋๋ฆฌ์ค: ๋ณ๋ ฌ ๋ฐ์ดํฐ ์ง๊ณ(์: ๋๊ท๋ชจ ๋ฐฐ์ด์ ํฉ๊ณ)
๋๊ท๋ชจ JavaScript ๋ฐฐ์ด๋ก ํํ๋ ๊ธ์ต ๊ฑฐ๋ ๋๋ ์ผ์ ํ๋
๊ฐ์ ๋๊ท๋ชจ ๊ธ๋ก๋ฒ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๊ณ ๋ คํด ๋ณด์ญ์์ค. ๋ชจ๋ ๊ฐ์ ํฉ์ฐํ์ฌ ์ง๊ณ๋ฅผ ๋์ถํ๋ ๊ฒ์ CPU ์ง์ฝ์ ์ธ ์์
์ผ ์ ์์ต๋๋ค. ๋ค์์ SharedArrayBuffer
๋ฐ Atomics
๊ฐ ์๋นํ ์ฑ๋ฅ ํฅ์์ ์ ๊ณตํ ์ ์๋ ๋ฐฉ๋ฒ์
๋๋ค.
๋ฉ์ธ ์ค๋ ๋ (index.html
/app.js
):
const dataSize = 100_000_000; // 100 million elements
const largeArray = new Int32Array(dataSize);
for (let i = 0; i < dataSize; i++) {
largeArray[i] = Math.floor(Math.random() * 100);
}
// Create a SharedArrayBuffer to hold the sum and the original data
const sharedBuffer = new SharedArrayBuffer(largeArray.byteLength + Int32Array.BYTES_PER_ELEMENT);
const sharedData = new Int32Array(sharedBuffer, 0, largeArray.length);
const sharedSum = new Int32Array(sharedBuffer, largeArray.byteLength);
// Copy initial data to the shared buffer
sharedData.set(largeArray);
const numWorkers = navigator.hardwareConcurrency || 4;
const chunkSize = Math.ceil(largeArray.length / numWorkers);
let completedWorkers = 0;
console.time('Parallel Summation');
for (let i = 0; i < numWorkers; i++) {
const worker = new Worker('sumWorker.js');
worker.onmessage = () => {
completedWorkers++;
if (completedWorkers === numWorkers) {
console.timeEnd('Parallel Summation');
console.log(`Total Parallel Sum: ${Atomics.load(sharedSum, 0)}`);
}
};
const start = i * chunkSize;
const end = Math.min((i + 1) * chunkSize, largeArray.length);
// Transfer the SharedArrayBuffer, not copy
worker.postMessage({
sharedBuffer: sharedBuffer,
startIndex: start,
endIndex: end
});
}
์์
์ ์ค๋ ๋ (sumWorker.js
):
self.onmessage = (event) => {
const { sharedBuffer, startIndex, endIndex } = event.data;
// Create TypedArrays views on the shared buffer
const sharedData = new Int32Array(sharedBuffer, 0, (sharedBuffer.byteLength / Int32Array.BYTES_PER_ELEMENT) - 1);
const sharedSum = new Int32Array(sharedBuffer, sharedBuffer.byteLength - Int32Array.BYTES_PER_ELEMENT);
let localSum = 0;
for (let i = startIndex; i < endIndex; i++) {
localSum += sharedData[i];
}
// Atomically add the local sum to the global shared sum
Atomics.add(sharedSum, 0, localSum);
self.postMessage('done');
};
์ด ์์์ ๊ฐ ์์
์๋ ํ ๋น๋ ์ฒญํฌ์ ๋ํ ํฉ๊ณ๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๋งค์ฐ ์ค์ํ๊ฒ๋, ๋ถ๋ถ ํฉ๊ณ๋ฅผ postMessage
๋ฅผ ํตํด ๋ค์ ๋ณด๋ด๊ณ ๋ฉ์ธ ์ค๋ ๋์์ ์ง๊ณํ๋๋ก ํ๋ ๋์ ๊ฐ ์์
์๋ ๋ก์ปฌ ํฉ๊ณ๋ฅผ ๊ณต์ sharedSum
๋ณ์์ ์ง์ ์ ์ด๊ณ ์์์ ์ผ๋ก ์ถ๊ฐํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ง๊ณ๋ฅผ ์ํ ๋ฉ์์ง ์ ๋ฌ ์ค๋ฒํค๋๊ฐ ๋ฐฉ์ง๋๊ณ ๋์ ์ฐ๊ธฐ์๋ ๋ถ๊ตฌํ๊ณ ์ต์ข
ํฉ๊ณ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ง๋ฉ๋๋ค.
๊ธ๋ก๋ฒ ๊ตฌํ ๊ณ ๋ ค ์ฌํญ:
- ํ๋์จ์ด ๋์์ฑ:
navigator.hardwareConcurrency
๋ฅผ ํญ์ ์ฌ์ฉํ์ฌ ์์ฑํ ์์ ์์ ์ต์ ์๋ฅผ ๊ฒฐ์ ํ์ฌ CPU ์ฝ์ด์ ๊ณผํฌํ๋ฅผ ๋ฐฉ์งํฉ๋๋ค. ํนํ ๊ฐ๋ฐ๋์๊ตญ์์ ํํ ๋ณผ ์ ์๋ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ ์ฅ์น์ ๋๋ค. - ์ฒญํฌ ์ ๋ต: ๋ฐ์ดํฐ๋ฅผ ์ฒญํฌํ๊ณ ๋ถ์ฐํ๋ ๋ฐฉ์์ ํน์ ์์ ์ ๋ง๊ฒ ์ต์ ํ๋์ด์ผ ํฉ๋๋ค. ๋ถ๊ท ๋ฑํ ์์ ๋ถํ๋ก ์ธํด ํ ์์ ์๊ฐ ๋ค๋ฅธ ์์ ์๋ณด๋ค ํจ์ฌ ๋ฆ๊ฒ ์๋ฃ๋ ์ ์์ต๋๋ค(๋ถํ ๋ถ๊ท ํ). ๋งค์ฐ ๋ณต์กํ ์์ ์ ๊ฒฝ์ฐ ๋์ ๋ถํ ๋ถ์ฐ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
- ํด๋ฐฑ: Web Workers ๋๋ SharedArrayBuffer๋ฅผ ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ์ ๋ํ ํด๋ฐฑ์ ํญ์ ์ ๊ณตํฉ๋๋ค(ํ์ฌ ์ง์์ด ๋๋ฆฌ ๋ณด๊ธ๋์์ง๋ง). ์ ์ง์ ํฅ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์ธ๊ณ์ ์ผ๋ก ๊ธฐ๋ฅ์ ์ ์งํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ํ ๊ณผ์ ๋ฐ ์ค์ํ ๊ณ ๋ ค ์ฌํญ
๋์ ๋ฐ๋ณต์์ ๊ฐ๋ ฅํจ์ ๋ถ์ธํ ์ ์์ง๋ง, ์ด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ตฌํํ๋ ค๋ฉด ๋ช ๊ฐ์ง ๋ฌธ์ ์ ์ ์ ์คํ๊ฒ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
- ์ค๋ฒํค๋: Web Workers๋ฅผ ์์ฑํ๊ณ ์ด๊ธฐ ๋ฉ์์ง ์ ๋ฌ(์ค์ ์ ์ํ
SharedArrayBuffer
ํฌํจ)์๋ ์ฝ๊ฐ์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํฉ๋๋ค. ๋งค์ฐ ์์ ์์ ์ ๊ฒฝ์ฐ ์ค๋ฒํค๋๋ก ์ธํด ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ์ด์ ์ด ๋ฌดํจํ๋ ์ ์์ต๋๋ค. ๋์ ์ฒ๋ฆฌ๊ฐ ์ค์ ๋ก ์ ์ตํ์ง ํ์ธํ๋ ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋กํ์ผ์ ๋ง๋์ญ์์ค. - ๋ณต์ก์ฑ: ๋ฉํฐ ์ค๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ฒ๊น ํ๋ ๊ฒ์ ๋จ์ผ ์ค๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ณด๋ค ๋ณธ์ง์ ์ผ๋ก ๋ ๋ณต์กํฉ๋๋ค. ๊ฒฝ์ ์กฐ๊ฑด, ๊ต์ฐฉ ์ํ(์์ฒด์ ์ผ๋ก ๋ณต์กํ ๋๊ธฐํ ๊ธฐ๋ณธ ์์๋ฅผ ๊ตฌ์ถํ์ง ์๋ ํ Web Workers์์๋ ๋ ์ผ๋ฐ์ ์) ๋ฐ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๋ณด์ฅ์๋ ์ธ์ฌํ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.
- ๋ณด์ ์ ํ(COOP/COEP):
SharedArrayBuffer
๋ฅผ ํ์ฑํํ๋ ค๋ฉด ์น ํ์ด์ง๋Cross-Origin-Opener-Policy: same-origin
๋ฐCross-Origin-Embedder-Policy: require-corp
์ ๊ฐ์ HTTP ํค๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ต์ฐจ ์ถ์ฒ ๊ฒฉ๋ฆฌ ์ํ๋ฅผ ์ตํธ์ธํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ๊ต์ฐจ ์ถ์ฒ ๊ฒฉ๋ฆฌ๊ฐ ์๋ ํ์ฌ ์ฝํ ์ธ ์ ํตํฉ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ค์ํ ์๋น์ค๋ฅผ ํตํฉํ๋ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์ค์ํ ๊ณ ๋ ค ์ฌํญ์ ๋๋ค. - ๋ฐ์ดํฐ ์ง๋ ฌํ/์ญ์ง๋ ฌํ:
SharedArrayBuffer
๊ฐ ์๋ Web Workers์ ๊ฒฝ์ฐpostMessage
๋ฅผ ํตํด ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ ๊ตฌ์กฐ์ ๋ณต์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๋ณต์ฌ๋ฉ๋๋ค. ์ฆ, ๋ณต์กํ ๊ฐ์ฒด๊ฐ ์ง๋ ฌํ๋ ๋ค์ ์ญ์ง๋ ฌํ๋๋ฏ๋ก ๋งค์ฐ ํฌ๊ฑฐ๋ ๊น์ด ์ค์ฒฉ๋ ๊ฐ์ฒด์ ๊ฒฝ์ฐ ์๋๊ฐ ๋๋ฆด ์ ์์ต๋๋ค.Transferable
๊ฐ์ฒด(ArrayBuffer
,MessagePort
,ImageBitmap
๋ฑ)๋ ์ ๋ก ๋ณต์ฌ๋ก ํ ์ปจํ ์คํธ์์ ๋ค๋ฅธ ์ปจํ ์คํธ๋ก ์ด๋ํ ์ ์์ง๋ง, ์๋ ์ปจํ ์คํธ๋ ์ด์ ๋ํ ์ก์ธ์ค ๊ถํ์ ์์ต๋๋ค. - ์ค๋ฅ ์ฒ๋ฆฌ: ์์
์ ์ค๋ ๋์ ์ค๋ฅ๋ ๋ฉ์ธ ์ค๋ ๋์
try...catch
๋ธ๋ก์์ ์๋์ผ๋ก ๊ฐ์ง๋์ง ์์ต๋๋ค. ์์ ์ ์ธ์คํด์ค์์error
์ด๋ฒคํธ๋ฅผ ์์ ๋๊ธฐํด์ผ ํฉ๋๋ค. ์์ ์ ์ธ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด์๋ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ํ์์ ์ ๋๋ค. - ๋ธ๋ผ์ฐ์ ํธํ์ฑ ๋ฐ ํด๋ฆฌํ: Web Workers ๋ฐ SharedArrayBuffer๋ ๊ด๋ฒ์ํ๊ฒ ์ง์๋์ง๋ง, ๋์ ์ฌ์ฉ์ ๊ธฐ๋ฐ, ํนํ ์ด์ ์ฅ์น ๋๋ ๋ ์์ฃผ ์ ๋ฐ์ดํธ๋๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ์ฉํ๋ ์ง์ญ์ ๊ณ ๋ คํ ๊ฒฝ์ฐ ํญ์ ํธํ์ฑ์ ํ์ธํ์ญ์์ค.
- ๋ฆฌ์์ค ๊ด๋ฆฌ: ์ฌ์ฉํ์ง ์๋ ์์
์๋ ๋ฆฌ์์ค๋ฅผ ํด์ ํ๊ธฐ ์ํด ์ข
๋ฃํด์ผ ํฉ๋๋ค(
worker.terminate()
). ๊ทธ๋ ๊ฒ ํ์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
ํจ์จ์ ์ธ ๋์ ๋ฐ๋ณต์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
JavaScript ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ์ด์ ์ ์ต๋ํํ๊ณ ๋ฌธ์ ์ ์ ์ต์ํํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
- CPU ๋ฐ์ด๋ ์์ ์๋ณ: ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ค์ ๋ก ์ฐจ๋จํ๋ ์์ ๋ง ์คํ๋ก๋ํฉ๋๋ค. ์ด๋ฏธ ๋น์ฐจ๋จ๋ ๋คํธ์ํฌ ์์ฒญ๊ณผ ๊ฐ์ ๊ฐ๋จํ ๋น๋๊ธฐ ์์ ์ ์์ ์๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
- ์์ ์ ์์ ์ง์ค: ๋จ์ผ์ ์ ์ ์๋ CPU ์ง์ฝ์ ์ธ ์์ ์ ์ํํ๋๋ก ์์ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ค๊ณํฉ๋๋ค. ์์ ์ ๋ด์ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ๋ ผ๋ฆฌ๋ฅผ ๋ฃ์ง ๋ง์ญ์์ค.
- ๋ฉ์์ง ์ ๋ฌ ์ต์ํ: ์ค๋ ๋ ๊ฐ์ ๋ฐ์ดํฐ ์ ์ก์ ๊ฐ์ฅ ์ค์ํ ์ค๋ฒํค๋์
๋๋ค. ํ์ํ ๋ฐ์ดํฐ๋ง ๋ณด๋
๋๋ค. ์ง์์ ์ธ ์
๋ฐ์ดํธ์ ๊ฒฝ์ฐ ๋ฉ์์ง๋ฅผ ์ผ๊ด ์ฒ๋ฆฌํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
SharedArrayBuffer
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋๊ธฐํ์ ํ์ํ ์์์ฑ ์์ ๋ง ์ต์ํํ์ญ์์ค. - Transferable ๊ฐ์ฒด ํ์ฉ: ๋์ฉ๋
ArrayBuffer
๋๋MessagePort
์ ๊ฒฝ์ฐ transferables๋ฅผpostMessage
์ ํจ๊ป ์ฌ์ฉํ์ฌ ์์ ๊ถ์ ์ด๋ํ๊ณ ๋น์ฉ์ด ๋ง์ด ๋๋ ๋ณต์ฌ๋ฅผ ๋ฐฉ์งํฉ๋๋ค. - SharedArrayBuffer๋ก ์ ๋ต ์๋ฆฝ: ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ก์ธ์คํ๊ณ ์์ ํด์ผ ํ๋ ์ง์ ์ผ๋ก ๊ณต์ ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ํ๊ฐ ํ์ํ๊ณ ๋ฉ์์ง ์ ๋ฌ์ ์ค๋ฒํค๋๊ฐ ๊ธ์ง๋ ๋๋ง
SharedArrayBuffer
๋ฅผ ์ฌ์ฉํ์ญ์์ค. ๊ฐ๋จํ 'map' ์์ ์ ๊ฒฝ์ฐ ๊ธฐ์กด Web Workers๋ก ์ถฉ๋ถํ ์ ์์ต๋๋ค. - ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ ๊ตฌํ: ํญ์
worker.onerror
๋ฆฌ์ค๋๋ฅผ ํฌํจํ๊ณ ์์ ์ ์ค๋ฅ์ ๋ฉ์ธ ์ค๋ ๋๊ฐ ์ด๋ป๊ฒ ๋ฐ์ํ ์ง ๊ณํํฉ๋๋ค. - ๋๋ฒ๊น ๋๊ตฌ ํ์ฉ: ์ต์ ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ(Chrome DevTools ๋ฑ)๋ Web Workers ๋๋ฒ๊น ์ ๋ํ ํ๋ฅญํ ์ง์์ ์ ๊ณตํฉ๋๋ค. ์ค๋จ์ ์ ์ค์ ํ๊ณ , ๋ณ์๋ฅผ ๊ฒ์ฌํ๊ณ , ์์ ์ ๋ฉ์์ง๋ฅผ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ํ๋กํ์ผ๋ง: ๋ธ๋ผ์ฐ์ ์ ์ฑ๋ฅ ํ๋กํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ๊ตฌํ์ ์ํฅ์ ์ธก์ ํฉ๋๋ค. ์์ ์ ์ฌ์ฉ ์ฌ๋ถ์ ๋ฐ๋ฅธ ์ฑ๋ฅ์ ๋น๊ตํ์ฌ ์ ๊ทผ ๋ฐฉ์์ ํ์ธํ์ญ์์ค.
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ณ ๋ ค: ๋ ๋ณต์กํ ์์ ์ ๊ด๋ฆฌ, ๋๊ธฐํ ๋๋ RPC์ ์ ์ฌํ ํต์ ํจํด์ ๊ฒฝ์ฐ Comlink ๋๋ Workerize์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ง์ ์์ฉ๊ตฌ ๋ฐ ๋ณต์ก์ฑ์ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
JavaScript ๋ฐ ์น์์์ ๋์์ฑ์ ๋ฏธ๋
๋ ๋์ ์ฑ๋ฅ๊ณผ ๋์์ฑ์ ์ํ JavaScript์ ์ฌ์ ์ ๊ณ์ ์งํ ์ค์
๋๋ค. WebAssembly
(Wasm)์ ๋์
๊ณผ ์ค๋ ๋์ ๋ํ ์ฆ๊ฐํ๋ ์ง์์ ๋ ๋ง์ ๊ฐ๋ฅ์ฑ์ ์ด์ด์ค๋๋ค. Wasm ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณธ์ง์ ์ผ๋ก ๋ฉํฐ ์ค๋ ๋ฉ์ ์ง์ํ๋ C++, Rust ๋๋ ๊ธฐํ ์ธ์ด๋ฅผ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ฐ ์์์ฑ ์์
์ ๋ ์์ฐ์ค๋ฝ๊ฒ ํ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์ ์ง์ ์ปดํ์ผํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ ๊ตํ ๊ณผํ ์๋ฎฌ๋ ์ด์
๋ถํฐ ๊ณ ๊ธ ๊ฒ์ ์์ง์ ์ด๋ฅด๊ธฐ๊น์ง ๋ค์ํ ์ฅ์น์ ์ง์ญ์์ ๋ธ๋ผ์ฐ์ ๋ด์์ ์ง์ ์คํ๋๋ ๊ณ ์ฑ๋ฅ์ CPU ์ง์ฝ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ ๊ธธ์ ์ด ์ ์์ต๋๋ค.
์น ํ์ค์ด ๋ฐ์ ํจ์ ๋ฐ๋ผ ๋์ ํ๋ก๊ทธ๋๋ฐ์ ๋จ์ํํ๊ณ ๋ ๊ด๋ฒ์ํ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์ ๋ ์ฝ๊ฒ ์ก์ธ์คํ ์ ์๋๋ก ํ๋ ์ถ๊ฐ ๊ฐ์ ๋ฐ ์๋ก์ด API๋ฅผ ์์ํ ์ ์์ต๋๋ค. ๋ชฉํ๋ ํญ์ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๋ชจ๋ ๊ณณ์์ ๋ ํ๋ถํ๊ณ ์๋ต์ฑ์ด ๋ฐ์ด๋ ๊ฒฝํ์ ๊ตฌ์ถํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
๊ฒฐ๋ก : ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ก ๊ธ๋ก๋ฒ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐํ
JavaScript๊ฐ ์์ํ ๋จ์ผ ์ค๋ ๋ ์ธ์ด์์ ์ง์ ํ ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ์ธ์ด๋ก ๋ฐ์ ํ๋ ๊ฒ์ ์น ๊ฐ๋ฐ์ ๊ธฐ๋ ๋น์ ์ธ ๋ณํ๋ฅผ ์๋ฏธํฉ๋๋ค. Web Workers, SharedArrayBuffer ๋ฐ Atomics๋ก ๊ตฌ๋๋๋ ๋์ ๋ฐ๋ณต์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์์์ํค์ง ์๊ณ CPU ์ง์ฝ์ ์ธ ๊ณ์ฐ์ ์ฒ๋ฆฌํ๋ ๋ฐ ํ์์ ์ธ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฌด๊ฑฐ์ด ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๋ก ์คํ๋ก๋ํจ์ผ๋ก์จ ์์ ์ ๋ณต์ก์ฑ์ด๋ ์ฌ์ฉ์์ ์ง๋ฆฌ์ ์์น์ ๊ด๊ณ์์ด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์ฐํ๊ณ ์๋ต์ฑ์ด ๋ฐ์ด๋๋ฉฐ ์ฑ๋ฅ์ด ๋๋๋ก ํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๋์์ฑ ํจํด์ ์์ฉํ๋ ๊ฒ์ ๋จ์ํ ์ต์ ํ๊ฐ ์๋๋ผ ๊ธ๋ก๋ฒ ์ฌ์ฉ์์ ์ฆ๊ฐํ๋ ์๊ตฌ์ ๋ณต์กํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋ ์ฐจ์ธ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ทผ๋ณธ์ ์ธ ๋จ๊ณ์ ๋๋ค. ์ด๋ฌํ ๊ฐ๋ ์ ์ตํ๋ฉด ์ ์ธ๊ณ์ ์ผ๋ก ํ์ํ ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๋ง์กฑ๋๋ฅผ ์ ๊ณตํ๋ฉด์ ์ต์ ์น ํ๋ซํผ์ ๋ชจ๋ ์ ์ฌ๋ ฅ์ ํ์ฉํ ์ ์์ต๋๋ค.