HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0822
理沙sysinfo(33)〜(39)で9解決


理沙

リンク

2006/8/22(Tue) 18:35:55|NO.2101

こんにちわ〜。お久しぶりです。

sysinfoに関して質問なのですけど、

// 物理メモリ pe = sysinfo(35) pa = sysinfo(34) // 合計メモリ te = sysinfo(39) ta = sysinfo(38) // 仮想メモリ ie = sysinfo(39)-sysinfo(35) ia = sysinfo(38)-sysinfo(34) // 表示してみる mes ""+pe+" / "+pa mes ""+ie+" / "+ia mes mes ""+te+" / "+ta stop

で考えてみると、仮想メモリが100%を超えてしまいます。

スワップファイルについては、調べてみましたが、
スワップファイル=仮想メモリ なのか不安で、
上のように計算して表示したところ、さらに謎が深まってしましました・・・(涙

そもそも実在しないメモリに容量があるのが理解できませんが、
それ以前に、100%を超えるのも・・・(><;

よろしかったら、助けて貰えないでしょうか?



この記事に返信する


あげなす

リンク

2006/8/22(Tue) 20:22:51|NO.2102

言葉の説明がなかったのでよく理解できませんでしたが、
よくヘルプジャーマネとか見ましたか?
"空き"とか"合計"とか…

ちなみに仮想メモリーというのは物理メモリー(実際にPCのマザーボードに
乗っかってるメモリー)とは違って、HDD上に作られた一時的なメモリーです。
物理メモリーが一杯になったときにそれ以上を確保する必要があるために
HDDに仮想メモリー領域が作成されます。



理沙

リンク

2006/8/22(Tue) 22:46:45|NO.2103

あ、はいっ、すみません(^^;
ヘルプは何度も確認したつもりです(涙

上の短いスクリプトは、
あたしのパソコンの容量を見てみようと思って、簡単に表示したものです。

それぞれ、 空き/合計 という表示をしています。

スワップファイル=仮想メモリではないようなので、
仮想メモリ = 合計メモリ - 物理メモリ
として計算しました。

これを実行すると、あたしのパソコンでは、

56766464 / 234344448
2018508800 / 1913008128

2075275264 / 2147352576

のように、真ん中の仮想メモリが、合計よりも空きの方が多くなってしまいます。
Windows2000 ですが、WindowsME でも同じようになります。

もしかしたら、物理メモリ + 仮想メモリ = 合計メモリ ではないのでしょうか?
よくわからないので、よろしくお願いします☆



KIMU

リンク

2006/8/23(Wed) 05:59:49|NO.2104

>スワップファイル=仮想メモリではないようなので
同じものと考えても間違いでは無いような?
仮想メモリで設定した大きさでスワップファイルは
作られます。(実際の使用量に関係なく)

で、問題はそこじゃなく、sysinfoで仮想メモリの計測がまともに出来てないんじゃないか?
って事だと思う

家では、実メモリ512MB、仮想800〜1024MBとして設定してますが
>38 : 数値 仮想メモリを含めた全メモリサイズ
の取得で帰ってくる値は、理沙さんと同じ 2147352576でした。
この値は仮想メモリを変更しても変化がないようです。
よって確実にバグです。

で、一応まともに収得出来るかもしれない方法

x=1024*1024 mes "物理メモリ(34) "+str(sysinfo(34)/x)+"MB" mes "使用物理(34-35) "+str((sysinfo(34)-sysinfo(35))/x)+"MB" mes "物理空き(35) "+str(sysinfo(35)/x)+"MB" mes "----------------------------------------------------------" mes "スワップ(36) "+str((sysinfo(36))/x-480)+"MB" mes "使用PF(36-37) "+str((sysinfo(36)-sysinfo(37))/x)+"MB" mes "スワップ空き(37) "+str(sysinfo(37)/x-480)+"MB" mes "----------------------------------------------------------" mes "合計メモリ(36-34) "+str(((sysinfo(36))+sysinfo(34))/x-480)+"MB" mes "合計空き(37-35) "+str(((sysinfo(37))+sysinfo(35))/x-480)+"MB"
でも、他の環境では、うまく行かないかも知れない・・・

WinXPsp1での場合(自分所の環境では)
> 36 : 数値 スワップファイルのトータルサイズ
> 37 : 数値 スワップファイルの空きサイズ
この二つが何故か 503316480 (480の20乗?)が加算された状態で値が返ってくる
仮想メモリの大きさを変えても 480<<20 が加算されていた。

あ、仮想メモリや実メモリが$7fffffffを越えてるとマイナスで
帰って来たりするから注意



I386

リンク

2006/8/23(Wed) 10:39:57|NO.2105

バグ、ですかねぇ。
こちらでも同じことが起こってしまいました。

>あ、仮想メモリや実メモリが$7fffffffを越えてるとマイナスで
>帰って来たりするから注意
それにしてもメモリーが2GB以上あるとマイナスになるのは勘弁してほしいですね。
fxinfo のモード32 みたいに数値ではなく文字列で取得できたりすると助かるのでは。
まぁ、

n=sysinfo (34) n=n/(1024*1024) if n < 0 : n+4095 mes "メモリーサイズ : "+n+"MB"
こうすれば 4GBまで取得できますが…



tks

リンク

2006/8/23(Wed) 14:05:14|NO.2109

回答になりませんが、このsysinfo34〜39はkernel.dllの
GlobalMemoryStatusだと思います。ですからそちらを
調べてみるのも手かと。


#include "kernel32.as" dim ms,8 GlobalMemoryStatus varptr(ms) repeat 8 mes ms(cnt) loop mes "" repeat 6 mes sysinfo(34+cnt) loop



tks

リンク

2006/8/23(Wed) 14:09:14|NO.2110

> 回答になりませんが、このsysinfo34〜39はkernel.dllの

kernel.dllではなくてkernel32.dllです。



KIMU

リンク

2006/8/23(Wed) 16:58:51|NO.2111

色々検索してみたけどページファイルには関心が無いのか情報が無かった・・・

>tksさん
>GlobalMemoryStatusだと思います。ですからそちらを
sysinfoと違いがありませんでした。

>I386さん
>バグ、ですかねぇ。
kernel32.dllでも同じ値が帰って来るから、なにか仕様でもあるんだろうか
物理メモリが512MBじゃ無い人は 480<<20 とは違う値が足されたりするのかな・・・
>38 : 数値 仮想メモリを含めた全メモリサイズ
>よって確実にバグです。 480<<20
これが、バグなのかも良く分からなくなった・・・

>自己レス
>>スワップファイル=仮想メモリではないようなので
>同じものと考えても間違いでは無いような?
仮想メモリで 物理メモリ+スワップファイル として扱ってる人も多いみたい・・・
自分的には

仮想メモリ=スワップファイル (実際にスワップが起きなくても存在するし)
仮想メモリ空間=物理メモリ+スワップファイル

って感じなんだけど・・・



Irisawa

リンク

2006/8/23(Wed) 23:01:49|NO.2113

> それにしてもメモリーが2GB以上あるとマイナスになるのは勘弁してほしいですね。

HSPのint型がsigned intであるため、これは仕様です。
(unsigned intの必要性は以前から要望があるのですが今のところ実装される予定は
なさそうです)

代替案としてはtksさんのサンプルを元に以下のようにstrf関数で%u書式を使えば
unsigned int型に変換した文字列を取得できます。


#uselib "kernel32.dll" #func GlobalMemoryStatus "GlobalMemoryStatus" var dim ms,8 ms(0) = 32 GlobalMemoryStatus ms repeat 6, 2 mes strf("%u", ms(cnt)) loop mes "" repeat 6 mes strf("%u", sysinfo(34+cnt)) loop stop

ただし、strf関数の戻り値は文字列ですので数値演算が出来ません。ご注意下さい。

> こうすれば 4GBまで取得できますが…

MSDNライブラリによると

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpmemory/html/_win32_globalmemorystatus.asp

> 仮想アドレス空間の拡張部分に関する情報を取得する場合や、4GB を超える
> メインメモリを実装したコンピュータでアプリケーションを実行する可能性が
> ある場合は、GlobalMemoryStatusEx 関数を使ってください。

とのことです。

あと、

> Windows 2000 は、-1 という値を使ってオーバーフローを表します。
> Windows NT の従来のバージョンは、実際のメモリに対する 4GB の
> 剰余( たとえば 5GB の場合、剰余は 1GB)を返します。
> この理由により、Windows 2000 では代わりに GlobalMemoryStatusEx 関数を
> 使ってください。

とも書いてあります。

http://msdn.microsoft.com/library/ja/jpmemory/html/_win32_globalmemorystatusex.asp

この辺りは難しいところでよく分かりませんね。
あと、仮想メモリ合計サイズは常に変動しているので毎回同じ値が返るとは限りません。



理沙

リンク

2006/8/23(Wed) 23:25:13|NO.2114

皆様、返信どうもありがとうございます☆

>503316480
480*2^20 ですよね〜。確かに…

>kernel32.dllでも同じ値が帰って来るから、なにか仕様でも
あたしも同じこと考えました。

そんで、MSDNにいったところ、
Irisawaさんに書いて頂いたような情報を得ることができました♪
ただ理解はできていないかも(笑

>unsigned int型に変換した文字列を取得できます。
サンプルありがとうございます☆
助かります(^^

結局、OS情報を取得して、
GlobalMemoryStatus
GlobalMemoryStatusEx
を使い分けてみるのが、一番効率がよさそうです。

できれば、ヘルプなんかに書いておいて欲しかったですけど(><

皆様のお陰で、ぐっすり眠れそうです(笑
ほんとに助かりましたっ!
ありがとうございましたぁ(^^/



ONION software Copyright 1997-2021(c) All rights reserved.