两个java与corba的问题,java corba

发布时间:2022-11-17

本文目录一览:

  1. Java 以下两个要求 怎么在Java中以程序的方式实现? (围绕CORBA和IOR)
  2. corba,java rmi和dcom/com的异同
  3. java中rmi和corba的区别

Java 以下两个要求 怎么在Java中以程序的方式实现? (围绕CORBA和IOR)

最近在看 JAVA NIO 的相关知识,了解一下IO的底层实现原理。 IO涉及到的底层的概念大致如下:

  1. 缓冲区操作。
  2. 内核空间与用户空间。
  3. 虚拟内存。
  4. 分页技术。

一,虚拟存储器

虚拟存储器是硬件异常(缺页异常)、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。 虚拟存储器的三大能力:

  1. 将主存看成是一个存储在磁盘上的地址空间的高速缓存。
  2. 为每个进程提供了一个一致的地址空间。
  3. 保护每个进程的地址空间不被其他进程破坏。 虚拟内存的两大好处:
  4. 一个以上的虚拟地址可指向同一个物理内存地址。
  5. 虚拟内存空间可大于实际可用的硬件内存。

二,用户空间与内核空间

设虚拟地址为32位,那么虚拟地址空间的范围为0~4G。操作系统将这4G分为二部分,将最高的1G字节(虚拟地址范围为:0xC0000000-0xFFFFFFFF)供内核使用,称为内核空间。而将较低的3G字节供各个进程使用,称为用户空间。 每个进程可以通过系统调用进入内核,因为内核是由所有的进程共享的。对于每一个具体的进程,它看到的都是4G大小的虚拟地址空间,即相当于每个进程都拥有一个4G大小的虚拟地址空间。

三,IO操作

一般IO缓冲区操作:

  1. 用户进程使用read()系统调用,要求其用户空间的缓冲区被填满。
  2. 内核向磁盘控制器硬件发命令,要求从磁盘读入数据。
  3. 磁盘控制器以DMA方式(数据不经过CPU)把数据复制到内核缓冲区。
  4. 内核将数据从内核缓冲区复制到用户进程发起read()调用时指定的用户缓冲区。 从上图可以看出:磁盘中的数据是先读取到内核的缓冲区中。然后再从内核的缓冲区复制到用户的缓冲区。为什么会这样呢? 因为用户空间的进程是不能直接硬件的(操作磁盘控制器)。磁盘是基于块存储的硬件设备,它一次操作固定大小的块,而用户请求请求的可能是任意大小的数据块。因此,将数据从磁盘传递到用户空间,由内核负责数据的分解、再组合。 内存映射IO:就是复用一个以上的虚拟地址可以指向同一个物理内存地址。将内核空间的缓冲区地址(内核地址空间)映射到物理内存地址区域,将用户空间的缓冲区地址(用户地址空间)也映射到相同的物理内存地址区域。从而数据不需要从内核缓冲区映射的物理内存地址移动到用户缓冲区映射的物理内存地址了。 要求:
  5. 用户缓冲区与内核缓冲区必须使用相同的页大小对齐。
  6. 缓冲区的大小必须是磁盘控制器块大小(512字节磁盘扇区)的倍数---因为磁盘是基于块存储的硬件设备,一次只能操作固定大小的数据块。 用户缓冲区按页对齐,会提高IO的效率---这也是为什么在JAVA中new 一个字节数组时,指定的大小为2的倍数(4096)的原因吧。

四,JAVA中的IO,本质上是把数据移进或者移出缓冲区。

read()write()系统调用完成的作用是:把内核缓冲区映射的物理内存空间中的数据拷贝到用户缓冲区映射的物理内存空间中。 因此,当使用内存映射IO时,可视为:用户进程直接把文件数据当作内存,也就不需要使用read()write()系统调用了。 当发起一个read()系统调用时,根据待读取的数据的位置生成一个虚拟地址(用户进程使用的是虚拟地址),由MMU转换成物理地址,若内核中没有相应的数据,产生一个缺页请求,内核负责页面调入从而将数据从磁盘读取到内核缓冲区映射的物理内存中。对用户程序而言,这一切都是在不知不觉中进行。 总之,从根本上讲数据从磁盘装入内存是以页为单位通过分页技术装入内存的。

