五种网络IO模型以及多路复用IO中select/epoll对比

下面都是以网络读数据为例

【2阶段网络IO】

第一阶段:等待数据 wait for data

第二阶段:从内核复制数据到用户 copy data from kernel to user

下面是5种网络IO模型

【阻塞blocking IO】

两阶段全程阻塞

recvfrom -> [syscall -> wait -> copy ->] return OK

【非阻塞nonblocking IO】

第一阶段是非阻塞的不断检查是否数据准备好,第二阶段阻塞读取数据

recvfrom -> [syscall -> wait ->] return no data ready

recvfrom -> [syscall -> wait ->] return no data ready

recvfrom -> [syscall -> wait ->] return ready

recvfrom -> [syscall -> copy ->] return OK

【多路复用IO multiplexing】

每个IO都是非阻塞IO,第一阶段通过select/poll方法,一次性轮询多个IO句柄,检查是否有IO句柄准备好,第二阶段阻塞读取数据

select/pool -> [syscall -> wait ->] return readable

recvfrom -> [syscall -> copy ->] return OK

【信号驱动signal driven IO】

第一阶段构造一个信号处理器,第二阶段阻塞读取数据

signal handle -> [syscall -> wait ->] return

[syscall ->] signal handle -> recvfrom -> [syscall -> copy ->] return OK

【异步asynchronous IO】

两阶段都是非阻塞

aio_read -> [syscall -> wait ->] return

[syscall -> copy ->] aio_read callback

5种网络IO对比,只有aio才是全程非阻塞,其它4种都是同步IO。

阻塞IO编程简单,这种方式使用很广泛,但是效率较低。

非阻塞IO效率较高,但是编程较复杂,有开发语言和代码库支持就简单多了。

多路复用非阻塞IO效率比非阻塞IO更高,在大规模的网络IO处理中尤其明显,支持的程序也越来越多。

异步IO效率很高,但是编程很复杂。node.js中使用的就是异步IO。

【select / epoll 对比】

select不足的地方:

1 每次select都要把全部IO句柄复制到内核

2 内核每次都要遍历全部IO句柄,以判断是否数据准备好

3 select模式最大IO句柄数是1024,太多了性能下降明显

epoll的特点

1 每次新建IO句柄(epoll_create)才复制并注册(epoll_ctl)到内核

2 内核根据IO事件,把准备好的IO句柄放到就绪队列

3 应用只要轮询(epoll_wait)就绪队列,然后去读取数据

只需要轮询就绪队列(数量少),不存在select的轮询,也没有内核的轮询,不需要多次复制所有的IO句柄。因此,可以同时支持的IO句柄数轻松过百万。

网络编程,一定要非常了解网络IO模型,对系统设计和架构选型才能有更好的选择和把握。

在实战课程 《PHP秒杀系统 高并发高性能的极致挑战》中,也是针对这类高并发的业务场景做了特定的性能优化以及分布式方案,大家可以参考学习。

作者:一凡Sir
链接:https://www.imooc.com/article/37093
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作

原文地址:https://www.cnblogs.com/makai/p/11087553.html

时间: 2024-10-11 17:38:40

五种网络IO模型以及多路复用IO中select/epoll对比的相关文章

五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O

