分布式计算(二)进程间通信

每天积累一点点,终有一天会水落石出,不明白的地方越来越多,对于分布式计算从底层开始走起,会理解的更深刻。

进程间的通信是什么?和分布式又怎么扯上了关系? 怎么定义? 缠绕心中,不得其所

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)单向通信:发送方发出消息后依然继续执行,不再询问请求是否处理完成。

参考:

《分布式计算实验教程》



时间: 2024-10-19 08:10:56

分布式计算(二)进程间通信的相关文章

第三十三天 LVS基础原理、调度算法、NAT和DR的实现 、LXC虚拟化

大规模站点构建框架 LVS的基础原理 LVS调度方法及NAT模型的实现 LVS  dr模型及lxc虚拟化 一.大规模站点架构框架 http: stateless keep-alive cookie: session 系统的:可扩展性.高可用性:99%, 99.9%, 99.999% .性能: 可扩展性: 容量:在一定时间内能完成的工作量 scale up: 向上扩展 scale out: 向外扩展 Cluster: 集群 构建高可扩展性系统的重要原则:在系统内部尽量避免串行化和交互 调度器:di

linux系统编程(3)

一 线程间同步 同步:相互之间配合完成一件事情 互斥:保证访问共享资源的完整性(有你没我) POSIX 线程中同步:使用信号量实现 信号量 : 表示一类资源,它的值表示资源的个数 对资源访问: p操作(申请资源) [将资源的值 - 1] .... V操作(释放资源) [将资源的值 + 1] 1.定义信号量 sem_t  sem ; 2.初始化信号量 int sem_init(sem_t *sem, int pshared, unsigned int value); 参数: @sem       

一、什么是Hadoop?

Hadoop是Apache下的一个开源分布式计算平台.以Hadoop分布式文件系统(HDFS,Hadoop Distributed Filesystem)和MapReduce(Google MapReduce的开源实现)为核心的Hadoop为用户提供了系统底层细节透明的分布式基础结构. Hadoop包含HDFS,MapReduce,Pig,ZooKeeper等子项目的集合,用于分布式计算 二.为什么要用Hadoop? 由于现在信息量速度增长快.信息里又积累着大量的数据,包括个人数据和工业数据.每

爬虫多进程

multiprocessing python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情.借助这个包,可以轻松完成从单进程到并发执行的转换.multiprocessing支持子进程.通信和共享数据.执行不同形式的同步,提供了Process.Queue.Pipe.Lock 一.Process 创建进程的类:Proc

嵌入式 Linux进程间通信(十二)——多线程同步

嵌入式 Linux进程间通信(十二)--多线程同步 多线程编程中有三种线程同步机制:互斥锁.信号量.条件量.本文将使用生产者消费者问题编程实践三种线程同步方式. 生产者.消费者问题:生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费.消费者线程从缓冲区中获得物品,然后释放缓冲区.当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区.当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来. 一.互斥锁

从并发处理谈PHP进程间通信(二)System V IPC

.container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px } .container::before,.container::after { content: " "; display: table } .container::after { clear: both } .container::before,.container::after { content:

进程间通信(二)——Posix消息队列

1.概述 消息队列可认为是消息链表.有足够写权限的线程可以往队列中放置消息,有足够读权限的进程可以从队列中取走消息.每个消息是一个记录,由发送着赋予一个优先级. 在像队列中写入消息时,不需要某个进程在该队列上等待消息到达.这与管道不同,管道必须现有读再有写. 消息队列具有随内核的持续性,与管道不同.进程结束后,消息队列中消息不会消失.当管道最后一次关闭,其中的数据将丢弃. 消息队列具有名字,可用于非亲缘关系的进程间. Posix消息队列读总是返回最高优先级的最早消息,而System V消息队列的

Qt浅谈之二十七进程间通信之QtDBus

一.简介 DBus的出现,使得Linux进程间通信更加便捷,不仅可以和用户空间应用程序进行通信,而且还可以和内核的程序进行通信,DBus使得Linux变得更加智能,更加具有交互性.        DBus分为两种类型:system bus(系统总线),用于系统(Linux)和用户程序之间进行通信和消息的传递:session bus(回话总线),用于桌面(GNOME, KDE等)用户程序之间进行通信. 二.详解之Qt代码 1.代码一 (1)test.h [html] view plain copy

(十二) 一起学 Unix 环境高级编程 (APUE) 之 进程间通信(IPC)

. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制 (七) 一起学 Unix 环境高级编程 (APUE)