码迷,mamicode.com
首页 > 其他好文 > 详细

BIO NIO AIO

时间:2019-03-30 18:38:55      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:inux   png   www.   通知   sigaction   例子   没有   gac   ref   

一  高性能IO模型

         1. 同步IO、异步IO、阻塞IO、非阻塞IO

             通过IO模型介绍异步、同步、阻塞、非阻塞的IO看,本节参考文章:

             https://www.cnblogs.com/euphie/p/6376508.html

                    这里统一使用Linux下的系统调用recv作为例子,它用于从套接字上接收一个消息,因为是一个系统调用,所以

            调用时会从用户进程空间切换到内核空间运行一段时间再切换回来。默认情况下recv会等到网络数据到达并且复制到

            用户进程空间或者发生错误时返回,而第4个参数flags可以让它马上返回。

           (1)阻塞IO模型

                           使用recv的默认参数一直等数据直到拷贝到用户空间,这段时间内进程始终阻塞。A同学用杯子装水,打开

                    水龙头装满水然后离开。这一过程就可以看成是使用了阻塞IO模型,因为如果水龙头没有水,他也要等到有水

                    并装满杯子才能离开去做别的事情。很显然,这种IO模型是同步的。

                  技术图片

           (2)非阻塞IO模型

                           改变flags,让recv不管有没有获取到数据都返回,如果没有数据那么一段时间后再调用recv看看,如此循

                    环。B同学也用杯子装水,打开水龙头后发现没有水,它离开了,过一会他又拿着杯子来看看……在中间离开的

                    这些时间里,B同学离开了装水现场(回到用户进程空间),可以做他自己的事情。这就是非阻塞IO模型。但是它

                    只有是检查无数据的时候是非阻塞的,在数据到达的时候依然要等待复制数据到用户空间(等着水将水杯装满),

                    因此它还是同步IO。

                技术图片

           (3)IO复用模型

                           这里在调用recv前先调用select或者poll,这2个系统调用都可以在内核准备好数据(网络数据到达内核)时告

                    知用户进程,这个时候再调用recv一定是有数据的。因此这一过程中它是阻塞于select或poll,而没有阻塞于

                    recv,有人将非阻塞IO定义成在读写操作时没有阻塞于系统调用的IO操作(不包括数据从内核复制到用户空间时

                    的阻塞,因为这相对于网络IO来说确实很短暂),如果按这样理解,这种IO模型也能称之为非阻塞IO模型,但是

                    按POSIX来看,它也是同步IO,那么也和楼上一样称之为同步非阻塞IO吧。这种IO模型比较特别,分个段。因

                    为它能同时监听多个文件描述符(fd)。这个时候C同学来装水,发现有一排水龙头,舍管阿姨告诉他这些水龙头

                    都还没有水,等有水了告诉他。于是等啊等(select调用中),过了一会阿姨告诉他有水了,但不知道是哪个水龙

                    头有水,自己看吧。于是C同学一个个打开,往杯子里装水(recv)。这里再顺便说说鼎鼎大名的epoll(高性能的代

                    名词啊),epoll也属于IO复用模型,主要区别在于舍管阿姨会告诉C同学哪几个水龙头有水了,不需要一个个打

                    开看(当然还有其它区别)。

               技术图片

           (4)信号驱动IO模型

                           通过调用sigaction注册信号函数,等内核数据准备好的时候系统中断当前程序,执行信号函数(在这里面调

                    用recv)。D同学让舍管阿姨等有水的时候通知他(注册信号函数),没多久D同学得知有水了,跑去装水。是不是

                    很像异步IO?很遗憾,它还是同步IO(省不了装水的时间啊)

                   技术图片

           (5)异步IO模型

                           调用aio_read,让内核等数据准备好,并且复制到用户进程空间后执行事先指定好的函数。E同学让舍管阿

                    姨将杯子装满水后通知他。整个过程E同学都可以做别的事情(没有recv),这才是真正的异步IO

                  技术图片

BIO NIO AIO

标签:inux   png   www.   通知   sigaction   例子   没有   gac   ref   

原文地址:https://www.cnblogs.com/jialanshun/p/10628371.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!