Path: sran265!katsu From: katsu@sran14.sra.co.jp (WATANABE katsuhiro) Message-ID: Date: 11 Jan 93 09:15:10 Organization: Software Research Associates, Inc.,Japan In-reply-to: mhiroshi@tansei.cc.u-tokyo.ac.jp's message of 4 Dec 92 04:27:42 GMT Newsgroups: fj.os.386bsd,fj.unix,fj.questions.unix Followup-To: fj.os.386bsd Subject: Re: How can I run a program with very large virtual memory? Distribution: fj References: <3615@tansei1.tansei.cc.u-tokyo.ac.jp> (Followup-To: に注意)  フォローの遅さならば *.jp で十指にはいるであろう渡邊@SRAです。 記事 <3615@tansei1.tansei.cc.u-tokyo.ac.jp> で mhiroshi@tansei.cc.u-tokyo.ac.jp (H. Murakami) さんいはく > IBM 386BSD0.1 でスワップをウンと大きく切って, > 大きな仮想メモリーを使う計算がしたいのです. > /usr/src/sys.386bsd/i386/include の下に > vmparam.h というファイルがあり, > そこに /* Virtual memory related constants, all in bytes. */ > とあり, > > #define MAXDSIZ (32*1024*1024) /* max data size */ > などとなっているところを, 例えば swap area を 1GB 取っておいてから, > ! #define MAXDSIZ (999*1024*1024) /* max data size */ > の様に変えて見たら, 走るようにはなったのですが, 途中で, キー入力が > 受け付けられなくなり, panic を 起こしてシステムが落ちました.  386BSD はログインプロンプトが出ている所しか見たことないのですが、 もしかしたら関係あるかもしれませんので、4.3BSD に由来する OS について 気づいたことを(ソースを参照せずにわかる範囲で)書いておきます。  逆に、386BSD での違いを教えてもらえると面白いと思います。  4.3BSD では、各プロセスのデータやスタックがスワップ空間のどこに pageout/swapout されるかを示すために、proc 構造体の中に swap map というものを保持しています。swap map で取り扱えるデータの大きさが MAXDSIZ や MAXSSIZ より大きい必要があることは明らかでしょう。  swap map で扱える空間の大きさ maxdmap は、NDMAP (cf. ), DMMAX, DMMIN (cf. ) をパラメーターにして、  maxdmap := ((NDMAP - log2(DMMAX / DMMIN) + 1) * DMMAX - DMMIN) * 512 のようになります(cf. 文献 [1])。すなわち  maxdmap > max(MAXDSIZ, MAXSSIZ) という制約式を満足するように調整せねばならないはずです。  実際にどれをどう調整するかという話に移ります。  user 構造体が変わってバイナリーの互換性が問題になるのを避けるため、 NDMAP は変えないほうがよいでしょう。スワップを沢山消費するプロセスが ひとつあるからといって、全てのプロセスがスワップを沢山消費するわけでは ない(あるいはスタックもたくさん消費するようになるとは限らない) でしょうから、DMMIN も大きく変えず、結局主に DMMAX の調整でしのぐのが よさそうです。  例えば、標準で NDMAP == 38, DMMIN == 32 であったなら、DMMAX を 131072 にすることで、swap map が約 1.8G までの空間を扱うようになる はずです。  DMMIN, DMMAX は2の冪乗でなければならないかもしれません。  実際には DMMAX は上のような方法での見積りより大きくしておいても かまわないことでしょう。というのは、スワップ空間の割り当ての単位として DMMAX, DMMIN がそのまま使われるわけではなく、これらの値や MAXDSIZ や スワップ空間の大きさを参考に起動時に計算される dmmax, dmmin の方が 使われるからです。( のコメントには、vminit() という関数で計算している旨の記述がありますが、実は他にも swapconf() でも設定している徴候があります。)  dmmin は DMMIN そのものです。dmmax の方は、スワップ空間の大きさや MAXDSIZ の値と比べて swap map がカバーする大きさが不必要に大きく ならないように、あるいは言い換えれば、不必要に大きなブロックサイズで スワップ領域が割り当てられるのを避けるために、DMMAX より小さい適当な 値が設定されることがあります。  つまり、DMMAX は大きめにしておいても dmmax に設定するときに適当な 値に切り詰められますから、神経質に正確に計算する必要がないといえます。  なお、上の制約は必要条件の一つに過ぎず、これさえ満たせばうまくいく という十分条件ではないかもしれません。  とにかく一度 maxdmap を調べてみてください。  最後に、本題とは無関係ですが、 > panic を 起こしてシステムが落ちました. という場合は、traceback の内容の概略を記しておくと、議論が一層 発展しやすくなると思いますよ。(386BSD には traceback がないのかな?) 参考文献 [1] Leffler S.J., M.K.McKusick, M.J.Karels, and J.S.Quarterman, "The Design and Implementation of the 4.3BSD UNIX Operating System", Addison-Wesley, Reading, MA, 1989, ISBN 0-201-06196-1. (翻訳:中村明,相田仁,計宇生,小池汎平,「UNIX 4.3BSDの設計と実装」,丸善, 1991年,ISBN 4-621-03607-6) プロセスごとの swap map については、5.6 Per-Process Resources の章。 -- 渡邊克宏@SRAソフトウェア工学研究所