【31】常见IO模型浅析 · Qingfeng.Du

note:本文以及《说说Redis的非阻塞IO多路复用技术》都是NIO学习的预热,本文对常见的四种IO模型进行归纳总结。

常见的IO模型有:

  1. 同步阻塞IO(Blocking IO):即传统的IO模型
  2. 同步非阻塞IO(Non-blocking IO)
  3. IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO
  4. 异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非阻塞IO

1 同步阻塞IO

简单,就不多说了。

2 同步非阻塞IO

不难,也不多说。

3 IO多路复用

用户首先将需要进行IO操作的socket添加到select中,然后阻塞等待select系统调用返回。当数据到达时,socket被激活,select函数返回。用户线程正式发起read请求,读取数据并继续执行。

从流程上来看,使用select函数进行IO请求和同步阻塞模型没有太大的区别,甚至还多了添加监视socket,以及调用select函数的额外操作,效率更差。但是,使用select以后最大的优势是用户可以在一个线程内同时处理多个socket的IO请求。用户可以注册多个socket,然后不断地调用select读取被激活的soc 大专栏  【31】常见IO模型浅析 · Qingfeng.Duket,即可达到在同一个线程内同时处理多个IO请求的目的。而在同步阻塞模型中,必须通过多线程的方式才能达到这个目的。

虽然上述方式允许单线程内处理多个IO请求,但是每个用户请求的过程还是阻塞的(在select函数上阻塞),平均时间甚至比同步阻塞IO模型还要长。如果用户线程只注册自己感兴趣的socket或者IO请求,然后去做自己的事情,等到数据到来时再进行处理,则可以提高CPU的利用率。可以使用了Reactor设计模式实现。

Reactor:当用户将自己感兴趣的IO注册到Reactor,并提供相应的事件处理器。Reactor线程负责调用内核的select函数检查socket状态。当有socket被激活时,则通知相应的用户线程执行相应的事件处理器进行数据读取、处理的工作。

下面是一张以服务员和顾客为例子的图:

4 异步IO

流程:

  1. 用户线程,注册IO和相应的事件处理器,此时事件处理器不关注具体的IO操作,而是关注IO操作是否完成,这是区别于Reactor的关键。
  2. 事件分离器等待IO操作完成
  3. 在事件分离器等待IO操作完成的时候,操作系统调用内核线程完成读取操作,并将IO操作的内容放入用户传递过来的缓存区中。这也是区别于Reactor的一点,Proactor中,应用程序需要传递缓存区。
  4. 事件分离器捕获到读取完成事件后,激活用户注册的事件处理器,事件处理器直接从缓存区读取数据,而不需要进行实际的IO操作。

原文地址:https://www.cnblogs.com/liuzhongrong/p/12263131.html

时间: 2024-10-27 06:56:18

【31】常见IO模型浅析 · Qingfeng.Du的相关文章

高性能IO模型浅析(转)

转自:http://www.cnblogs.com/fanzhidongyzby/p/4098546.html 是我目前看到的解释IO模型最清晰的文章,当然啦,如果想要详细的进一步了解还是继续啃蓝宝书吧. 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK.注意这里所说的NIO

高性能IO模型浅析

服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK.注意这里所说的NIO并非Java的NIO(New IO)库. (3)IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll

高性能IO模型浅析(彩图解释)good

服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK.注意这里所说的NIO并非Java的NIO(New IO)库. (3)IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll

【I/O模型】几种IO模型浅析(一)

基本概念的学习: 同步&&异步 同步:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行: 异步:如果有多个任务或者事件发生,这些事件可以并发地执行,一个事件或者任务的执行不会导致整个流程的暂时等待. 这就是同步和异步.举个简单的例子,假如有一个任务包括两个子任务A和B,对于同步来说,当A在执行的过程中,B只有等待,直至A执行完毕,B才能执行:而对于异步就是A和B可以并发地执行,B不必等待A执行完毕之后再

[转载] 高性能IO模型浅析

转载自http://www.cnblogs.com/fanzhidongyzby/p/4098546.html 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK.注意这里所说的NIO并非Java的NIO(New IO)库. (3)IO多路复用(IO Multiplexing)

unix io 模型浅析

POSIX中对同步IO和异步IO的规定: 同步IO操作:引起进程的阻塞直到IO操作完成,异步IO操作:IO操作不会引起进程阻塞 在UNIX下,有5中操作模型: 阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO 按照网络上的说法,前四种是属于同步IO,第五种才属于异步IO,对于这个结论,我的理解是根据用户进程是否阻塞来判断的(而不是内核进程).关于同步和异步的一些讨论,可以参考http://bbs.chinaunix.net/viewthread.php?tid=947563 阻塞IO 这是

常见IO模型

阻塞IO模型 阻塞IO是最通用的IO,使用这种IO接受数据时,在数据没有到来之前程序会一直等待. 非阻塞IO 当把套接字设置成非阻塞IO时,则对于每次请求,内核都不会阻塞,会立即返回.当没有数据时,会返回一个错误. IO复用 使用IO复用的可以在等待的时候假如超时时间,当超时时间没有到达的时候情况与阻塞IO是一样的,当时间到达,但是没有数据是,系统会自动返回,不在等待.select()函数就是按照一定的时间轮询. 信号驱动IO 信号驱动 信号驱动IO在进程开始时注册一个信号处理的回调函数,进行继

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

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

Python开发基础-Day33 IO模型

IO模型分类 五种IO Model blocking IO 阻塞IO nonblocking IO 非阻塞IO IO multiplexing IO多路复用 signal driven IO 信号驱动IO asynchronous IO 异步IO signal driven IO(信号驱动IO)在实际中并不常用,所以只剩下四种IO Model. 网络IO的两个过程 对于一个network IO ,会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核