多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > 分布式計算(二)進程間通信

分布式計算(二)進程間通信

來源:程序員人生   發布時間: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)單向通信:發送方發出消息后依然繼續執行,不再詢問請求是否處理完成。

      

 

參考:

 《分布式計算實驗教程》




生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 最新69成人精品毛片 | 最近中文字幕mv免费高清视频免费 | 欧美自拍另类 | 欧美一级做一级爱a做片性 欧美一级做一级做片性十三 | 国产日韩欧美在线一区二区三区 | 91久久亚洲精品国产一区二区 | 手机看片高清国产日韩片 | 欧美午夜精品一区二区三区 | 亚洲精品高清在线一区二区三区 | 国产亚洲欧美另类专区 | 亚洲成人娱乐网 | 欧美黑人巨大xxxxx | 国产视频中文字幕 | 国产精品久久久久国产精品三级 | 中文字幕日产乱码 | 日本中文字幕第一页 | 亚洲国产欧美日韩一区二区 | 欧美国产中文 | xxxxx性欧美 xxxxx性欧美hd另类 | 国产免费一区二区三区在线 | 久久视频在线看 | 中文字幕乱偷乱码亚洲 | 亚洲国产2017男人a天堂 | 欧美精品国产一区二区三区 | 亚洲精品综合一区二区三区 | 综合图片区 | 久久精品国产欧美 | 最近中文字幕免费高清版7 最近中文字幕免费国语 | 亚洲精品一区二区三区网址 | 欧美日韩国产欧美 | 免费一级做a爰片性色毛片 免费一看一级毛片 | 国内久久久久影院精品 | 一级做a爰片久久毛片 | 欧美激情一区二区 | 在线免费福利 | 999国产精品亚洲77777 | 91精品免费久久久久久久久 | videoa性欧美| 国产美女一级做受在线观看 | 国产成人久久精品一区二区三区 | 欧美一级毛片一 |