分布式計算(二)進程間通信
來源:程序員人生 發布時間:2014-09-29 19:53:55 閱讀次數:2656次
每天積累一點點,終有一天會水落石出,不明白的地方越來越多,對于分布式計算從底層開始走起,會理解的更深刻。
進程間的通信是什么?和分布式又怎么扯上了關系? 怎么定義? 纏繞心中,不得其所
1、進行間通信的基本原理
在網絡和分布式程序設計中,進程間通信(IPC: Inter-Process Communication)是非常重要的開發方法。進行間通信大致可以分為兩類:一類是應用在同一節點上的進程間通信方法,主要有管道、FIFO、信號、消息對列和共享內存等;另一類是應用在不同節點上的進程間通信方法,基于套接字(Sockets)的通信是一種典型方法。
可以把Java進行理解為JVM進程,其進程間通信依靠系統調用來實現。Java要實現進程間通信,可以使用RMI或者CORBA。事實上,Java的CORAB也是通過RMI來實現的,而RMI歸根結底也是利用Socket來實現的。所以說Java進程間通信的最基本手段是Socket也不為過。
例程Inprocess 是用共享內存的方式實現進程間通信。

進程間通信Inprocess簡易圖
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
public class Producer extends Thread {
private String mFileName;
private FileChannel mFileChannel;
private MappedByteBuffer mMappedByteBuffer;
public Producer(String fn){
try{
mFileName=fn;
//獲得一個可讀寫的隨機存取文件對象
RandomAccessFile RAFile=new RandomAccessFile(mFileName,"rw");
//獲得相應的文件通道
mFileChannel =RAFile.getChannel();
//設定文件大小,以便映像到共享內存
int size=10000;
//獲得共享內存緩沖區,該共享內存可讀
mMappedByteBuffer =mFileChannel.map(FileChannel.MapMode.READ_WRITE, 0, size).load();
}catch(IOException ex){
System.out.println(ex);
}
}
public void run(){
int i=0;
while(true){
try{
FileLock lock=null;
lock=mFileChannel.tryLock();
if(lock==null){
System.err.println("Producer:lock failed");
continue;
}
mMappedByteBuffer .putInt(0,++i);
mMappedByteBuffer.putInt(4,++i);
mMappedByteBuffer.putInt(8,++i);
System.out.println("Producer:"+(i-3)+":"+(i-2)+":"+(i-1));
Thread.sleep(200);
lock.release();
Thread.sleep(500);
}catch(IOException ex){
System.out.println(ex);
}catch(InterruptedException ex){
System.out.println(ex);
}
}
}
public static void main(String[] args) {
Producer producer=new Producer("sharedMemory");
producer.run();
}
}
該程序定義了一個用java線程機制實現的簡單緩沖區。該緩沖區獲得一個可讀寫的隨機存取文件對象。Producer類利用Thread類的派生創建一個新線程,并直接創建該線程類的一個實例。線程啟動后,線程向緩沖區中寫入數據的生產者線程,該線程連續不斷地每隔一段時間就往緩沖區中放入一個新數據。
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
public class Consumer extends Thread{
private String mFileName;
private FileChannel mFileChannel;
private MappedByteBuffer mMappedByteBuffer;
public Consumer(String fn){
try{
mFileName=fn;
//獲得一個可讀寫的隨機存取文件對象
RandomAccessFile RAFile=new RandomAccessFile(mFileName,"r");
//獲得相應的文件通道
mFileChannel =RAFile.getChannel();
//設定文件大小,以便映像到共享內存
int size=10000;
//獲得共享內存緩沖區,該共享內存可讀
mMappedByteBuffer=mFileChannel.map(FileChannel.MapMode.READ_ONLY,0,size).load();
}catch(IOException ex){
System.out.println(ex);
}
}
public void run(){
while(true){
try{
Thread.sleep(300);
FileLock lock=null;
lock=mFileChannel.tryLock(0,10,true);
if(lock==null){
System.err.println("Consumer:lock failed");
continue;
}
Thread.sleep(200);
System.out.println("Consumer: "+mMappedByteBuffer.getInt(0)+":"+mMappedByteBuffer.getInt(4)+":"+mMappedByteBuffer.getInt(8));
lock.release();
}catch(IOException ex){
System.out.println(ex);
}catch(InterruptedException ex){
System.out.println(ex);
}
}
}
public static void main(String[] args) {
Consumer consumer=new Consumer("sharedMemory");
consumer.start();
}
}
該程序也用java線程機制實現了一個簡單的緩沖區。該緩沖區獲得一個可讀寫的隨機存取文件對象,獲得相應的文件通道,取得文件的實際大小,以映像到共享內存,獲得共享內存緩沖區。Consumer類利用Thread類的派生類創建一個新線程,并直接創建該線程類的一個實例。線程啟動后,線程從緩沖區中讀出數據的消費者線程,該線程不斷地從緩沖區中取出數據并顯示在屏幕上。
2、 接口與接口定義語言
接口定義語言也稱為接口描述語言(IDL),是描述軟件組件接口的語言規范。IDL用中立語言的方式進行描述,能使軟件組件(用不同的語言編寫)間實現相互通信。IDL提供了將對象的接口與其實現分離的能力,將事務與其具體實現分離的概念。
3、數據表示與編碼
進行間通信是分布式系統中首要解決的基本問題。在面向對象的分布式系統中,進程間通信通常表現為遠程對象間的消息傳遞。在通信雙方的進程維護著消息隊列,發送進程將消息先放到發送方緩沖區,并通過通信信道到達目的主機的接收緩沖區,接收進程從緩沖區取出數據。要在基于二進制流的網絡上傳遞抽象的數據類型或對象,必須以通信雙發可以理解的格式對數據進行編碼。

不同抽象層數據表示標準
外部數據表示(XDR:EXternal Data Representation) 是SunSoft提供的一種與體系結構無關的數據表示方法,解決了數據字節排序的差異、數據字節大小、數據表示和數據對準的方式。使用XDR的應用程序,可以在異構硬件系統上交換數據。
抽象語法標記 ASN.1(Abstrat Syntax Notation One) 是在較高抽象層上對數據進行表示、編碼、傳輸和解碼的數據格式。ASN.1及其編碼規則進行了結構化數據的傳輸,以一種獨立于計算機架構和語言的方式來描述數據結構。
在更高的抽象層次,并且也是應用較為廣泛的是可擴展標記語言 (XML:Extensible Markup Language)。 XML繼承了通用標記語言標準(SGML:Standard for General Markup Language)具有的可擴展性(用戶能夠根據需要,自行定義新的標識及屬性名)、結構性(XML 的文件結構嵌套可以復雜到任意程度,能表示面向對象的等級層次)及可校驗性(XML文件可以包括一個語法描述,使應用程序可以對此文件進行結構確認)。因此,XML使得分布式系統之間的數據交換更為容易,允許數據在應用系統間共享。
4、事件同步機制
由于進程間通信的相關進程是獨立執行的,各進程間不知道對方進程的執行情況,所以,進程間通信設施常采用事件同步機制。最簡單的事件同步方法是阻塞機制,即掛起某一進程的執行,直到該進程發起的某個操作執行結束。
根據進程間同步方式的不同,可將進程間通信方式分為3種。
1)同步通信:放送方發出消息后就等待,直到接收方返回確認信息才繼續執行。

2)異步通信:發送方發出消息后依然繼續執行,再利用空閑時間對接收方進行輪詢,以檢查請求是否已處理完畢。

3)單向通信:發送方發出消息后依然繼續執行,不再詢問請求是否處理完成。

參考:
《分布式計算實驗教程》
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