システムインタフェース

マルチスレッド化されたアプリケーションのチューニング

並行化されたマトリックス乗算などの計算のアプリケーションなどで、Solaris スレッドを十分に活用するには、Solaris のネイティブ関数 thr_setconcurrency(3T) を使用します。これにより Solaris 本来のマルチスレッド機能が Java アプリケーションで使用でき、複数プロセッサを完全に利用することが保証されます。これは、ほとんどの Java アプリケーションおよびアプレットには必要ありません。次のコードは、これをどのように行うかの例です。

最初の要素は、MPtest_NativeTSetconc() を使用する Java アプリケーション MPtest.java です。このアプリケーションは 10 個のスレッドを生成し、各スレッドは識別行を表示してから 10,000,000 回ループし、計算の多い活動のシミュレーションを行います。


例 2-3 MPtest.java

import java.applet.*;
import java.io.PrintStream;
import java.io.*;
import java.net.*;
 
class MPtest {
   static native void NativeTSetconc();
 
   static public int        THREAD_COUNT = 10;
 
   public static void main (String args[]) {
      int i;
      // set concurrency on Solaris - sets it to sysconf(_SC_NPROCESSORS_ONLN);
      NativeTSetconc();
      // start threads
      client_thread clients[] = new client_thread[ THREAD_COUNT ];
      for ( i = 0; i < THREAD_COUNT; ++i ){
         clients[i] = new client_thread(i, System.out);
         clients[i].start();		
      }
   }
 
   static { System.loadLibrary("NativeThreads"); }
}
 
class client_thread extends Thread {
   PrintStream out;
   public int        LOOP_COUNT   = 10000000;
   client_thread(int num, PrintStream out){
      super( "Client Thread" + Integer.toString( num ) );
      this.out = out;
      out.println("Thread " + num);
   }
   public void run () {
      for( int i = 0; i < this.LOOP_COUNT  ; ++i; ) {
				;
   	}
   }
}

2 番目の要素は、javah(1) ユーティリティによって MPtest.java から生成される C スタブファイル MPtest.c です。これを行うには、次のように入力します。


% javah -stubs MPtest.java

3 番目の要素は、同様に javah(1) ユーティリティによって MPtest.java から生成される C ヘッダファイル MPtest.h です。これを行うには、次のように入力します。


% javah MPtest.java

4 番目の要素は、C ライブラリインタフェースの呼び出しを実行する C 関数 NativeThreads.c です。


例 2-4 NativeThreads.c

#include <thread.h>
#include <unistd.h>

void MPtest_NativeTSetconc(void *this) {
		thr_setconcurrency(sysconf(_SC_NPROCESSORS_ONLN));
}

最後に、4 つのファイルを Java アプリケーション MPtest.class に結合するには、次のような makefile を使用して非常に簡単に実行できます。


例 2-5 MPtest の makefile

# make は、2 つのステージで行わなければならない。
# まず、"make MPtest" を実行する。
# 次に、NativeThreads.c を作成してネイティブ関数
# "thr_setconcurrency(sysconf(_SC_NPROCESSORS_ONLN))
# の呼び出しを組み込んでから "make lib" を実行する。
# その後、LD_LIBRARY_PATH および CLASSPATH を "." に
# 設定して "java MPtest" を実行できる。

JH_INC1=/usr/java/include
JH_INC2=/usr/java/include/solaris
CLASSPATH=.; export CLASSPATH

MPtest:
	javac MPtest.java
	(CLASSPATH=.; export CLASSPATH; javah MPtest)
	(CLASSPATH=.; export CLASSPATH; javah -stubs MPtest)
	cc -G -I${JH_INC1} -I${JH_INC2} MPtest.c NativeThreads.c ¥
		-o libNativeThreads.so
clean:
	rm -rf *.class MPtest.c MPtest.o libNativeThreads.so ¥
		NativeThreads.o *.h