日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

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

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

來源:程序員人生   發布時間:2014-09-29 19:53:55 閱讀次數:2660次

     每天積累一點點,終有一天會水落石出,不明白的地方越來越多,對于分布式計算從底層開始走起,會理解的更深刻。

 進程間的通信是什么?和分布式又怎么扯上了關系? 怎么定義? 纏繞心中,不得其所


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

      

 

參考:

 《分布式計算實驗教程》




生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 精品中文字幕视频 | 亚洲精品免费观看 | 国产精品99久久久久久www | 国产一区精品在线 | 日剧天堂 | 久久久精品电影 | 久热国产精品视频一区二区三区 | 国产精品com | 日韩欧美精品一区二区三区 | 中文字幕精品一区二区三区精品 | 久久国产精品-国产精品 | 九九热精品在线观看 | 日韩小视频| 欧美日韩激情在线 | 黄色三级免费看 | 国产免费一级特黄录像 | 久久中文字幕一区 | www.青青| 久久69精品久久久久久久电影好 | 91精品国产自产91精品 | 91亚洲国产成人久久精品网站 | 国产视频一区二区 | 九色综合网 | 国产精品国产三级国产aⅴ中文 | 国产美女久久久 | 叼嘿视频91 | 国产精品久久久久久久久免费高清 | 在线观看黄色av | 日韩av毛片 | 国产一区二区三区不卡在线观看 | 亚洲免费国产视频 | 欧美 日韩 综合 | 日韩成人在线免费观看 | 成人av在线网 | 欧美黄色免费大片 | 日日爽| 欧美成人在线免费视频 | 日本在线观看视频 | 欧美 日韩 国产 成人 在线 91 | 国产精品成人一区 | 免费a级毛片永久免费 |