怎么查一个地区的所有网站域名,在线设计网站源码,代理平台登录,济南产品网站建设外包文章目录 IO的本质五种IO模型异步和同步 阻塞IO非阻塞IO信号驱动IO IO的本质
在之前的内容中已经结束了对于网络和操作系统的学习#xff0c;那么回过来再继续看IO#xff0c;什么是IO呢#xff1f;
对于网络的学习当中#xff0c;实际上也是一种IO#xff0c;数据从计算… 文章目录 IO的本质五种IO模型异步和同步 阻塞IO非阻塞IO信号驱动IO IO的本质
在之前的内容中已经结束了对于网络和操作系统的学习那么回过来再继续看IO什么是IO呢
对于网络的学习当中实际上也是一种IO数据从计算机进入到网卡或者是从网卡中再加载回计算机这本质上都是一种硬件级别的IO过程当把套接字建立完毕之后如果不进行任何输入那么此时IO没有数据那么就会在这里阻塞这就是一个典型的IO中数据没有就绪的情况
以读写为例当调用read函数的时候如果底层的缓冲区没有数据那么默认情况下就会在这里阻塞等待如果想发送数据但是缓冲区已经满了那么此时也不能把数据进行写入所以对于读和写的本质其实就是从网络当中读数据把数据写入到操作系统当中至于怎么写写多少这些都是下层会帮助完成的事但是不管怎么说如果缓冲区为0或者以及满了对于IO的操作都是不被允许的
IO的本质可以如何理解IO的本质就是等待加拷贝在绝大多数的情况下等待的时间是要占据绝大多数的时间的也就是说在我们IO的过程中绝大多数的时间都是在IO只有少部分的时间是在等待而在普遍的认知当中我们往往会忽略这个等待的过程而是直接去看它拷贝的过程
所以我们该如何看待提升IO效率这件事提升效率本质上就是要不然提升拷贝的效率要不然提升等待的效率换句话说就是提升单位时间内拷贝的效率在单位时间内可以拷贝足够多的数据这本身就是一种提升IO的表现所以在未来的这些IO模型当中其实本质上都是在解决等待的这件事想办法让等待的时间变短就是提升IO的一种具体体现
五种IO模型
下面要进入的话题是五种IO模型这里我简单进行一些讲解我们以钓鱼为例对于钓鱼这件事来说什么叫钓鱼说最简单的来理解就是一直在等待钓鱼然后等到了把鱼钓起来这就是对于钓鱼的一个最简单的整体认知那这有什么用呢该如何理解呢我用下面的这五个故事来进行理解
现在有一个人叫做张三他在钓鱼的时候采用的方式是一直在这等着双手握着鱼竿死死的看着水面如果有鱼咬了就把杆子拽起来这就完成了一次钓鱼的过程那么张三在进行钓鱼的过程中在看着鱼漂的这件事本质上来说就是在等待的过程而在张三进行钓鱼的过程中没有任何人可以打扰他只有当底层有鱼就绪了才会结束这个事张三的这种行为就是阻塞式钓鱼在绝大多数的IO接口当中都是阻塞式IO的
过了一会有一个人叫做李四李四感觉没什么意思也来钓鱼但是他和张三不一样李四钓鱼的时候并不会一直在这里等着而是一会看看手机一会看看书一会吃点零食一会看看水面当他发现水面上有鱼来了的时候就把鱼钓起来了那么李四的这个行为和张三并不一样他选择的做法是一会钓钓鱼一会干点别的事而不是一直在看着水面那么李四的这种做法也比较好理解他就是所谓的非阻塞式IO
又过了一会有一个人叫做王五他也来钓鱼了但是不同的是他要做的是把鱼竿扔到水里面然后就走了在旁边躺着看手机而在鱼竿上有一个铃铛当有鱼咬钩的时候铃铛就开始响之后王五就发现有鱼咬钩了直接把鱼竿拽起来完成了一次钓鱼所以对于王五来说他没有主动的去检测鱼有没有上钩而是去选择等着鱼上钩了提醒自己这种IO的模式被叫做是信号驱动式IO
又过了一会有一个人叫做赵六赵六是个小富豪他的钓鱼装备很多他一下拿了100个钓鱼竿同时去钓鱼赵六要做事就是不断的在这个过程中去遍历这100个钓鱼竿如果有上钩的就拿起来没有上钩的就不管他那么赵六的这件事本身就被叫做是多路复用也叫做多路转接
那上述的这四个人的钓鱼方法谁是最高效的呢无疑是赵六他的多路转接的效率非常高在短时间内可以把等待的时间压缩到最短从而起到提升IO的作用
又过了一会有一个人叫田七田七就和他们不一样了他是一个超级大富豪他从车上下来之后拿出装备准备进行钓鱼此时他突然接到了电话有人告诉他说他现在要去开会于是田七就不能继续钓鱼了但是田七又觉得今天很想吃鱼于是就和司机说让司机来帮他钓鱼司机就开始帮他钓鱼而田七本人去开会去了到了下班的时候田七就收到了司机钓的一桶鱼
异步和同步
那对于田七来说他的这个做法属于什么呢我们把这样的行为叫做是异步而前面的这四种人的方式都叫做同步对于同步来讲一个很重要的事就是他们需要进行等待前面的四个人不管是用什么方式进行等待但是最终都需要进行等待而我们要学习的重点内容是对于多路转接来进行理解
阻塞IO 如上所示的是五种基本的IO模型当有一个系统调用被调用的时候如果数据没有就绪那么就会一直卡在这里等待内核当中的数据包就绪直到就绪之后才会进行返回然后处理数据包这个就是阻塞IO
非阻塞IO 那什么是非阻塞IO如上所示就是一个非阻塞IO的示意图非阻塞IO和阻塞IO一个比较大的区别就是非阻塞IO会进行轮询的操作而不是一直在内核当中进行等待当数据报准备好的时候就会返回如果没有准备好也会返回只不过回返回的是一个EWOULDBLOCK的错误码
那在非阻塞IO当中是可以对于标记位进行设置的我们回顾一下参数的接口 read的参数和recvfrom基本相同但是却少了一个标记位的参数那在之前的内容中对于标记位通常设置的都是0表示的是阻塞等待如果想要设置的是非阻塞等待就可以对于这个标记位进行一些设置
对于文件描述符来说它是一个数组的下标而这个数组当中的每一个文件本质上都是一个内核当中的文件对象文件对象中是有对于文件的flag标记位的所以可以用一个叫做fcntl函数来对于一个文件的底层flag标记位进行设置这个设置的原理就是告诉内核对于这个特定的文件描述符我要把它设置为非阻塞 对于这个函数的使用细节在后面的篇章中会有详细的讲解这里先不进行使用
信号驱动IO 下面我们来谈的是信号驱动的IO