码迷,mamicode.com
首页 > 其他好文 > 详细

网络I/O模型--5种常见的网络I/O模型

时间:2018-12-16 13:20:38      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:用户   image   一个   文件的   进程   img   font   logs   block   

 

阻塞与非阻塞

  阻塞就是卡在那儿什么也不做,双方之间也没有信息沟通。

  非阻塞就是即使对方不能马上完成请求,双方之间也有信息的沟通。

同步与异步

  同步就是一件事件只由一个过程处理完成,不论阻塞与非阻塞,最后完成这个事情的都是同一个过程

  异步就是一件事由两个过程完成,前面一个过程通知,后面一个过程接受返回的结果。

异步和事件驱动(multi IO)

  异步是指数据准备好并且已经拷贝到用户空间,在通知用户来取数据

       事件驱动理解为准备好数据了但是没有拷贝到用户空间,这个时候去通知用户,用户再去取数据,经过拷贝过程取得数据。 

 

5种常见的网络I/O模型

  • blocking I/O  -- 阻塞类型的I/O
  • nonblocking I/O -- 非阻塞类型的I/O
  •  I/O Multiplexing -- 多路复用型I/O 
  •  Signal-Driven I/O -- 信号驱动型I/O
  •  Asynchronous I/O -- 异步I/O 

   技术分享图片

 

 

1. blocking I/O  -- 阻塞类型的I/O

  流程图如下:

    技术分享图片

  linux下socket默认是阻塞的,阻塞模式在准备数据和拷贝数据两个过程都是阻塞的,在这期间客户端一直卡着,双方也没有数据交流。

2.nonblocking I/O -- 非阻塞类型的I/O

  流程图:

    技术分享图片

 

     linux下使用fcntl方法将socket设置为非阻塞模式 

    flags = fcntl(sockfd, F_GETFL, 0);                        //获取文件的flags值。

              fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);   //设置成非阻塞模式;

  非阻塞模式下,如果数据还没有准备好,服务端会返回error,客户端根据这个error判断后,再次发起recv,直到数据准备好,这个过程虽然客户端也在这里卡着了,但是这期间一直和服务有着信息交换。

 

3.I/O Multiplexing -- 多路复用型I/O

  流程图:

       技术分享图片

 

  多路复用型IO,有的也称为事件驱动型IO,常用select,poll,epoll来处理多个IO连接状态。当某个IO连接的数据准备好了,select返回,通知用户进行read操作,这种IO的好处是一次可以监听多个连接,坏处是要两次调用,两次返回,单个连接和非阻塞IO没有多大的性能提升。

    在多路复用模型中,对于每一个socket,一般都设置成为non-blocking,但是,如上图所示,整个用户的process其实是一直被block的。只不过process是被select这个函数block,而不是被socket IO给block。因此select()与非阻塞IO类似。

 

4.Signal-Driven I/O -- 信号驱动型I/O

  流程图:

  技术分享图片

 

  首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。

 

5.Asynchronous I/O -- 异步I/O

   流程图:

    技术分享图片

  当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者的输入输出操作

  

 

 

参考资源:

  http://www.cnblogs.com/findumars/p/6361627.html

  https://www.cnblogs.com/kunhu/p/3624000.html

 

  

网络I/O模型--5种常见的网络I/O模型

标签:用户   image   一个   文件的   进程   img   font   logs   block   

原文地址:https://www.cnblogs.com/Zhangyq-yard/p/10114785.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!