五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O 五种I/O 模式:[1]        阻塞 I/O           (Linux下的I/O操作默认是阻塞I/O,即open和socket创建的I/O都是阻塞I/O)[2]        非阻塞 I/O        (可以通过fcntl或者open时使用O_NONBLOCK参数,将fd设置为非阻塞的I/O)[3]        I/O 多路复用     (I/O

{python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) IO模型比较分析 selectors模块

阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 异步IO(Asynchronous I/O) 六 IO模型比较分析 七 selectors模块 一 IO模型介绍 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能

网络编程之IO模型——非阻塞IO

网络编程之IO模型--非阻塞IO 非阻塞IO(non-blocking IO) Linux下,可以通过设置socket使其变为non-blocking.当对一个non-blocking socket执行读操作时,流程是这个样子: 从图中可以看出,当用户进程发出read操作时,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error.从用户进程角度讲 ,它发起一个read操作后,并不需要等待,而是马上就得到了一个结果.用户进程判断结果是一个error时,它就

Unix网络编程中的五种I/O模型_转

转自:Unix网络编程中的的五种I/O模型 下面主要是把unp第六章介绍的五种I/O模型. 1. 阻塞I/O模型 例如UDP函数recvfrom的内核到应用层.应用层到内核的调用过程是这样的:首先把描述符.接受数据缓冲地址.大小传递给内核,但是如果此时 该与该套接口相应的缓冲区没有数据,这个时候就recvfrom就会卡(阻塞)在这里,知道数据到来的时候,再把数据拷贝到应用层,也就是传进来的地址空 间,如果没有数据到来,就会使该函数阻塞在那里,这就叫做阻塞I/O模型,如下图: 2. 非阻塞I/O模

Unix系统的五种I/O模型

Unix下共有五种I/O模型: 1. 阻塞式I/O  2. 非阻塞式I/O  3. I/O复用(select和poll)  4. 信号驱动式I/O(SIGIO)  5. 异步I/O(POSIX的aio_系列函数)  io请求分两步: 1. 先将数据从存储介质(磁盘,网络等)拷贝到内核缓冲区,此时称为数据准备好,可以被用户应用程序读取. 2. 由用户应用程序拷贝内核缓冲区中的数据到用户缓冲区. ① 阻塞I/O模型            进程一直阻塞,直到数据拷贝完成 我们将函数recvfrom视为

五种I/O模型的学习

来自   http://www.52im.net/thread-1935-1-1.html 4.互联网服务端处理网络请求的原理 首先看看一个典型互联网服务端处理网络请求的典型过程:<ignore_js_op> 由上图可以看到,主要处理步骤包括: 1)获取请求数据,客户端与服务器建立连接发出请求,服务器接受请求(1-3): 2)构建响应,当服务器接收完请求,并在用户空间处理客户端的请求,直到构建响应完成(4): 3)返回数据,服务器将已构建好的响应再通过内核空间的网络 I/O 发还给客户端(5-

五种I/O模型简述

在说I/O模型之前,我们先来说说同步,异步,阻塞,非阻塞这四种调用方式的概念: 同步:在发出一个功能调用时,在没有得到结果之前,该调用就不返回,通俗点就是必须一件一件的做事,等这件事做完了才能做下一件事: 异步:异步和同步正好相对,当一个异步过程调用发出后,调用者不能立即得到结果,当该异步调用完成后,通过状态,通知和回调来通知调用者. 阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态之下,cpu不会给线程分配时间片,即线程暂停运行),函数只有在得到结果之后才

Unix下可用的五种 I/O 模型

介绍 当TCP客户端同时处理两个输入时:标准输入和TCP套接字,当客户端fgets(在标准输入上)被阻塞并且服务器进程被终止时,我们遇到了问题.服务器TCP正确地将FIN发送到客户端TCP,但由于客户端进程被禁止从标准输入读取,所以它从没有看到EOF,直到它从套接字读取(可能更晚). 如果一个或多个I / O条件准备好(即,输入准备好被读取,或者描述符能够获得更多输出),我们希望得到通知.此功能称为 I/O 多路复用,由select和poll函数以及前者的较新POSIX变体提供,称为pselec

Windows Socket五种I/O模型——代码全攻略(转)

Winsock 的I/O操作: 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序.套接字 默认为阻塞模式.可以通过多线程技术进行处理. 非阻塞模式:执行I/O操作时,Winsock函数会返回并交出控制权.这种模式使用 起来比较复杂,因为函数在没有运行完成就进行返回,会不断地返回 WSAEWOULDBLOCK错误.但功能强大.为了解决这个问题,提出了进行I/O操作的一些I/O模型,下面介绍最常见的三种: Windows Socket五种I/O模型——代码全攻