Lions本読書会#16

http://atnd.org/events/26987 #kernelvm 絡みのツイートが約半分を占めているってどういうこと…… この読書会はホワイトボードを使った議論などが中心なので、 続きを読む
2
八丁堀マゴロク亭 @magoroku15

v6 の端末管理は、initが/etc/tty を見て、gettyをを呼ぶ。gettyがloginを呼ぶ。 てな感じでその後のUNIXと同じでした。

2012-04-22 22:01:02
七誌 @7shi

v6のputchar()の挙動を忘れていた。インタプリタを作った時に引っ掛かったことがいくつかあったけど、まとめなかったから忘れている。ちょっと見直そう。 #readLions

2012-04-22 22:10:45
七誌 @7shi

アセンブラのソースを見てもよく分からないから、トレースしてみよう。

2012-04-22 22:11:26
七誌 @7shi

パイプはオンメモリで処理されると思い込んでいたから、inodeを確保しているのに違和感を持っていた。そんなことをしたらディスクI/Oが発生してしまうのではないかと。しかし、オンメモリで処理されるべきという思い込みが間違っていた。 #readLions

2012-04-22 22:23:25
七誌 @7shi

パイプがinodeを持っていれば、他のプロセスが大量にI/Oを処理してバッファが不足したとき、普通の非同期I/Oと同じ枠組みでディスクに退避できる。非同期書き込みが発生する前に処理が終わればオンメモリで処理できる。ここまで見るととても合理的で感心した。 #readLions

2012-04-22 22:27:11
鯉江 @koie

@7shi わたしもパイプはディスクIOがないとおもってました。むかしはちがったんですね。

2012-04-22 22:27:37
七誌 @7shi

@koie はい、UNIX V6ではどう見てもディスクI/Oが発生しそうなコードになっていて、違和感を持ちました。その点を今日のLions本読書会で議論した結果、当時のメモリ事情ではそれが合理的な構造だというのが分かりました。

2012-04-22 22:30:26
鯉江 @koie

@7shi progSrc|progSink と動かしたときにパイプがいっぱいになるのはthruput(Src)>thruput(Sink)のときで、thruput(Sink)>thruput(IO)だとIOしないでprogSrcをブロックするのが有利?

2012-04-22 22:35:20
七誌 @7shi

@koie 誤解を招いたかもしれないので補足します。V6ではパイプのバッファは4KB決め打ちで、Srcからそれ以上書き込もうとするとsleepしてSinkの処理を待ちます。バッファ不足と書いたのは、無関係な他のプロセスが大量にI/Oして、そちらでキャッシュが消費されるケースです。

2012-04-22 22:41:06
七誌 @7shi

@koie というわけで、V6ではSrcの速度が上回ったときにディスクに退避するわけではないです。スループットについては比較できないため、ちょっと分かりません。

2012-04-22 22:42:22
鯉江 @koie

@7shi なるほど、4KBのバッファさえも貴重という時代だったんですね。

2012-04-22 22:42:48
七誌 @7shi

@koie はい、そのようです。その辺の感覚が今と違っていたので混乱しました。

2012-04-22 22:44:01
超電磁ねこきっく @finalfusion

@7shi ああ、古いのはディスク使うんですよね

2012-04-22 22:53:24
七誌 @7shi

@finalfusion はい、知らなかったので驚きました。

2012-04-22 22:54:16
kotrit @kotrit

実はもう次回の Lions 本読書会の atnd を用意してあるのです。http://t.co/amForEhn もしかしたら最終回になるかも回ですね。よろしくお願いします。 #readLions 概要: 05/27(日)13-18ルノアール西日暮里第一店2号室

2012-04-22 23:02:22
七誌 @7shi

@gokou___ruri V6が動いていたPDP-11はメモリ最大256KBです。V6にはバッファが512バイト×15個の7.5KBしかなく、パイプもディスクキャッシュもそのバッファを共用するため、複数プロセスが同時に動いているとすぐにバッファを使い切ってしまうみたいです。

2012-04-22 23:25:24
七誌 @7shi

@gokou___ruri はい、そうです。バッファはユーザー側ではなくカーネル側のメモリ空間に置かれていて、全プロセスで共用されています。そのためユーザー側のメモリ空間は圧迫しません。

2012-04-22 23:34:36
七誌 @7shi

putchr.sを読んでも要領を得なかったけど、トレースを眺めてようやく仕様が分かった。foutが2以下ならバッファリングされない。一度理解したはずが完全に忘れていた。放置するとまた忘れてしまうので、今のうちにまとめよう。 #readLions

2012-04-23 00:22:21
七誌 @7shi

UNIX V6のputchar()内部でのバッファリングをまとめました。昨日の読書会で説明に詰まって保留にした箇所です。 http://t.co/oOLXRNUM #readLions

2012-04-23 01:53:49
takahiro(John Smith) @superhoge

パイプの凄いところの一つ。パイプって機能を追加するために書かれたコードがたったの200行くらいだってこと。ファイルシステムの上にパイプって仕組みを持ってきたことの利点の一つ #readLions

2012-04-23 07:00:34
takahiro(John Smith) @superhoge

v6以降も、既存の仕組みの上に載っかって新しい仕組みを追加するっていうことをよくやっているようで(例:ネットワーク)、やはりv6に搭載されている仕組みがどの時代にもコアとなる部分なんだなぁと思った #readLions

2012-04-23 07:03:04
takahiro(John Smith) @superhoge

パイプ通信を開始するときには、オープン済みのファイル(u.u_ofile[])がforkで子プロセスに継承され、execで変更がないという仕様を利用するのだけれど #readLions

2012-04-23 07:04:39
takahiro(John Smith) @superhoge

v7では、ioctlシステムコールを使うと、ファイル単位でexecのときにオープン済みのファイルをクローズすることができるっぽい。つまり、子プロセスにオープン済みファイル情報を継承させなくすることができるっぽい。関連した話題として思い出した #readLions

2012-04-23 07:07:50