toRuby拡大版 (2023-08-05)
わりこまれるはなし[email protected]Ractorの中では限定的な操作しかできないぞ!の補足として話そうとしたが没にした
View Slide
まとめわりこまれたことを知るのは相当めんどくさいぞ結局イベントループ的な構造が必要になるぞイベントとかコールバックとかめんどくさいからスレッドにやらせればいいや!と思うかもしれないけど、そのスレッドのためにイベントループが必要でなにも解決しないぞ!2
プログラムがわりこまれる?実行中のプログラムがわりこまれるってなにか特別なイベントが発生したら中断、変更、サービス開始...どうやって?3
実行主体プログラムが走ってるな!って感じるアレコンテキストとかいうときもある?プロセス、スレッド、ファイバ(コルーチン)そういう概念あるでしょ?4
昔のこと1982 - 8bit PC(MZ-80系列)1992 - RealTime OSとデバイスドライバ、pthread1999 - dRuby5
OSҎલOSとかないころ
SHARP MZ-80BASICのテキストだよ
BREAKキーとは!BASICインタプリタ ≒ REPLBREAKキーを押すとプログラムの実行を停止して、対話モードに戻るBREAKキーに特別な能力があると信じていたがマシン語で書いたサブルーチンは止まってくれない...なんでだ!?当時BASICで書くと遅いルーチンはハンドアセンブルで作ったサブルーチンをコールする、という宗派があったshでいうとCtrl-Cとか?8
関西弁...
BREAK
BREAKキーの実装実際にはこんな感じ!RUNすると構文木を処理するぞ11BREAK RUN
BREAKキーの実装OPコードを一つ処理する12BREAK
BREAKキーの実装BREAKキーが押されているか見る13BREAK
BREAKキーの実装OPコードを一つ処理する14BREAK
BREAKキーの実装また見る15BREAK
BREAKキーの実装OPコードを一つ処理する16BREAK
BREAKキーの実装また見る...押されてた!!17BREAK
BREAKキーの実装実行やめてプロンプトへ戻る18BREAK READY_
処理の合間にキーを見る処理を小さな単位に分けて、その合間にBREAKキーが押されているか調べてる都合のよいときにチラ見する→ポーリングこれは割り込み機能がないからなの!?OSがあればこんな苦労しなくて良いのに(妄想それはどうかな...19
signalUNIXのケース20
signalCtrl-Cで停止させるのは?止めてるのはOS側じゃあプロセスがうけとるときは?21signal
signalシグナルがきた!実行主体は横取りされるぞ22signal
signal割り込みサービスルーチン本体とは別人格async-signal-safe関数のみpreemptiveとかいう23signal
async-signal-safe本体がどのような状態でも別人格に切り替わるmallocなどのメモリ管理中や再入可能でない関数の中、トランザクション的な処理の途中であっても別人格になる本体を壊さないように限られた処理だけが許されているasync-signal-safeと言われる操作だけだよ「許されている」っていうのは約束を守れば動くけど、守っていないことをコンパイラが教えてくれたりはしないぞみんなもシグナルハンドラでログを書いていた先人のコードで困ったことがあるはず24
signal割り込みサービスルーチン本体とは別人格async-signal-safe関数のみ大域変数に遺言を残して終了たいしたことはできないので、割り込まれたよーというメモを残して終わる25signal
signal割り込みサービスルーチン本体とは別人格async-signal-safe関数のみ大域変数に遺言を残して終了本体は...割り込まれたことを知らないので...残されたメモを定期的に見に行くことにRubyでsignalつかってもこういうことは身につかないかもしれん26signal
signal割り込まれたときに気づけない長いシステムコール中ならEINTRわかることもあるがわからないこともある割り込まれたときに気づけないので、都合の良いときにメモがないか調べることになるなんらかのイベントループを構成しとく必要があるまたか!27
pthreadのcancelRubyでいうところの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