- ベストアンサー
PC-98で拡張メモリを使えたら・・・。
PC-98シリーズ/MS-DOS(Ver.6.2)/MS-C 「今時98か!?」って言わないで下さい。仕事なんです・・・。 malloc関数で、メモリ不足を起こしているPGを直さなければならなくなりました。EMSメモリ等拡張メモリが使えれば解決できるんじゃないかなぁと漠然と思ったのですが・・・。何かいい方法はありませんか?(サンプルなど添えていただけるとうれしいのですが)よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
私「愛用」のMS-Cはversion7.0Aですので バージョンが違ってたらお役に立てないかもしれませんが ご了承下さい ---- メモリが足らないとの事ですが 私の思いついた解決方法は2つあります ---- 「1:メモリモデルの変更」 ご存知でしたら読み飛ばして下さい MS-DOS…というよりMS-Cは 6種類のメモリモデルと呼ばれるものがあります 詳しい説明は省かせて頂きますが 簡単に言えば(デフォルトの)データのアドレッシングを 16ビット・32ビットのどちらで行うかという事です 通常は最小サイズのスモールメモリモデルが適用されます この場合(デフォルトの)データの参照は 16ビットですので malloc で利用できるメモリは 64キロバイト以下に制限されます これじゃちっちゃすぎますよね! そこでメモリモデルをより大きいものに変更します ミドルメモリモデル・ヒュージメモリモデルの2つが 候補として考えられますが ここは確実性の為に最大のヒュージメモリモデルにします 方法としては CL コマンドラインオプションに /AH を追加して下さい これでデータの参照は32ビットで利用できますから 利用できるデータサイズはかなり大きくなります 因みにポインタのサイズが変わるので 不具合が発生しない様に注意が必要ですが… また メモリモデルを変更せずにもデフォルトセグメントを 越えてアクセスは可能でして… 動的配置に malloc ではなく _fmalloc や _halloc を利用するのですが 詳しくはマニュアルでお願いします… ---- 「2:拡張メモリ等を使用」 あとはおっしゃる通り拡張メモリ等を使用する方法ですね バージョン7.0Aではサポートされているのですが 実はランタイムライブラリの中に 仮想メモリを扱ってくれるモジュールが有って 関数は _vheapinit _vheapterm _vmalloc _vfree ... といった感じでまだまだ有ります これは仮想メモリ初期化の _vheapinit 関数の引数で 拡張メモリ・EMSメモリを利用するか ディスクにスワップするか指定出来ますから 全部適用しておけばメモリ不足なんて消え去ります ---- てな感じでどうでしょうか それではおやすみなさい(←?)
その他の回答 (4)
- YoshiMu
- ベストアンサー率41% (96/229)
アッパーメモリの空きが37kですか。 config.sysで登録しているものの中でdevice=と指定されているものをdevicehigh=と書き換えてみるとか、autoexec.batの中で常駐ソフトをloadhighとかしてアッパーメモリに逃がすというアイデアではあまり救えなそうですね。 今更の質問ですみませんが、mallocで取得したいと思うメモリのサイズを教えていただけないでしょうか?mallocがうまくいかないためにEMSを使用するというのは、あまり良いアイデアとは思えないもので...。 一応EMSに関わる説明のページをお知らせしておきますけれど、理解しにくいようなら補足しますので。
お礼
早急な対応だったため、今回はハードディスクに逃がす方法をとりました。 いろいろアドバイスをいただきましてありがとうございました。メモリに関しては、じっくり考えていきたいと思っています。わからないことがまた出てきたらよろしくお願いいたします。
- JunkMaster
- ベストアンサー率21% (23/106)
基本的にはコンベンショナルメモリしかmallocの対象になりません。 解決策としては (1)DOSエクステンダによりプロテクトメモリを使用する。 もうどこもサポートしていないでしょうね。 (2)mallocで使用している部分をHDDにとるように書き換える。 プログラムにもよりますが、配列に格納できるようなデータであれば、メモリ取得ルーチンをディスクに対して行えるようなdalloc関数を作成するのも有効です。 (3)プログラムを分割する。 オーバーレイするように設計しなおし、コンベンショナルエリアを空ける。 ただし、分割設計によってはまったく意味がないこともあります。
お礼
早急な対応だったため、今回はハードディスクに逃がす方法をとりました。 いろいろアドバイスをいただきましてありがとうございました。メモリに関しては、じっくり考えていきたいと思っています。わからないことがまた出てきたらよろしくお願いいたします。
- honiyon
- ベストアンサー率37% (331/872)
こんにちは、honiyonです。 HIMEMを使うのも手ですが、基本はやっぱりプログラムスリム化です。 ○無駄な処理を省く 汎用的に作ってある関数があり、一定の用途にしか使っていない場合は その用途に特化し、処理をスリム化する。 ○無駄なデータは即破棄 無駄に mallocして使いもしてないメモリは、使用後即freeする。 ○無駄に大きい変数を消す 255まで使いもしないのに intやlongで確保しているものは smallint に定義し直す。 ○無駄な関数呼出は回避する。 繰り返し使うものでもないのに(多分汎用性を重視して)関数化してあ るものを、直接本処理に組み込んでしまう。 ○いざとなればアセンブラ メモリ効率の悪そうな処理を、アセンブラで効率の良い処理を記述する。 (最近コンパイラ頭良いから逆に非効率になるかも?) あと、データをテンポラリファイルを作って、ファイルに吐き出すのも手ですね。 で、必要になったら読み込んで来る。 スワップファイルの要領です。 とりあえずアドバイスでした。 参考になれば幸いです(..
お礼
確かにおっしゃる通りです。非常に効率の悪い作りをしてあります。 ただ今回は、早急な対応だったためハードディスクに逃がす方法をとりました。 いろいろアドバイスをいただきましてありがとうございました。こいつは、気合を入れてスリムにしていきたいと思っています。
- YoshiMu
- ベストアンサー率41% (96/229)
とりあえず、PGが動いていない状態のメモリ量はいくつか教えていただけると助かります。 EMSを使う方法、DOSエクステンダに頼る方法など、いくつか思いつきますが、いずれもクセがあり、簡単ではないです。 まず、思ったのが、デバイスドライバの調整でUMB/HMAを駆使してDOSメモリ領域をできるだけ大きく取る努力をしたほうが良いのでは?ということでした。
補足
難しそうなのですね・・・。 ちなみにMS-Cは、Ver.6.0Aを使用しています。 下記は、「MEM」をリダイレクションしたものです。 メモリの種類 合計 = 使用 + 空き ---------------- -------- -------- -------- コンベンショナル 640K 146K 494K アッパー メモリ 78K 41K 37K 予約済み 384K 384K 0K XMS メモリ 14,258K 2,677K 11,581K ---------------- -------- -------- -------- 全メモリ 15,360K 3,248K 12,112K 全 1MB 以下メモリ 718K 187K 531K 全 EMS メモリ 14,272K (14,614,528 バイト) 空き EMS メモリ 11,696K (11,976,704 バイト) 最大実行可能プログラムサイズ 493K (505,312 バイト) 最大空きアッパーメモリブロック 19K (19,344 バイト) MS-DOS はハイメモリ領域に常駐しています.
お礼
MS-C Ver.6を使用しておりましたので拡張メモリのサポートは、ありませんでした。今回はハードディスクに逃がす方法をとりました。 いろいろアドバイスをいただきましてありがとうございました。メモリに関しては、じっくり考えていきたいと思っています。わからないことがまた出てきたらよろしくお願いいたします。