2008年5月28日水曜日

分散(第1章)

このエントリーをはてなブックマークに追加



「分散システム 原理とパラダイム」
アンドリュー・S. タネンバウム (著), マールテン・ファン スティーン (著), Andrew S. Tanenbaum (原著), Maarten van Steen (原著)

↑の本を読むことになったので、まとめていきます
今回は第1章



■分散システムの定義
分散システムはそのユーザに対して単一のコヒーレントシステムとして見える独立したコンピュータの集合である。

例1)大学や会社部署におけるワークステーションのネットワーク
例2)注文の自動処理を支援する作業フロー情報システム
例3)World Wide Web


■目標
○ユーザとリソースとの接続
例えば、1つのプリンタを複数ユーザで共有

○透過性
プロセスやリソースが複数のコンピュータにまたがって物理的に分散されている事実を隠蔽したい。

○開放性
インターフェース定義が重要
メカニズムからポリシーの分離

○スケーラビリティ
拡張のし易さ


■ハードウェア概念
○マルチプロセッサ
全てのCPUは共有メモリに直接アクセス


○同種マルチコンピュータシステム
各CPUはそれ自身のローカルメモリを持つ

○異種マルチコンピュータシステム
分散システムの多くはコレ


■ソフトウェア概念
○分散オペレーティングシステム
-ユニプロセッサオペレーティングシステム
CPUが1つだけのコンピュータを管理

-マルチプロセッサオペレーティングシステム
CPUが複数のコンピュータを管理

-マルチコンピュータオペレーティングシステム

-分散共有メモリシステム

■ミドルウェア
分散透過性を改善するために用いられるソフトウェアの付加的な層

○ミドルウェアモデル

○ミドルウェアサービス
-通信機能
-アクセス透過性
-名前付け
-永続性

■まとめ
分散システムは共同で動作する
○利点
-異なるコンピュータで動作する異なるアプリケーションを単一のシステムに統合しやすくなる
-分散システムは下位にあるネットワークの大きさに比して大規模化しやすい

2008年5月2日金曜日

Stubを用いないRMI通信

このエントリーをはてなブックマークに追加
/////////////////////
クライアント用プログラム
/////////////////////
//Client.java
import java.rmi.Naming;

public class Client {
public static void main(String[] args) {
if(args.length != 1){
System.err.println("% java -option Clinet IP_ADDRESS");
return;
}

try {
Hello stub = (Hello) Naming.lookup("rmi://" + args[0] + "/Hello");
String response = stub.sayHello();
System.out.println(response);
} catch (Exception e) {
e.printStackTrace( );
}
}
}



/////////////////////
サーバ用プログラム
/////////////////////
//Server.java
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;

public class Server implements Hello {
public String sayHello( ) {
return "Hello World!";
}

public static void main(String args[]) {
try {
Server obj = new Server();
Hello stub = (Hello)UnicastRemoteObject.exportObject(obj, 0);

Registry registry = LocateRegistry.getRegistry();
registry.bind("Hello", stub);

System.out.println("Server ready");
} catch (Exception e) {
e.printStackTrace( );
}
}
}



/////////////////////
共通プログラム
/////////////////////
//Hello.java
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Hello extends Remote {
String sayHello() throws RemoteException;
}



サーバ側のディレクトリ構造
(例では,C:\work内にServer.classとHello.class,C:\codebase内にHello.classを配置)
// 配置
C:-+-work-------+-Server.class
| |
| +-Hello.class
|
+-codebase---+-Hello.class


// サーバ側コマンド
// 適当な箇所でレジストリを立ち上げる
// 例では,Cの直下でレジストリを立ち上げている
C:\>rmiregistry

// rmiregistryとは別のコマンドプロンプトを立ち上げる
// 例では,C:\work内
C:\work>java -Djava.rmi.server.codebase=file:///C:\codebase\ Server




クリアント側のディレクトリ構造
(Client.classとHello.classを同じディレクトリに配置)
// 配置
-+-Client.class
|
+-Hello.class


// クライアント側コマンド
java Client [サーバのIPアドレス]

2008年5月1日木曜日

javax.tools

このエントリーをはてなブックマークに追加
プログラムからプログラムをコンパイル&呼び出す方法について
(IEでソースをコピーすると改行が崩れるので,そういう人はFireFoxで)

実行環境:JDK 6

呼び出すプログラム


//Main.java

import java.io.File;

import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import javax.tools.JavaCompiler.CompilationTask;

import java.lang.reflect.Method;

public class Main {

// プログラムをコンパイルする
static void compile(String fileName) {
// 1. JavaCompiler インスタンスを取得.
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
if(compiler == null) {
System.out.println("Compiler is not provided.");
return;
}

// 2. java.io.File ベースのファイル・マネージャ.
StandardJavaFileManager fileManager =
compiler.getStandardFileManager(null, null, null);

// 3. コンパイルするソース・ファイル.
File[] sourceFiles = { new File(fileName + ".java") };

// 4. コンパイル・タスクを取得する.
CompilationTask task = compiler.getTask(
null, fileManager, null, null,
null, fileManager.getJavaFileObjects(sourceFiles));

// 5. コンパイル・タスクを実行し, 結果を表示する.
boolean result = task.call();
if(!result){
System.out.println("Compile error");
return;
}
}

// リフレクションを用いて,メソッドを呼び出す
static void reflect(String fileName , String methodName)
throws Exception{
// クラスを取得
Class cls = Class.forName(fileName);
// メソッドを取得
Method method = cls.getMethod(methodName,null);
// メソッドを実行
method.invoke(cls.newInstance(),null);
}

public static void main(String[] args) throws Exception {
if(args.length != 2){
System.out.println("%java -option Main FILENAME METHODNAME");
};

compile(args[0]);
reflect(args[0], args[1]);
}
}



呼び出されるプログラム

//Test.java

public class Test {
public void print(){
System.out.println("hello");
}
}


コンパイル 方法
C:\MyPrograms\Java\jdk1.6.0_03\libの部分は環境によって変える

set lib=C:\MyPrograms\Java\jdk1.6.0_03\lib
javac -cp .;%lib%\tools.jar Main.java
java -cp .;%lib%\tools.jar Main Test print


<参考URL>
javax.tools を使って動的アプリケーションを作成する
TECHSCORE