- PR -

CPU数(物理プロセッサ数)の取得

1
投稿者投稿内容
ken90H
会議室デビュー日: 2003/04/11
投稿数: 5
お住まい・勤務地: 芦屋市
投稿日時: 2003-10-09 14:08
はじめまして、ken90Hと申します。

現在、ソフトウェアのプロテクト機能を作成していますが、作業上、CPU数(物理プロセッサ数)を取得しなければならなくなりました。Javaの標準APIではCPUのアーキテクチャーは取得できると思いますが、数まで取得できなかったと思います。それで、他の方法について教えていただけないでしょうか?
どうぞ、よろしくお願いしますm(_ _)m

--補足--
環境:Windows, UNIX, Linux(全プラットフォームで動くプログラム)
JDK:JDK 1.3, 1.4

[ メッセージ編集済み 編集者: ken90H 編集日時 2003-10-09 14:12 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2003-10-09 14:47
「他の方法」とは、nativeで書く方法でしょうか?
挙げている OS では x86,Sparc,PPC,Alpha などといろんな CPU が使われる可能性がありますので、汎用的な方法はないかと思われます。
まずはプラットフォーム、CPUを絞って調べる必要がありそうですね。
すくなくとも Javaではできなさそうです。
顔爺
ベテラン
会議室デビュー日: 2003/10/03
投稿数: 52
投稿日時: 2003-10-09 14:51
顔爺と申します。

java.lang.Runtime.availableProcessors() は使えませんか?

-- 追記 --
確認したらこのメソッドは 1.4 で追加されたものなので、
1.3 系では駄目ですね。


[ メッセージ編集済み 編集者: 顔爺 編集日時 2003-10-09 15:27 ]
とのっち
会議室デビュー日: 2003/09/26
投稿数: 8
投稿日時: 2003-10-09 14:53
Javaのコマンドを実行するときに、-Dオプションを使ってあげると、System.getPropertyで取得できます。簡単だけど力技っぽいですが・・・

たとえば、こんなクラスを作って、
public class HogeHoge{
public static void main(String[] args){
String cpunum = System.getProperty("cpu.num");
System.out.println("CPU NUMBER : " + cpunum);
}
}

実行するときに、
java -Dcpu.num=2 HogeHoge

とすると、
CPU NUMBER : 2

と表示されます。こんなんでいかがでしょうか?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2003-10-09 15:38
>java.lang.Runtime.availableProcessors() は使えませんか?
おぉ、1.4ではこんなメソッドがあったんですね。勉強になりました。ありがとうございます。

手元の Sparc が2つあるマシンでちゃんと2が返りました。
「物理」プロセッサ数とは規程されてないので、Hyper-Threading が有効な状態では何がかえるでしょうか。

tonoさん:
ソフトウェアのプロテクト機能として、CPU数に制限を加えるのにユーザに手動で数を指定させるのはちょっとナンセンスではないかと思われますが・・・。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-10-09 16:00
unibon です。こんにちわ。

引用:

インギさんの書き込み (2003-10-09 15:38) より:
>java.lang.Runtime.availableProcessors() は使えませんか?
おぉ、1.4ではこんなメソッドがあったんですね。勉強になりました。ありがとうございます。


上記でも述べられていますが、1.4 から備わった API なんですね。
ダメモトで 1.3 で使ってみるとやはり NoSuchMethodError になりました。

引用:

インギさんの書き込み (2003-10-09 15:38) より:
「物理」プロセッサ数とは規程されてないので、Hyper-Threading が有効な状態では何がかえるでしょうか。


Windows XP で試してみたら 2 が返りました。

他のやりかたとしては、CPU の数に依存するようなプログラムをわざと動かして判定するとか
(できるのだろうか?)。
なお、余談ですが、ライセンスを管理されるユーザの立場からの要望を言えば、
ハイパースレッディングは 2 CPU とみなさず 1 CPU とみなしてほしいのが心情です。
#別に2つ分速いわけではないので。
ken90H
会議室デビュー日: 2003/04/11
投稿数: 5
お住まい・勤務地: 芦屋市
投稿日時: 2003-10-09 17:05
早々の返信ありがとうございました。
様々な良い意見、大変やくにたちました。
結果的に、java.lang.Runtime.exec()より
各OSに見合ったコマンドをキックすることで取得することになりました。
Windows: in the command prompt type:
cmd.exe /c echo %NUMBER_OF_PROCESSORS%
Solaris: in the command prompt type:
/usr/bin/uname -X
AIX: in the command prompt type:
/usr/sbin/lsdev -Cc processor
HPUX: in the command prompt type:
/bin/sh -c /usr/bin/sar -M 1 1 | awk 'END {print NR-5}'
Linux: in the command prompt type:
cat /proc/cpuinfo

ありがとうございましたm(_ _)m
1

スキルアップ/キャリアアップ(JOB@IT)