πŸ”΅ ПОВОКИ И ПАМЯВЬ Π’ JS. ЧАБВЬ 2.



ВсСм ΠΏΡ€ΠΈΠ²Π΅Ρ‚! ΠŸΠΈΡˆΡƒ ΠΎΠ±Π΅Ρ‰Π°Π½Π½ΡƒΡŽ Ρ€Π°Π½Π΅Π΅ ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΏΡ€ΠΎ ΠΎΠ±Ρ‰ΡƒΡŽ Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ структуру Π΄Π°Π½Π½Ρ‹Ρ… Π² JS. Но для Π½Π°Ρ‡Π°Π»Π° Π΄Π°Π²Π°ΠΉΡ‚Π΅ разбСрСмся Π·Π°Ρ‡Π΅ΠΌ Π½Π°ΠΌ Π²ΠΎΠΎΠ±Ρ‰Π΅ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎ. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π²Π°ΡŽΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠΎΠ³Π΄Π° с ΠΎΠ΄Π½ΠΈΠΌΠΈ ΠΈ Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² исполнСния.



НапримСр, ΠΌΡ‹ пишСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° изобраТСния с расчётом рСалистичного свСта ΠΈ ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Вакая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° вСсьма Π·Π°Ρ‚Ρ€Π°Ρ‚Π½Π° для CPU, Π½ΠΎ Π΅Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Ρ€Π°ΡΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ²Π°Ρ‚ΡŒ Π½Π° нСсколько выполняСмых Π·Π°Π΄Π°Ρ‡. И Π²ΠΎΡ‚ это ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚ΠΎ самоС мСсто, Π³Π΄Π΅ Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ раздСляСмая ΠΏΠ°ΠΌΡΡ‚ΡŒ, Ρ‚. ΠΊ. ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ слишком ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ, Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠΎ владСнию Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ вСсти Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.



Как ΠΆΠ΅ это Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π² JS?



Π’ JS Π΅ΡΡ‚ΡŒ особая структура Π΄Π°Π½Π½Ρ‹Ρ… имСнуСмая SharedArrayBuffer. Π‘ Π²ΠΈΠ΄Ρƒ эта структура ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ArrayBuffer, Ρ‚. Π΅. для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½Π΅ΠΉ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ†ΠΈΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… конструкторов.



const buffer = new SharedArrayBuffer(1024);

const arr = new Uint8Array(buffer);



arr[0] = 1;

console.log(arr[0]);




Π’Π°ΠΊΠΆΠ΅, для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ этой структуры, Ρƒ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ установлСны ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ HTTP Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ.



Cross-Origin-Opener-Policy: same-origin

Cross-Origin-Embedder-Policy: require-corp ΠΈΠ»ΠΈ credentialless.




Π­Ρ‚ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ Π½ΡƒΠΆΠ½Ρ‹ для прСдотвращСния Π°Ρ‚Π°ΠΊ Ρ‚ΠΈΠΏΠ° Spectre, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π·Π±ΡƒΠ΄ΠΎΡ€Π°ΠΆΠΈΠ»ΠΈ вСсь ΠΌΠΈΡ€ Π² 2018 Π³ΠΎΠ΄Ρƒ. Однако, для использования Π² Node.js Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΈΠ»ΠΈ Ρ„Π»Π°Π³ΠΈ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹.



ОкСй, Π·Π½Π°Ρ‡ΠΈΡ‚ пСрСдавая Ρ‚Π°ΠΊΠΎΠΉ Π²ΠΎΡ‚ Π±ΡƒΡ„Π΅Ρ€ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² ΠΏΠΎΡ‚ΠΎΠΊ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π½Π΅Π³ΠΎ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ? Π Π°Π·Π²Π΅ это Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π³ΠΎΠ½ΠΊΠ°ΠΌ? πŸ€”



Ну, Ссли Ρƒ нас Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ситуация, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ ΠΈ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ ячСйки памяти ΠΈΠ· Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ρ‚ΠΎ Ρƒ нас Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ Π³ΠΎΠ½ΠΊΠ°. И это Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ сами ΠΏΠΎ сСбС раздСляСмыС Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½Π΅ приводят ΠΊ Π³ΠΎΠ½ΠΊΠ°ΠΌ - ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ ΠΌΠ΅Π½ΡΡ‚ΡŒ эти самыС Π΄Π°Π½Π½Ρ‹Π΅.



