jxnxsdengyu
作者jxnxsdengyu课题专家组·2020-04-09 14:33
系统工程师·江西农信

技术技巧---IO模型对比

字数 1805阅读 867评论 0赞 1

摘要

在接触网络编程时,往往需要与各种IO相关的概念打交道。IO模型是IO中的一个重要概念,了解IO模型能够对处理系统和应用中涉及IO的问题提供帮助。

基础概念

同步和异步

同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)

同步:所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。

异步:异步相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。

阻塞和非阻塞

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。

非阻塞:非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
同步、异步与阻塞、非阻塞关系

五种基础IO模型对比

基本IO模型

1、阻塞IO

阻塞IO模型,通常也叫做同步阻塞模型,是最常见的IO模型,对于所有的“慢速设备”(socket、pipe、fifo、terminal)的IO默认的方式都是阻塞的方式。阻塞就是进程放弃cpu,让给其他进程使用cpu。进程阻塞最显著的表现就是“进程睡眠了”。阻塞的时间通常取决于“数据”是否到来。

2、非阻塞IO

非阻塞IO,通常也叫做同步非阻塞模型,就是设置IO相关的系统调用为non-blocaking,随后进行的IO操作无论有没有可用数据 都会立即返回,并设置errno为EWOULDBLOCK或者EAGAIN。我们可以通过主动check的方式(polling,轮询)确保IO有效时, 随之进行相关的IO操作。当然这种方式会浪费大量CPU时间,因此很少使用,偶尔会与其他模型一起使用。

3、IO多路复用

IO多路复用属于同步IO模型,通过把多个I/O的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个 客户端请求。与传统的多线程/多进程模型比,I/O多路复用的最大优势是系统开销小,系统不需要创建新的额外进程或者线程,也不需要维护这些进程和线程的 运行,降底了系统的维护工作量,节省了系统资源。

4、信号驱动IO

信号驱动IO属于同步IO模型,所谓信号驱动,就是利用信号机制,安装信号SIGIO的处理函数(进行IO相关操作),通过监控文件描述符,当其就绪时,通知目标进程进行IO操作(signal handler)。

5、异步IO

告知内核启动某个操作,并让内核在整个操作(包括将数据从内核复制到进程自己的缓冲区)完成后通知我们,特点是系统调用立即返回,并且在等待I/O完成期间,进程不被阻塞。

常见IO模型

IO模型系统IO基本模型通信机制性能
selectLinuxIO多路复用同步I/O
pollLinuxIO多路复用同步I/O
epollLinuxIO多路复用同步I/O较高
IOCPwindows/unix异步IO异步I/O最高
kqueueFreeBSDIO多路复用同步I/O加高

常见问题

1、Linux系统中如何查看是否启用了异步I/O

Linux 系统在2.6版本内核后默认支持AIO,即支持异步I/O模式。查看aio是否使用可用如下方式:

$ cat /proc/slabinfo | grep kio        //AIO启用后输出类似如下  
kioctx 270 270 128 9 9 1 : 252 126  
kiocb 66080 66080 96 1652 1652 1 : 252 126  
kiobuf 236 236 64 4 4 1 : 252 126
$ cat /proc/slabinfo | grep kio     //AIO模式未启用,如前两列数值为0,则未启用  
kioctx 0 0 128 0 0 1 : 252 126  
kiocb 0 0 96 0 0 1 : 252 126  
kiobuf 0 0 64 0 0 1 : 252 126

2、DB2的I/O性能较差

检查IOCP是否启用,启用它有利于提高多线程I/O

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

X社区推广