From: Tanaka Akira Date: 2004-12-06T22:45:27+09:00 Subject: [ruby-dev:25080] Re: IO#flush dumps core again In article <87sm6jznqj.fsf@serein.a02.aist.go.jp>, Tanaka Akira writes: > それはそれとして、write 直前のコンテキストスイッチをなくすというのはそ > れほど悪くない考えかもしれません。 > > ただ、かなり状況がこみいっていて、今までと比べてどこが良くなってどこが > 悪くなるのかまだ把握できていませんが。 いろいろ考えた結果、stderr とそれ以外の sync=true な IO の 2つに話を分 割できることがわかりました。(sync=false な IO は大きな問題はないのでこ こでは無視します) 以前は、stderr は write 直前にはコンテキストスイッチを行っていませんで した。 以前は、stderr 以外の IO で sync=true なものは、stdio のバッファに入り 切るデータにを write するときにはコンテキストスイッチを行い、入り切ら ないデータのときにはコンテキストスイッチを行っていませんでした。 なんでこんな違いがあるかというと、stderr は stdio レベルでバッファリン グが行われないのに対し、sync=true な IO は stdio レベルのバッファリン グは行ったうえで fflush によって書き出していたからです。そして、fflush の直前にコンテキストスイッチが行われます。そして、STDERR.sync はじつは false で、stderr に対しては fflush は行われません。 というわけで、以前の挙動に似せるには、IO が stderr でないときにはコン テキストスイッチを行うというちょっとばかり奇妙な条件判断をすることにな るんじゃないかと思います。そうしないと、以前よりもコンテキストスイッチ の機会が減って、プロセス全体がブロックする機会が増えてしまいます。 -- [田中 哲][たなか あきら][Tanaka Akira]