五种网络IO模型

一:概述

在网络编程中,阻塞、非阻塞、同步、异步经常被提到,下面谈一下I/O在生活中的钓鱼场景(纯属虚构,如有雷同,纯属巧合)。

1.阻塞式I/O:开始钓鱼,眼睛一直盯着,鱼儿上钩拉杆。

2.非阻塞式I/O:开始钓鱼,你一直怀疑鱼儿在偷吃鱼饵,一直拉杆,没有鱼,然后重复放杆拉杆,直到有钓上鱼。

3.I/O复用:开始钓鱼,但是你同时放了多条鱼竿,然后开始眼睛不断查看多条鱼竿,直到叼上鱼。

4.信号驱动:开始钓鱼,但是你的鱼竿很特殊,鱼儿上钩会发出声音通知你,你可以同时干别的事。

5.异步I/O:姜太公钓鱼升级版,鱼儿不仅愿者上钩而且还会自己跳到装鱼的容器中,连拉杆都省了。

二:网络IO模型

1.阻塞I/0

应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。 如果数据没有准备好,一直等待数据准备好了,从内核拷贝到用户空间,IO函数返回成功指示。

2.非阻塞I/O

当系统请求的I/O操作无法完成时,不要将进程/线程睡眠,而是返回一个错误。这样我们的I/O操作函数将不断的测试数据是否已经准备好,如果没有准备好,继续测试,直到数据准备好为止。在这个不断测试的过程中,会大量的占用CPU的时间。

3.I/O复用

I/O复用模型会用到select、poll函数,这几个函数也会使进程阻塞,但是和阻塞I/O所不同的的,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。

4.事件(信号)驱动I/O

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

水平触发的事件驱动机制;内核通知进程来读取数据,进程没来读取数据,内核需要一次一次的通知进程;

边缘触发的事件驱动机制;内核只通知一次让进程来读取数据,进程可以在超时时间之内随时来读取数据。

nginx就采用了边缘触发的事件驱动机制,这就是为什么nginx的并发性比apache好,当然nginx的性能比apache好,还有其它方面,如nginx支持异步I/O,mmap(内存映射)等等

5.异步I/O

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

原文地址:https://www.cnblogs.com/dyg0826/p/11386084.html

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

五种网络IO模型的相关文章

五种网络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 -&

五种网络IO模型-阻塞I/O、非阻塞I/O、I/O多路复用、信号驱动I/O、异步I/O

1.阻塞I/O模型 我去面馆吃面,点了碗面条,我也不知道做面条需要多久,也不敢出去,只能在那里坐着等.等值师傅做完面,我吃完面条后,再去逛街.这里的吃面就是I/O操作. 2.非阻塞I/O模型 我不甘心在这里等着无聊,我想这段时间继续逛商场,但是又怕面条做好了,所以,我逛一会就回来吧台看一眼!为了吃碗面,来来回回跑,差点没跑断腿! 3.I/O多路复用 我同时在不同的地方点了菜,要跑来跑去的轮询几十遍,累死了.后来,善良的管理员安装了电子屏幕:上面写着每个菜的状态,我需要去看屏幕,就知道数据准备好了

5种网络IO模型(有图,很清楚)

同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西.这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同.所以,为了更好的回答这个问题,我先限定一下本文的上下文. 本文讨论的背景是Linux环境下的n

Windows五个网络IO模型(服务器用)

1.选择select 2.异步选择WSAAsyncSelecct 3.事件选择WSAEventSelect  100-500客户端使用 4.重叠IO Verlapped IO 5.完成端口Completion Port(常配合线程池,内存池技术一起使用) 10000-20000客户端使用 ----------------- 客户端可以不用网络模型,直接用阻塞IO模型.

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

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

网络IO模型

切记:IO特性不是由接口决定,而是由描述符(fd)的属性决定 本文内容目录: 一:网络IO模型的分类,各个模型的定义和特点 二:每个模型的原理和比较 三:每个模型的编程步骤.编程实例,以及注意细节. 一:网络IO模型的分类,各个模型的定义和特点 在网络IO模型中,有五种模型: * blocking IO              阻塞IO * nonblocking IO        非阻塞IO * IO multiplexing         IO多路复用 * signal driven

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视为

python学习四十三天(网络IO模型)

阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 异步IO(Asynchronous I/O) 六 IO模型比较分析 七 selectors模块 IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)I

五种I/O模型的学习

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