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
わりこまれるはなし
Search
seki at druby.org
August 05, 2023
Programming
1.1k
0
Share
わりこまれるはなし
toRuby拡大版 (2023-08-05)
seki at druby.org
August 05, 2023
More Decks by seki at druby.org
See All by seki at druby.org
Programming with a DJ Controller — not vibe coding
m_seki
3
860
Agile Leadership Summit Keynote 2026
m_seki
1
1.3k
RWC2025 Ninja-testing with smart playlist
m_seki
4
1.3k
XP, Testing and ninja testing ZOZ5
m_seki
3
2.7k
XP, Testing and ninja testing
m_seki
3
1.1k
RWC 2024 DICOM & ISO/IEC 2022
m_seki
0
570
ERB, ancient and future
m_seki
3
1k
ERB Hacks
m_seki
1
1.7k
ぼくのかんがえたさいきょうのけいやくによるプログラミング
m_seki
2
1.5k
Other Decks in Programming
See All in Programming
ReactとSvelteのその先、Ripple-TS / Beyond React and Svelte: Ripple-TS
ssssota
0
200
ローカルLLMでどこまでコードが書けるか / How much code can be written on a local LLM
kishida
2
370
ふにゃっとしない名前の付け方 〜哲学で茹で上げる、コシのあるソフトウェア設計〜
shimomura
0
120
開発体験を左右するライブラリの API 設計 - GraphQL スキーマ構築ライブラリから考える #tskaigi
izumin5210
1
170
AIベース静的検査器の偽陽性率を抑える工夫3選
orgachem
PRO
4
460
AlarmKitで明後日起きれるアラームアプリを作る
trickart
0
140
ビジネスモデルから紐解く、AI+型駆動開発
hirokiomote
0
190
いつか誰かが、と思っていた フロントエンド刷新5年間の実践知
kiichisugihara
1
280
Terraform言語の静的解析 / static analysis of Terraform language
wata727
1
150
【ディップ|26年新卒研修資料】TDD実装演習
dip_tech
PRO
0
190
【ディップ|26年新卒研修資料】OpenAPI/Swagger REST API研修
dip_tech
PRO
0
170
Spec-Driven Development with AI Agents (Workshop, May 2026)
antonarhipov
3
380
Featured
See All Featured
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.5k
Code Review Best Practice
trishagee
74
20k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
160
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.4k
Exploring anti-patterns in Rails
aemeredith
3
360
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
180
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
180
RailsConf 2023
tenderlove
30
1.4k
4 Signs Your Business is Dying
shpigford
187
22k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.6k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Transcript
わりこまれるはなし
[email protected]
Ractorの中では限定的な操作しかできないぞ!の補足として話そうとしたが没にした
まとめ わりこまれたことを知るのは相当めんどくさいぞ 結局イベントループ的な構造が必要になるぞ イベントとかコールバックとかめんどくさいからスレッ ドにやらせればいいや!と思うかもしれないけど、その スレッドのためにイベントループが必要でなにも解決し ないぞ! 2
プログラムがわりこまれる? 実行中のプログラムがわりこまれるって なにか特別なイベントが発生したら 中断、変更、サービス開始... どうやって? 3
実行主体 プログラムが走ってるな!って感じるアレ コンテキストとかいうときもある? プロセス、スレッド、ファイバ(コルーチン) そういう概念あるでしょ? 4
昔のこと 1982 - 8bit PC(MZ-80系列) 1992 - RealTime OSとデバイスドライバ、pthread 1999
- dRuby 5
OSҎલ OSとかないころ
SHARP MZ-80 BASICのテキストだよ
BREAKキーとは! BASICインタプリタ ≒ REPL BREAKキーを押すとプログラムの実行を停止して、対話 モードに戻る BREAKキーに特別な能力があると信じていたがマシン語 で書いたサブルーチンは止まってくれない...なんでだ!? 当時BASICで書くと遅いルーチンはハンドアセンブルで 作ったサブルーチンをコールする、という宗派があった
shでいうとCtrl-Cとか? 8
関西弁...
BREAK
BREAKキーの実装 実際にはこんな感じ!RUNすると構文木を処理するぞ 11 BREAK RUN
BREAKキーの実装 OPコードを一つ処理する 12 BREAK
BREAKキーの実装 BREAKキーが押されているか見る 13 BREAK
BREAKキーの実装 OPコードを一つ処理する 14 BREAK
BREAKキーの実装 また見る 15 BREAK
BREAKキーの実装 OPコードを一つ処理する 16 BREAK
BREAKキーの実装 また見る...押されてた!! 17 BREAK
BREAKキーの実装 実行やめてプロンプトへ戻る 18 BREAK READY _
処理の合間にキーを見る 処理を小さな単位に分けて、その合間にBREAKキーが押 されているか調べてる 都合のよいときにチラ見する→ポーリング これは割り込み機能がないからなの!? OSがあればこんな苦労しなくて良いのに(妄想 それはどうかな... 19
signal UNIXのケース 20
signal Ctrl-Cで停止させるのは? 止めてるのはOS側 じゃあプロセスがうけとるときは? 21 signal
signal シグナルがきた!実行主体は横取りされるぞ 22 signal
signal 割り込みサービスルーチン 本体とは別人格 async-signal-safe関数のみ preemptiveとかいう 23 signal
async-signal-safe 本体がどのような状態でも別人格に切り替わる mallocなどのメモリ管理中や再入可能でない関数の中、ト ランザクション的な処理の途中であっても別人格になる 本体を壊さないように限られた処理だけが許されている async-signal-safeと言われる操作だけだよ 「許されている」っていうのは約束を守れば動くけど、 守っていないことをコンパイラが教えてくれたりはしな いぞ みんなもシグナルハンドラでログを書いていた先人のコードで困ったことがあるはず
24
signal 割り込みサービスルーチン 本体とは別人格 async-signal-safe関数のみ 大域変数に遺言を残して終了 たいしたことはできないので、割り込まれたよーというメモを残して終わる 25 signal
signal 割り込みサービスルーチン 本体とは別人格 async-signal-safe関数のみ 大域変数に遺言を残して終了 本体は... 割り込まれたことを知らないので... 残されたメモを定期的に見に行くことに Rubyでsignalつかってもこういうことは身につかないかもしれん 26
signal
signal 割り込まれたときに気づけない 長いシステムコール中ならEINTR わかることもあるがわからないこともある 割り込まれたときに気づけないので、都合の良いときに メモがないか調べることになる なんらかのイベントループを構成しとく必要がある またか! 27
pthreadのcancel RubyでいうところのThread#killのはなし スレッドを任意の瞬間に止めることはできない malloc中とかトランザクション中とかさっきのasync- signal-safeと同じようなもの 次の都合のよいときに止まってくださいな pthread_cancel() cancel要求受けました、というメモをしておく 標準ライブラリは呼ばれたときにメモを見て自殺する めっちゃ使いにくい!!
Rubyのスレッドは楽すぎて堕落する 28
select族が便利 シグナルハンドラやスレッド間の通信が必要な局面で socket_pairやpipeなどを用いるテクニックも多い FDとして扱える select族で多元待ちも簡単 一度に複数の事象を待てる select()使えるようになって歓喜した人たちがいた(旧世紀) 29
都合のよいときにメモを見る 割り込まれた!は自分で見る 確認する単位はいろいろ OSがあるとメモを効率よく書いてくれる でも本質的な形はかわらない 実行主体には割り込めない 30
「処理の合間に見る」を反転 チラ見するたびに処理をする イベントドリブンのスタイル 巧みに隠されているけどWebのJSとか コールバックを呼ぶ人はだれなのか?を想像しよう 31
コールバックめんどくさいから めんどくさいからマルチスレッドにしてみたー めんどくささは解決していない スレッド間通信もチラ見のループになる よくある勘違い 32
まとめ わりこまれたことを知るのは相当めんどくさいぞ 結局イベントループ的な構造が必要になるぞ イベントとかコールバックとかめんどくさいからスレッ ドにやらせればいいや!と思うかもしれないけど、その スレッドのためにイベントループが必要でなにも解決し ないぞ! 33