2023-11-28

rw
·

しばらく間が空いた。睡眠不足気味の日々が続く。連休で生活リズムを崩すと平日に響くのが玉に瑕。だんだん冬らしい気候になってきているのもあり、ジムへの足が遠のいていたり寝起きが悪くなったりもしている。

ピアノの練習を徐々に再開している。YouTubeルーパーを使ってカノンを区間リピートしながら運指を確認しているおかげか、あまり指はもつれなくなってきたように感じる。楽譜が欲しいところではあるが最近街中に行けてないのでなかなか買えずにいる。ハノンとかバイエルもせっかく持っているのだから練習したほうが上手くなるのだろうが、少しモチベが足りてない。

FFIで浮動小数点数演算の例外が発生した際にプロセスが終了してしまうという話題があった。この場合に何をすれば良いかという解だけは知っているが、詳しい事情はあまり知らなかったので少し調べた。まず浮動小数点数演算の例外としてオーバーフローとかゼロ除算などがあるが、これらはSIGFPEというシグナルでOSに通知される。仕組みとしてはCPUの浮動小数点数演算命令の結果としてステータスレジスタに例外が発生したかどうかを表す値が書き込まれ、それを受けてOSは現在の処理を中断し、あらかじめ設定されたシグナルハンドラーを呼び出すようになっているそう。ここでシグナルハンドラーが設定されていなければ復帰に失敗してプロセスが終了するようになっている模様。この辺の仕様はIEEEの定義する浮動小数点数の規格の一部されているらしい。話を戻すと、FFIを呼び出す際にハンドラーが設定されていないから落ちているという状況のようだ。ではその言語自体でゼロ除算が発生した場合はどうなっているか? ホスト言語がCの場合は落ちるが、例えばPythonの場合は言語側の例外送出に載せてくる。ということはシグナルハンドラーが設定されていると考えられそうだが、その場合はFFIでゼロ除算が発生してもPython側の例外となる気がする。Common Lisp(SBCL)の例では、Lisp外でシグナルを受け取りそれをLisp側に再通知しているように見えるが、Lisp内でゼロ除算した時も同じハンドラーが呼ばれていないとおかしい。あるいは同一のハンドラー内で分岐している? と、ここまで考えて分からなくなったのでSBCLのシグナルハンドリングしている箇所のソースコードを読んだらスレッドの話が出てきた。なるほどプロセス単位ではなくスレッド単位でハンドラーは設定されるらしい。よく考えたら件の浮動小数点数例外で落ちる状況はマルチスレッドで見ることが多いことに気付いた。もしかしたら、メインスレッドならホスト言語側がシグナルを適切にハンドリングしてくれるが、別のスレッドだと設定してないから落ちるということなのか? 要調査。

長くなってしまった。今日こそは早く寝ようと思ったのに寝不足が加速してしまう……

@rw
1日振り返って思ったことを書きたい