欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mina原理及其应用(一)

程序员文章站 2022-06-10 23:14:56
...

    最近做一个android app的服务器端开发,而以前接触到的无非都是通过多线程编程来处理socket并发连接,但是考虑到一旦并发连接数达到一定的数量级,服务器肯定会效率直线下降而且容易死掉,所以就想采取Apache的网络通信框架Mina来实现通信功能,由于也是初步接触,下面对一些简单的原理东西做一些总结。

    谈论Mina前必须得清楚的是一些简单的通信概念

    I/O操作

    进程执行I/O操作,归结起来,也就是向操作系统发出请求,让它要么把缓冲区里的数据排干(写),要么用数据把缓冲区填满(读)。进程使用这一机制处理所有数据进出操作。操作系统内部处理这一任务的机制,其复杂程度可能超乎想像,但就概念而言,却非常直白易懂。

    图1-1简单描述了数据从外部磁盘向运行中的进程的内存区域移动的过程。进程使用read( )系统调用,要求其缓冲区被填满。内核随即向磁盘控制硬件发出命令,要求其从磁盘读取数据。磁盘控制器把数据直接写入内核内存缓冲区,这一步通过DMA完成,无需主CPU协助。一旦磁盘控制器把缓冲区装满,内核即把数据从内核空间的临时缓冲区拷贝到进程执行read( )调用时指定的缓冲区。

  图1-1 I/O缓冲区操作简图

    Mina原理及其应用(一)
            
    
    博客分类: Mina apachemina原理I/O服务器端通信 

        I/O模型

        图 1-2. 基本 Linux I/O 模型的简单矩阵

       Mina原理及其应用(一)
            
    
    博客分类: Mina apachemina原理I/O服务器端通信 

    由图1-2可知I/O模型可以分为四种

    1.同步阻塞

    2.同步非阻塞

    3.异步阻塞

    4.异步非阻塞

 

    1.同步阻塞I/O

    最常用的一个模型是同步阻塞 I/O 模型。在这个模型中,用户空间的应用程序执行一个系统调用,这会导致应用程序阻塞。这意味着应用程序会一直阻塞,直到系统调用完成为止(数据传输完成或发生错误)。调用应用程序处于一种不再消费 CPU 而只是简单等待响应的状态,因此从处理的角度来看,这是非常有效的。

图2 给出了传统的阻塞 I/O 模型,这也是目前应用程序中最为常用的一种模型。其行为非常容易理解,其用法对于典型的应用程序来说都非常有效。在调用 read 系统调用时,应用程序会阻塞并对内核进行上下文切换。然后会触发读操作,当响应返回时(从我们正在从中读取的设备中返回),数据就被移动到用户空间的缓冲区中。然后应用程序就会解除阻(read 调用返回)。

 Mina原理及其应用(一)
            
    
    博客分类: Mina apachemina原理I/O服务器端通信 

从应用程序的角度来说,read 调用会延续很长时间。实际上,在内核执行读操作和其他工作时,应用程序的确会被阻塞。

    I/O 密集型与 CPU 密集型进程的比较

    I/O 密集型进程所执行的 I/O 操作比执行的处理操作更多。CPU 密集型的进程所执行的处理操作比 I/O 操作更多。Linux 2.6 的调度器实际上更加偏爱 I/O 密集型的进程,因为它们通常会发起一个 I/O 操作,然后进行阻塞,这就意味着其他工作都可以在两者之间有效地交错进行。

    2.同步非阻塞I/O

    同步阻塞 I/O 的一种效率稍低的变种是同步非阻塞 I/O。在这种模型中,设备是以非阻塞的形式打开的。这意味着 I/O 操作不会立即完成,read 操作可能会返回一个错误代码,说明这个命令不能立即满足(EAGAINEWOULDBLOCK),如图 3 所示。

    Mina原理及其应用(一)
            
    
    博客分类: Mina apachemina原理I/O服务器端通信 

非阻塞的实现是 I/O 命令可能并不会立即满足,需要应用程序调用许多次来等待操作完成。这可能效率不高,因为在很多情况下,当内核执行这个命令时,应用程序必须要进行忙碌等待,直到数据可用为止,或者试图执行其他工作。正如图 3 所示的一样,这个方法可以引入 I/O 操作的延时,因为数据在内核中变为可用到用户调用 read 返回数据之间存在一定的间隔,这会导致整体数据吞吐量的降低。

      3.异步阻塞I/O
      另外一个阻塞解决方案是带有阻塞通知的非阻塞 I/O。在这种模型中,配置的是非阻塞 I/O,然后使用阻塞 select 系统调用来确定一个 I/O 描述符何时有操作。使 select 调用非常有趣的是它可以用来为多个描述符提供通知,而不仅仅为一个描述符提供通知。对于每个提示符来说,我们可以请求这个描述符可以写数据、有读数据可用以及是否发生错误的通知。

     Mina原理及其应用(一)
            
    
    博客分类: Mina apachemina原理I/O服务器端通信 

select 调用的主要问题是它的效率不是非常高。尽管这是异步通知使用的一种方便模型,但是对于高性能的 I/O 操作来说不建议使用。

     4.异步非阻塞I/O(AIO)

     最后,异步非阻塞 I/O 模型是一种处理与 I/O 重叠进行的模型。读请求会立即返回,说明 read 请求已经成功发起了。在后台完成读操作时,应用程序然后会执行其他处理操作。当 read 的响应到达时,就会产生一个信号或执行一个基于线程的回调函数来完成这次 I/O 处理过程。

    Mina原理及其应用(一)
            
    
    博客分类: Mina apachemina原理I/O服务器端通信 

在一个进程中为了执行多个 I/O 请求而对计算操作和 I/O 处理进行重叠处理的能力利用了处理速度与 I/O 速度之间的差异。当一个或多个 I/O 请求挂起时,CPU 可以执行其他任务;或者更为常见的是,在发起其他 I/O 的同时对已经完成的 I/O 进行操作。

   参考:使用异步 I/O 大大提高应用程序的性能 http://www.ibm.com/developerworks/cn/linux/l-async/

             Java NIO Ron Hitchens 著

 

     


 

  • Mina原理及其应用(一)
            
    
    博客分类: Mina apachemina原理I/O服务器端通信 
  • 描述: I/O模型的简单矩阵
  • 大小: 4.6 KB
  • Mina原理及其应用(一)
            
    
    博客分类: Mina apachemina原理I/O服务器端通信 
  • 大小: 24.2 KB
  • Mina原理及其应用(一)
            
    
    博客分类: Mina apachemina原理I/O服务器端通信 
  • 大小: 16.9 KB
  • Mina原理及其应用(一)
            
    
    博客分类: Mina apachemina原理I/O服务器端通信 
  • 大小: 31.8 KB
  • Mina原理及其应用(一)
            
    
    博客分类: Mina apachemina原理I/O服务器端通信 
  • 大小: 10 KB
  • Mina原理及其应用(一)
            
    
    博客分类: Mina apachemina原理I/O服务器端通信 
  • 大小: 7 KB