Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
20161113-nodefest
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
chikoski
November 13, 2016
Technology
5.2k
12
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
20161113-nodefest
chikoski
November 13, 2016
More Decks by chikoski
See All by chikoski
20210825_ossx
chikoski
0
350
festudy02-wasm
chikoski
1
1.1k
An overview of WebAssembly; how it is used, created, and applied?
chikoski
1
790
Functions in JavaScript
chikoski
1
1.2k
20171018-WASM
chikoski
2
1.5k
20171002-wejs
chikoski
1
620
20170924-html5conference-wasm
chikoski
5
10k
Equivalence_in_JS
chikoski
0
1.6k
いまさら振り返るPromise
chikoski
1
610
Other Decks in Technology
See All in Technology
「速く作る」から「正しく作る」へ ─ 生成AI時代の開発フロー改革の ロードマップと実行 ─
starfish719
0
8.3k
Terraformモジュールは、なぜ「魔境」化するのか
hayama17
1
210
マーケットプレイス版Oracle WebCenter Content For OCI
oracle4engineer
PRO
5
1.8k
サイバーセキュリティ概論 / Introduction to Cybersecurity
ks91
PRO
0
170
タクシーアプリ『GO』の実践的データ活用
mot_techtalk
3
160
2026.06.13_AI時代に事業会社が「SIer出身エンジニア」を求める理由 / Why Businesses Seek Engineers with a System Integrator Background in the AI Era
jumtech
0
580
サプライチェーンセキュリティの空白地帯 - 信頼できる”依存性”の未来を考える
rung
PRO
2
740
LLMを「主役」にしないための 3つの原則
techtekt
PRO
0
120
Claude Code×Terraform IaC テンプレート駆動開発
itouhi
1
400
ITエンジニアを取り巻く環境とキャリアパス / A career path for Japanese IT engineers
takatama
4
1.8k
AI Engineering Summit Tokyo 2026 AIの前に、やることがある 〜医療データ企業の4フェーズ〜
dtaniwaki
0
2k
ポケモンの型をTypeScriptの型システムで表現してみた
subroh0508
0
340
Featured
See All Featured
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
220
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
23k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
400
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
300
Skip the Path - Find Your Career Trail
mkilby
1
140
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
160
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
570
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.5k
Rails Girls Zürich Keynote
gr2m
96
14k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
220
Crafting Experiences
bethany
1
170
Transcript
JavaScriptでの並列プログラミング: 共有メモリーと不可分操作、ロック N.Shimizu (
[email protected]
) 東京node学園祭(2016/11/13)
N. Shimizu / @chikoski •Mozilla Japan で Developer relation (エヴァンジェリスト)をしています
JavaScript, asm.js, WASM, DevTools, Rust, etc •ドキュメントの翻訳や、製品の翻訳も行なっています •コミュニティ活動: •html5j Web プラットフォーム部 / ゲーム部 •We are JavaScripters •プログラミング言語そのものが好きです •https://speakderdeck.com/chikoski/
None
None
Proudly non-profit, Mozilla makes products like Firefox with a mission
to keep the power of the Web in the hands of users everywhere. Mozilla Mission (https://www.mozilla.org/en-US/mission/)
Our mission is to promote openness, innovation & opportunity on
the Web. Mozilla Mission(https://www.mozilla.org/en-US/mission/)
Project Positron(Geckoを使用したElectron互換のアプリシェル) : https://github.com/mozilla/positron
JavaScriptはメインスレッドの時間を譲り合って共有します • 非同期処理を行うことで、実行時間を他のプログラムに譲れます • 例:アニメーション • スケジューラーがある場合:アニメーションを行う長い繰り返し処理 • JS: 1フレームごとの処理に分割し、window.requestAnimationFrameで他のプログラムに時間を譲る
1フレームの処理 1フレームの処理 1フレームの処理 非同期 処理 非同期 処理 非同期 処理 他の処理 他の処理
GVODUJPOVQEBUF \ CFGPSF6QEBUF VQEBUF0CKFDU4UBUVT VQEBUF(SBQIJDT BGUFS6QBUF
XJOEPXSFRVFTU"OJNBUJPO'SBNF VQEBUF ^ window.requestAnimationFrame を利用したアニメーションの描画ループ
WPJENBJO \ XIJMF USVF \ֿך搀ꣲٕ٦فכ04ח״גծ黝㹅♧儗⨡姺ׁתׅ CFGPSF@VQEBUF VQEBUF@PCKFDU@TUBUVT VQEBUF@HSBQIJDT
BGUFS@VQEBUF ^ ^ 典型的なアニメーションループ
GVODUJPOEP5BTL \ EP5BTL" EP5BTL# EP5BTL$ EP5BTL%
^ אהװחכ儗ַַָֺׅ GVODUJPOEP5BTL \ EP5BTL" EP5BTL# XJOEPXTFU*NNFEJBUF \ EP5BTL$ EP5BTL% ^ ^ window.setImmediateを利用した、明示的な処理時間の移譲
GVODUJPOMPX1SJPSJUZ5BTL EFBEMJOF \ JG EFBEMJOFUJNF3FNBJOJOH \ EP4PNFUIJOH ^
^ XJOEPXSFRVFTU*EMF$BMMCBDL MPX1SJPSJUZ5BTL XJOEPXSFRVFTU*EMF$BMMCBDL MPX1SJPSJUZ5BTL \UJNFPVU^ 空き時間にする処理の登録
メインスレッドだけを効率よく使うには • 仕事を適切な粒度に分解して、分解された仕事と仕事の間に適切に非同期処理を入れてやる • window.requestAnimationFrame • window.setTimeout, window.setInterval, window.setImmediate •
隙間時間に仕事をうまく入れていく: window.requestIdleCallBack • 1つのスレッドを効率よく使う、というアプローチには限界があります • 凝集度が下がり、プログラムは読みにくくなります • 仕事をどうしても分割できない場合もあります
マルチスレッドプログラミング
マルチスレッドプログラムとは • 複数の処理の流れ(スレッド)を利用するプログラムのこと • JavaScriptではWeb Workersを利用することで、マルチスレッドプログラムを実現できます taskA taskB TaskC taskD
taskA taskB taskA taskD taskD taskD taskD taskD taskD
DPOTUXPSLFSOFX8PSLFS XPSLFSKT 8PSLFSך⡲䧭 8PSLFSַךًحإ٦آ「ֽ《عٝسٓ XPSLFSPONFTTBHFNFTTBHF\ DPOTUEBUBNFTTBHFEBUB EPTPNFUIJOH ^ ً؎ٝفؚٗٓيַ8PSLFSפךًحإ٦آך鷏⥋ XPSLFSTFOE.FTTBHF
\DPNNBOETVN OVNCFST< >^ Workerを利用するプログラムの例:mainスレッド側
JNQPSU4DSJQUT DPNNBOEKT أؙٔفزך؎ٝه٦ز PONFTTBHFFWFOU\ DPOTUEBUBNFTTBHFEBUB DPOTU\OBNF OVNCFST^EBUB DPOTUDPNNBOEHFU$PNNBOE#Z/BNF OBNF
DPOTUSFTVMUDPNNBOE OVNCFST QPTU.FTTBHF \DPNNBOEOBNF SFTVMUSFTVMU^ ^ Workerを利用するプログラムの例:ワーカースレッド側
DPOTUPCK\WBMVF^ XPSLFSQPTU.FTTBHF PCK XPSLFSPONFTTBHF EBUB\ DPOTPMFMPH PCKEBUB ^
PONFTTBHFGVODUJPO EBUB \ QPTU.FTTBHF EBUB ^ main worker メッセージを通じて渡されるオブジェクトはコピーされる
ArrayBuffer:固定長のバイト列 • 固定長のバイナリーデータを扱うためのデータ構造です • 各要素へ直接アクセスすることはできません IUUQDBOJVTFDPNTFBSDI"SSBZ#VGGFS
DPOTUCVGGFSOFX"SSBZ#VGGFS غ؎زך㔿㹀ꞿךꂁ然⥂ DPOTUWJFXOFX*OU"SSBZ CVGGFS غ؎زךꂁؽحزך侭侧ךꂁה׃ג،ؙإأׅךؽُ٦⡲䧭 GPS MFUJJWJFXMFOHUIJ \
WJFX<J>.BUIGMPPS .BUISBOEPN /VNCFS."9@4"'&@*/5&(&3 ^ 格納するデータの種類に合わせたビューを作成し、そのビューを通じてアクセスする
ؽُ٦ ؟؎ؤ 铡僇 ず瘝ך$ך㘗 *OU"SSBZ 痗〾אֹ侭侧ך酡侧 JOU@U 6JOU"SSBZ
痗〾ז׃侭侧 VJOU@U 6JOU$MBNQU"SSBZ 痗〾ז׃侭侧ؙٓٝف VJOU@U *OU"SSBZ 痗〾אֹ侭侧ך酡侧 JOU@U 6JOU"SSBZ 痗〾ז׃侭侧 VJOU@U *OU"SSBZ 痗〾אֹ侭侧ך酡侧 JOU@U 6*OU"SSBZ 痗〾ז׃侭侧 VJOU@U 'MPBU"SSBZ 嵤⹛㼭侧挿 PBU 'MPBU"SSBZ ⦓礵䏝嵤⹛㼭侧挿 EPVCMF
GFUDI BFODPEFE UIFO SSBSSBZ#VGGFS UIFO CVG\ XPSLFSQPTU.FTTBHF CVG
^ XPSLFSPO.FTTBHFEP4PNF5IJOH PONFTTBHFGVODUJPO EBUB \ DPOTUWJFX OFX*OU"SSBZ EBUB EFDPEF WJFX QPTU.FTTBHF WJFXCVGGFS ^ データがなんどもコピーされて非効率 main worker
DPOTUCVGGFSOFX"SSBZ#VGGFS GVODUJPOUSBOTGFS \ DPOTPMFMPH CVGGFS խ"SSBZ#VGGFS\CZUF-FOHUI^ XPSLFSQPTU.FTTBHF CVGGFS
<CVGGFS> DPOTPMFMPH CVGGFS "SSBZ#VGGFS\CZUF-FOHUI^ DPOTPMFMPH CVGGFSCVGGFS USVF ^ ArrayBufferは、その所有権をスレッド間で移動できます
GFUDI BFODPEFE UIFO SSBSSBZ#VGGFS UIFO CVG\ XPSLFSQPTU.FTTBHF CVG
<CVG> ^ XPSLFSPO.FTTBHFEP4PNF5IJOH PONFTTBHFGVODUJPO EBUB \ DPOTUWJFX OFX*OU"SSBZ EBUB EFDPEF WJFX QPTU.FTTBHF WJFXCVGGFS <WJFXCVGGFS> ^ 所有権の移動を利用したコード main worker
メインスレッドをブロックしなくても、重たい処理を行えるように • Web Workers を利用することで、メインスレッド以外にスレッドを作成できます • 作成したスレッドで重たい処理をすれば、メインスレッドを占有することはありません • 大きなArrayBufferは所有権を移動させることで、効率よく転送できます fetch
task decode doSomething task task task task task QPTU.FTTBHF QPTU.FTTBHF
3つ以上のスレッドで、ArrayBufferを共有するには? • データを利用した処理を複数の主体で行う場合もあります • 同じデーターに対して、異なる処理をする場合 • 同じデーターの異なる部分に対して、同じ処理をする場合 • 所有権は1つのスレッドしか持てないので、データをコピーするしかない? أٖحس
"SSBZ#VGGFS أٖحس "SSBZ#VGGFS ずׄ"SSBZ#VGGFS䭯גךַ
SharedArrayBuffer • スレッド間で共有可能なArrayBuffer • ArrayBuffer同様、ビュー経由で要素にアクセスします • "ECMAScript Shared Memory and
Atomics" で提案中です http://tc39.github.io/ecmascript_sharedmem/shmem.html أٖحس 4IBSFE"SSBZ#VGGFS أٖحس 4IBSFE"SSBZ#VGGFS 4IBSFE"SSBZ#VGGFS
DPOTUCVGGFSOFX4IBSFE"SSBZ#VGGFS GVODUJPOUSBOTGFS \ DPOTPMFMPH CVGGFS խ4IBSFE"SSBZ#VGGFS\CZUF-FOHUI^ XPSLFSQPTU.FTTBHF CVGGFS
<CVGGFS> DPOTPMFMPH CVGGFS 4IBSFE"SSBZ#VGGFS\CZUF-FOHUI^ DPOTPMFMPH CVGGFSCVGGFS USVF ^ 共有されているので、postMessageで受け渡した後も領域を参照できます
DPOTUIFBQ OFX6*OU"SSBZ CVGGFS IFBQ<>IFBQ<> DPOTUIFBQ OFX6*OU"SSBZ CVGGFS
IFBQ<> 2つの計算が終わった時、view[0] にはなにが入っているでしょうか? threadA threadB
heap[0] = heap[0] == 0 ? 2 : 0; はいくつかの処理に分割されます
a = [0]; a = a + 2; view[0] = a; view[0] = 1; a = view[0]; a = a + 2; view[0] = a; view[0] = 1; a = view[0]; a = a + 2; view[0] = a; view[0] = 1;
共有メモリには、Atomicsオブジェクトの提供する不可分操作を利用してアクセス します DPOTUIFBQOFX6*OU"SSBZ CVGGFS "UPNJDTDPNQBSF&YIBOHF IFBQ
DPOTUIFBQOFX6*OU"SSBZ CVGGFS IFBQ<>IFBQ<> Atomics利用 Atomicsなし
ꟼ侧 铡僇 "UPNJDTBEE 䭷㹀⡘縧ך⦼הך⸇皾遤ְծך穠卓ך⡘縧ח剅ֹ䨱ׅ "UPNJDTBOE 䭷㹀⡘縧ך⦼הך锷椚琎鎘皾ׅ "UPNJDTDPNQBSF&YDIBOHF 䭷㹀⡘縧ך⦼ה嫰鯰遤ְծ瘝׃ְ㜥さծך⡘縧ך⦼縧ֹ䳔ִ "UPNJDTFYDIBOHF 䭷㹀⡘縧ך⦼ծⴽך⦼הⰅ剏ִ
"UPNJDTMPBE 䭷㹀⦼ך⦼《䖤ׅ "UPNJDTPS 䭷㹀⡘縧ך⦼הך锷椚ㄤ鎘皾ׅ "UPNJDTTUPSF 䭷㹀⡘縧ח⦼鏣㹀ׅ "UPNJDTTVC 䭷㹀⡘縧ך⦼הך幾皾遤ְծך穠卓ך⡘縧ח剅ֹ䨱ׅ "UPNJDTYPS 䭷㹀⡘縧ך⦼הך䱖➭涸锷椚ㄤ鎘皾ׅ
食事する哲学者の問題 • 複数プロセスの同期制御に関する古典的な問題 • 問題: • 哲学者が円卓を囲んでいる • 哲学者はときおり考えるのやめて、食事をする •
食事には2本のフォークが必要で、 一度には1本のフォークしかとれない • 哲学者同士は会話をしない • 哲学者は食事することがきるだろうか? IUUQTKBXJLJQFEJBPSHXJLJ굸✲ׅㆸ㷕罏ך㉏겗
Atomics.wait / Atomics.wake • 特定の条件が true になるまで待つ手段 • 待っている間、処理はその式でブロックされる •
起動されると、その式以降から実行が継続されます • 条件の指定方法、 • 共有された指定位置の値が、指定された値と等しい間、待ちます • 使用できるのは、共有されたInt32Arrayのみ • Atomics.waitをメインスレッドで呼ぶことはできません
XPSLFSQPTU.FTTBHF IFBQCVGGFFS <IFBQCVGGFS> EP4PNFUIJOH "UPNJDTXBLF IFBQ
"UPNJDTTUPSF IFBQ "UPNJDTXBLF IFBQ PONFTTBHFGVODUJPO CVGGFS \ DPOTUIFBQ OFX6*OU"SSBZ CVGGFS DPOTPMFMPH "UPNJDTMPBE IFBQ "UPNJDTXBJU IFBQ DPOTPMFMPH "UPNJDTMPBE IFBQ main worker 起こすメインスレッドと、待つワーカースレッド
DPOTU7"-*% DPOTU*/7"-*% "UPNJDTTUPSF IFBQ */7"-*% XPSLFSQPTU.FTTBHF IFBQCVGGFS
<IFBQCVGGFS> QSPEVDF IFBQ "UPNJDTTUPSF IFBQ 7"-%*% "UPNJDTXBLF IFBQ DPOTU*/7"-*% PONFTTBHFGVODUJPO CVGGFS \ DPOTUIFBQ OFX6*OU"SSBZ CVGGFS "UPNJDTXBJU IFBQ */7"-*% DPOTVNF IFBQ ^ main worker 生産者と消費者
DPOTU4*(/"&-&% DPOTU&7&/5@" GVODUJPOGJSF RVFVF FWFOU5ZQF \ "UPNJDTTUPSF RVFVF FWFOU5ZQF
4*(/"-&% "UPNJDTXBLF RVFVF FWFOU5ZQF ^ GJSF RVFVF &7&/5@" DPOTU6/4*(/"-&% DPOTU&7&/5@" "UPNJDTXBJU RVFVF &7&/5@" 6/4*(/"-&% IBOEM&WFOU" main worker Event object
IUUQTCMPHTVOJUZEDPNKQVQEBUFEXFCHMCFODINBSLSFTVMUT
.BJO5ISFBE 8PSLFS5ISFBE CVGGFS CVGGFS CVGGFS CVGGFS CVGGFS CVGGFS CVGGFS DPQZ
5SBOTGFS 3FGFS 3FGFS DPOTUCVGGFSOFX"SSBZ#VGGFS XPSLFSQPTU.FTTBHF CVGGFS DPOTUCVGGFSOFX"SSBZ#VGGFS XPSLFSQPTU.FTTBHF CVGGFS <CVGGFS> DPOTUCVGGFSOFX4IBSFE"SSBZ#VGGFS XPSLFSQPTU.FTTBHF CVGGFS <CVGGFS>