五种IO模型
引言
我们这里所说的五种IO模型指的是将数据从传输层的接收和发送缓冲区进行的IO,不再是我们之前所说的在本地进行的基础IO,之前我们的网络所进行的IO使用的是send,recv接口,可是我们并没有对IO的效率进行考虑,这篇文章就是来讨论这个问题的;
1.什么叫做高效的IO
今天我们的IO的本质其实是等+拷贝,等其实很好理解,比如写的时候发送缓冲区满的时候就得等,而读得时候,如果就收缓冲区没有数据就得等;所以这就表明IO就是等+拷贝;并且我们将从等到不用等以及从不用等到要等这样的条件发生改变叫做IO事件发生改变;我们发现在大部分情况下IO效率的主要矛盾就是等,很少的情况是因为拷贝;
呢现在什么叫做高效的IO呢?其实就是等的时间越短,越多的时间在进行拷贝,IO的效率就会越高,当然了,IO效率也肯定是有上限的,因为会受到硬件的影响,如网卡或者带宽的限制;
2.如何提高IO效率
前面已经说了,提高IO效率的本质就是减少IO中等的比重;计算机中已经创造出了五种IO模型来解决这个问题,下面我们来举个例子来将这5种模型进行分析;
比如钓鱼,钓鱼 = 等+钓鱼,而高效的钓鱼就是等的时间少,更多的时间在钓鱼;现在有五个人在一个池塘边钓鱼:
鱼竿=文件描述符
张三/李四/王五=一个个的进程
鱼桶=缓冲区
鱼=准备好被IO的数据
钓鱼=拷贝

IO效率最高的是赵六,也就是多路转接式IO,因为这种IO模型让一个进程(人)可以有多个文件描述符(鱼竿)进行接收和发送数据(钓鱼),呢么在IO过程中等待的时间就会大大减小,所以它的效率就大大提高了;
我们发现张三、李四、王五、赵六这种钓鱼都是同步式的IO,因为它们都要参与IO的过程,所以什么叫做同步式IO呢?只要参与了IO的过程就是同步式IO;

3.阻塞式IO和非阻塞式IO的区别
阻塞IO一直在等,非阻塞式IO不等,但是它们的钓鱼方式是一样的,都是拷贝;也就是非阻塞如果没有数据不会一直阻塞的等在哪里,所谓的阻塞就是不会再执行下面的代码,而非阻塞式IO会接着执行下面的代码,也就是非阻塞式IO在同样的时间可以做其他的事情,但是不能说它的IO效率就高,但是如果其他的时间它还在做IO可以说它的效率高,但是如果只面对一个文件描述符,它的IO的效率就跟阻塞式IO没有区别;
阻塞式IO的过程

非阻塞式IO的过程
非阻塞IO往往需要程序员循环的方式反复尝试读写文件描述符, 这个过程称为轮询. 这对CPU来说是较大的浪费, ⼀般只有特定场景下才使用;

4.信号驱动式的IO
效率有没有变高呢?肯定还是没有了,因为他还是只有一个鱼竿,但是它转化了事件通知的方式;王五和李四一样都是可以在等的时候做别的事情,也就是在等的时候可以做别的事情;

5.同步IO vs 异步IO
同步和异步的核心区别是是否参与IO的过程,哪怕是局部的参与也算,即参与等+拷贝中的任何一个;异步IO中的员工其实就是OS,也就是我们的操作系统来进行IO过程,将结果给进程
7.多路转接式IO

我们发现多路转接式的IO将IO过程所需的两个过程等+拷贝,拆解成了两个过程,select进行等,而我们的recvfrom只用进行拷贝;由recvfromselect的参数我们可以知道,recvfrom一次只能拷贝一个文件描述符中的数据,而select被设计出来专门用于IO文件描述符的等的操作,select可以等待多个文件描述符,等待到了之后就会全部传给recvfrom,recvfrom一次一次进行拷贝;
8.异步IO

9.非阻塞式IO的实现

这个函数可以将一个文件描述符设置成非阻塞的,在底层修改了对应文件的标记位段;这个方法非常通用,不用再使用其他的五花八门的设置方法,从跟上设置了非阻塞;

如何使用

10.IO和进程的关系

IO过程也可能会收到信号的影响;
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)