Но Π² случаС с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ всС Π΅Ρ‰Π΅ интСрСснСС, Ρ‚.ΠΊ. Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ нСпрСдсказуСмым. НапримСр, Ρ‡Ρ‚ΠΎ Ссли Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ числа ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²?



И Ρ‚ΡƒΡ‚ ситуаций масса: число ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒΡΡ, Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ; число увСличится, Π½ΠΎ Π½Π° мСньшСС количСство... ΠŸΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Π°ΠΊΠΎΠ΅ происходит?



ВсС Π΄Π΅Π»ΠΎ Π² атомарности ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ: Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ для нас ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌ, ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… инструкций. А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊ этому, Ρ‡Ρ‚ΠΎ наши ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΊΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΡ‹ пишСм, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π΅ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΌΡ‹ Π΅Π³ΠΎ написали. Π—Π²ΡƒΡ‡ΠΈΡ‚ странно?



Но ΠΏΡ€Π°Π²Π΄Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ компиляторы ΠΈ процСссоры ΠΌΠΎΠ³ΡƒΡ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒ порядок выполнСния инструкций, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эффСктивнСС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ рСсурсы ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°. И Ссли Π² ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅, это Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ послСдствиям, Ρ‚ΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ ΡƒΠΆΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ Π½Π΅Ρ‚.



😨 ВсС это Π·Π²ΡƒΡ‡ΠΈΡ‚ ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎ?



Ну Ρ‚Π°ΠΊ ΠΈ Π΅ΡΡ‚ΡŒ. Π’ΠΎΠΎΠ±Ρ‰Π΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ - это Ρ‚Π΅ΠΌΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠ²ΡΡ‚ΠΈΡ‚ΡŒ Π½Π΅ ΠΎΠ΄Π½Ρƒ ΠΊΠ½ΠΈΠ³Ρƒ ΠΈΠ»ΠΈ курс. МоТно Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ модСль памяти; Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ синхронизации; структуры Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ RWLock ΠΈΠ»ΠΈ Mutex ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅.



Но ΠΌΡ‹ ΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΏΡ€ΠΎ JS ΠΈ Π² JS Ρƒ нас Π΅ΡΡ‚ΡŒ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ² Atomics, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт API ΠΊΠ°ΠΊ для Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠ³ΠΎ обновлСния Π΄Π°Π½Π½Ρ‹Ρ… Π² SharedArrayBuffer, Ρ‚Π°ΠΊ ΠΈ для создания Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². А Ρ‚Π°ΠΊΠΆΠ΅ Π²Π²ΠΎΠ΄ΠΈΡ‚ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ любой ΠΊΠΎΠ΄ написанный Π²Ρ‹ΡˆΠ΅ Π°Ρ‚ΠΎΠΌΠΈΠΊΠ° Ρ‚ΠΎΡ‡Π½ΠΎ выполнится Ρ€Π°Π½ΡŒΡˆΠ΅, Π° Ρ‚ΠΎΡ‚, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΆΠ΅ - ΠΏΠΎΠ·ΠΆΠ΅.



ΠŸΡ€ΠΈΠ²Π΅Π΄Ρƒ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈ Π±ΡƒΠ΄Ρƒ Π½Π° сСгодня Π·Π°ΠΊΡ€ΡƒΠ³Π»ΡΡ‚ΡŒΡΡ.



const buffer = new SharedArrayBuffer(16);

const arr = new Uint8Array(buffer);



console.log(Atomics.store(arr, 0, 2)); // 2

console.log(Atomics.load(arr, 0)); // 2




На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд всС просто, Π½ΠΎ, Π²ΠΎΠΎΠ±Ρ‰Π΅, Atomics - это Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΊΠΈΡ€ΠΏΠΈΡ‡ΠΈΠΊ, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ строятся ΡƒΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ могущСствСнныС ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹.



Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ я Ρ€Π°Π·Π±Π΅Ρ€Ρƒ Π΅Π³ΠΎ использованиС Π² своём ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ постС. Но Ссли Ρ‚Π΅Π±Π΅ интСрСсна Ρ‚Π΅ΠΌΠ° ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… вычислСний Π² JS, Ρ‚ΠΎ ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ°ΡŽ Π½Π° свой авторский курс CS Π²ΠΎ Frontend - https://kobezzza.ru/, Π³Π΄Π΅ этой Ρ‚Π΅ΠΌΠ΅ посвящСн ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» Π»Π΅ΠΊΡ†ΠΈΠΉ.