Netty学习之三--Java I/O模型

来源:互联网 发布:手机 Ubuntu 编辑:程序博客网 时间:2024/06/07 16:33

1.Linux 网络I/O模型简介

          Linux的内核将所有外部设备都看做一个文件来操作。对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符) 
      对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符),描述符就是一个数字,指指向内核中的一个结构体(文件路径、数据区等一些属性)。

 

2.IO模型 

     2.1针对网络IO的操作,可以分成 两个阶段 ,准备阶段和操作阶段。

              1,准备阶段是判断是否能够操作(即等待数据是否可用),在内核进程完成的;

              2,操作阶段则执行实际的IO调用,数据从内核缓冲区拷贝到用户进程缓冲区。

     2.2阻塞( blocking )、非阻塞( non-blocking 

           阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

   阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。

    非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

     2.3同步( synchronous )、异步( asynchronous )

          同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)

          所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。

          换句话说,就是由*调用者*主动等待这个*调用*的结果。 

      而异步则是相反,*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发  出后,*被      调用者*通过状态、通知来通知调用者,或通     过回调函数处理这个调用。

3.UNIX提供的5I/O模型

1、阻塞I/O

2、非阻塞I/O

3I/O复用(selectpoll

4、信号驱动I/OSIGIO

5、异步I/O

4.I/O模型详解

1、阻塞I/O

            在准备阶段即同步阻塞,应用进程调用I/O操作时阻塞,只有等待要操作的数据准备好,并复制到应用进程的缓冲区中才返回

            在两个阶段上面都是阻塞的

2、非阻塞I/O

            当应用进程要调用的I/O操作会导致该进程进入阻塞状态时,该I/O调用返回一个错误,一般情况下,应用进程需要利用轮询的方式

            在第1阶段,程序不断的轮询直到数据准备好,第2阶段还是阻塞的

3、I/O复用(selectpoll

           多路IO共用一个同步阻塞接口,任意IO可操作都可激活IO操作,这是对阻塞IO的改进(主要是selectpollepoll,关键是能实现同时对多个IO端口进行监听)

           此时阻塞发生在select/poll的系统调用上,而不是阻塞在实际的I/O系统调用上。IO多路复用的高级之处在于:它能同时等

            待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,select等函数就可以返回。

      在第1阶段,当一个或者多个IO准备就绪时,通知程序,第2阶段还是阻塞的,在第1阶段还是轮询实现的,只是所有的IO都集中在一个地方,这个地方进行轮询

4、信号驱动I/OSIGIO

            注册一个IO信号事件,在数据可操作时通过SIGIO信号通知线程,这应该算是一种异步机制;

           当数据准备完毕的时候,信号通知程序数据准备完毕,第2阶段阻塞;

5、异步I/O

          应用进程通知内核开始一个异步I/O操作,并让内核在整个操作(包含将数据从内核复制到应该进程的缓冲区)完成后通知应用进程。

          两个阶段都不阻塞  

5.总结

  上述五种I/O模型,前四种均属于同步I/O(它们等待方式不同,搬迁动作相同),因为recvfrom调用均阻塞了当前请求进程。

  只有最后一种io属于异步I/O 

  所谓同步,数据从存储介质拷贝到内核缓冲区(数据准备的过程)完成之后,需要用户自己将数据拷贝到用户缓冲区。

  所谓异步,步骤1用户都不关心,只要发起IO请求,后面得到IO结果即可。

  所以,前4IO模型都是同步的!!!







 

1 0
原创粉丝点击