谈谈常见的IO模型

本文详细介绍了计算机IO的基本概念,探讨了Linux系统下的五种IO模型(阻塞式、非阻塞式、多路复用、信号驱动和异步IO),并对比了同步阻塞I/O、同步非阻塞I/O和异步非阻塞I/O的区别。重点讲解了它们在效率和资源利用上的优劣。
摘要由CSDN通过智能技术生成

什么是IO

IO其实就是输入Input以及输出Output,简单来说就是计算机输入输出,它是用来描述计算机数据流动的过程。直观的对于计算机来讲,IO在实际应用中是必不可少的,比如我们常使用的输入(鼠标键盘等)和输出设备(显示器等);从计算机架构上来讲,计算机的CPU以及内存等与其他设备之间的数据传输都是通过IO进行的,也就是涉及计算机核心与其他设备间数据迁移的过程,就是IO;而对于一个进程来讲,进程向操作系统请求数据,操作系统将外部数据加载到内核缓冲区,在拷贝到进程缓冲区,从而进程读取数据,这些都涉及到IO。
 了解了什么是IO,接下来我们谈一谈本文主题–常见的IO模型。

IO模型

 Linux系统下,IO主要分为五种:

  1. 阻塞式IO(blocking IO)—进程或线程等待某个条件,若条件不满足就一直等下去。条件满足,则进行下一步操作。
  2. 非阻塞式IO(nonblocking IO)—应用进程与内核交互,目的未达到之前,直接返回。然后通过轮询的方式,不停的去问内核数据准备有没有准备好。如果某一次轮询发现数据已经准备好了,那就把数据拷贝到用户空间中。
  3. 多路复用IO(IO multiplexing) —多个进程的IO注册到同一个管道(select函数)上,这个管道会统一和内核进行交互。当管道中的某一个请求需要的数据准备好之后,进程再把对应的数据拷贝到用户空间中。
  4. 信号驱动IO(signal driven IO) —应用进程在读取文件时通知内核,如果某个 socket 的某个事件发生时,请向我发一个信号。在收到信号后,信号对应的处理函数会进行后续处理。
  5. 异步IO( asynchronous IO) —用户进程发起aio_read操作之后,给内核传递描述符、缓冲区指针、缓冲区大小等,告诉内核当整个操作完成时,如何通知进程,然后就立刻去做其他事情了。当内核收到aio_read后,会立刻返回,然后内核开始等待数据准备,数据准备好以后,直接把数据拷贝到用户控件,然后再通知进程本次IO已经完成。

 通过下图,可以清晰的看出五种IO运行时的区别
在这里插入图片描述
从图中可以看出,从效率来讲,这五种IO的由低到高的顺序是这样的:阻塞IO>非阻塞IO>多路转接IO>信号驱动IO>异步IO。
在实际的开发过程中,我们更常见的是同步阻塞I/O(BIO),同步非阻塞I/O(NIO),异步非阻塞I/O(AIO),这些又是什么呢?

先来谈谈同步与异步。

同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去; 即客户端发送请求给服务端,在等待服务端响应请求时,客户端一直等待,不去做别的事情。这样会造成极大地资源浪费。
  所以就产生了异步的概念:
异步是指进程无需一直等,而是继续执行下其余操作,不管其他进程的状态。当有消息返回时系统会自动通知进程进行处理,这样可以提高执行的效率。即当客户端发送给服务端请求时,在等待服务端响应的时候,客户端可以做其他的事情,这样节约了时间,提高了资源的利用。

有了这个基本概念,我们来谈一谈同步阻塞I/O(BIO),同步非阻塞I/O(NIO),异步非阻塞I/O(AIO)

同步阻塞I/O(BIO)

BIO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制来改善。

同步非阻塞I/O(NIO)

NIO,它支持面向缓冲(Buffer)的,基于通道(Channel)的I/O操作方法。在NIO厍中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的; 在写入数据时,写入到缓冲区中。任何时候访问NIO中的数据,都是通过缓冲区进行操作。通道是双向的,可读也可写,而流的读写是单向的。无论读写,通道只能和Buffer交互。因为 Buffer,通道可以异步地读写。并且存在选择器(Selectors)用于使用单个线程处理多个通道。因此,它需要较少的线程来处理这些通道。线程之间的切换对于操作系统来说是昂贵的。 因此,为了提高系统效率选择器是有用的。

异步非阻塞I/O(AIO)

AIO,是基于Proactor模型实现的异步非阻塞I/O。 每个连接发送过来的请求,都会绑定一个Buffer,然后通知操作系统去完成异步的读,这个时间就可以去做其他的事情,等到操作系统完成读之后,就会调用接口,给你操作系统异步读完的数据。这时可以拿到数据进行处理,将数据往回写,同样是给操作系统一个Buffer,让操作系统去完成写,写完了来通知你。这两个过程都有buffer存在,数据都是通过buffer来完成读写。
当然,关于IO还有很多需要学习的,希望有机会能一步一步给大家讲解清楚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值