五,JAVA NIO中的直接缓存和非直接缓存

直接缓存:不是分配于堆上的存储,位于JVM之外,它不受JAVA的GC管理,相当于内核缓冲区。非直接缓存:建立在JAVA堆上的缓存,受JVM管理,相当于用户缓冲区。 根据上面第三点,将直接缓存中的数据写入通道的速度要快于非直接缓存。因为,连接到通道的另一端是文件(磁盘,FileChannel)或者网络(Socket通道),这些都是某种形式上的硬件。那么,对于非直接缓存而言,数据从缓冲区传递到硬件,要经过内核缓冲区中转。而对于直接缓存而言,就不需要了,因为直接缓存已经直接映射到内核缓冲区了。

corba,java rmi和dcom/com的异同

CORBA:CORBA是Common Object Request Broker Architecture的缩写,它是分布计算机技术的发展结果,CORBA技术的成功在于,它除了能够解决由于多个系统层次上的异构带来的“孤岛”问题,还在理论和技术上扩展了客户/服务器的模式,使系统具有良好的可伸缩性,便于系统的开发与升级,保护已有投资。 EJB容器是一个管理一个或多个EJB类/实例的抽象。它通过规范中定义的接口使EJB类访问所需的服务。容器厂商也可以在容器或服务器中提供额外服务的接口。现在没有EJB服务器和EJB容器间接口的规范。因为目前容器通常由EJB服务器来提供,所以一旦接口标准化了,厂商就可能提供可以在任何兼容的EJB服务器上运行的容器。 DCOM:Microsoft的分布式COM(DCOM)扩展了组件对象模型技术(COM),使其能够支持在局域网、广域网甚至Internet上不同计算机的对象之间的通讯。使用DCOM,应用程序可以在位置上达到分布性,从而满足客户和应用的需求。

java中rmi和corba的区别

java中rmi和corba的区别:

  1. 定义接口
    • RMI自己定义接口(interface)
    • CORBA生成idl代码,然后使用idlj -fall name.idl生成接口和几个类文件
  2. 启动服务
    • RMI启动的是rmiregistry (port),默认1099
    • CORBA启动的是tnameserv
  3. 实现的继承类
    • RMI:extends UnicastRemoteObject
    • CORBA:extends 运行idlj时生成的_NameImplBase
  4. 实现类的rebind
    • RMI可以直接rebind,如:
      Naming.rebind("rmi://localhost/meeting", meetingserver);
      
    • CORBA需要先调用init(),如:
      ORB orb = ORB.init(avgs, null);
      MOTDImpl impl = new MOTDImpl(motdFile);
      orb.connect(impl);
      org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
      NamingContext ncRef = NamingContextHelper.narrow(objRef);
      NameComponent nc = new NameComponent(motdService, "");
      NameComponent[] path = new NameComponent[]{nc};
      ncRef.rebind(path, impl);
      
      这里CORBA就要麻烦很多了。
  5. 客户端调用
    • CORBA的调用跟实现类的绑定差不多,如:
      ORB orb = ORB.init(avgs, null);
      org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
      NamingContext ncRef = NamingContextHelper.narrow(objRef);
      NameComponent nc = new NameComponent("MessageOfTheDay", "");
      NameComponent path[] = new NameComponent[]{nc};
      org.omg.CORBA.Object motdObj = ncRef.resolve(path);
      MOTD motdRef = MOTDHelper.narrow(motdObj);
      System.out.println(motdRef.getMOTD());
      
    • RMI只要lookup就可以了。 总的来说,其实RMI和CORBA都差不多,都是桩和框架,两者相互竞争,但是在Java中都可以相互调用。这归功于rmi_iiop