说说什么是IO多路复用?以及其演进过程。

news2024/10/6 12:29:54

文章目录

      • 1.阻塞IO模型(BIO)和 非塞IO模型(NIO)
      • 2.什么是IO多路复用?
      • 3.IO多路复用的演进?

1.阻塞IO模型(BIO)和 非塞IO模型(NIO)

阻塞IO模型(BIO):
如果我们为每一个连接创建一个线程,连接结束时做对应的销毁,这种情况下,如果连接中没有数据可读的话,线程就不得不阻塞,直到连接可读。这个时候就算其他的连接有数据可读,阻塞的线程也是没有机会去处理的。
服务端整个过程只有一个线程,依次循环处理客户端的socket,这种情况下,客户端的某个socket阻塞住了,是会影响到其他的客户端的处理的,必须等待阻塞的客户端处理结束才能接着处理接下来的请求.
非塞IO模型(NIO):
在线程读取数据的时候,如果数据不可读,线程会立即拿到返回,然后去处理别的逻辑。等一会线程再尝试读取数据,这样反复处理,这里就需要一个轮询的逻辑,因为读数据的一端,也不知道数据什么时候可读,所以就需要每间隔一段时间去看看。
非塞IO模型(NIO)相较于阻塞IO最大的特点就是同步非阻塞在进行系统调用的时候,也就是accept和read调用的时候,是不会被阻塞的。socket的相关操作(read、write)都是需要在内核态进行完成的,不能在用户态进行完成,内核态通过将这些函数进行封装,通过像read跟write这种函数提供出来
优点:单个socket阻塞的话,是不会影响到其他的socket
缺点:要不断的在客户端遍历需要建立连接的fd,不断的进行系统调用(会涉及到用户态和内核态的切换),需要一定的开销的。

2.什么是IO多路复用?

IO多路复用(出发点就是要设计一个高性能的网络服务器,这个网络服务器可以供多个客户端建立连接,并且能处理多个客户端的请求。。能想到的就是写多线程去处理,其实现在很多的rpc框架就是用到了这种方式,多线程的弊端就是需要不断地进行上下文的切换,需要处理一些上下文的切换(占用内存的瓶颈),这个过程很繁琐,并且会造成资源的浪费,比如有一千个客户端和服务端建立连接,就需要创建一千个线程,但在同一时刻可能就只有三四个建立连接,这就会造成资源的浪费,因而多线程并不是一种最好的解决方式,那么如何用单线程的方式处理):

就是一个线程如何处理多个连接请求的过程和技术,我们不需要为每个连接创建一个处理线程等待数据可读或可写,IO多路复用会在IO准备好的时候主动通知我们,我们用一个线程就可以完成对全部IO通讯的很监听。。IO多路复用被用来解决性能的问题,解决的办法1:资源复用,多个网络IO复用一个或者多个线程来处理请求. 2.线程不需要等待时间被触发,IO事件被触发的时候能直接通知应用程序,要实现这种线程池的处理方式,就需要引入了一个中间层,所有网络连接在中间层上进行注册,而程序也需要阻塞在这个中间层上,等待他的事件通知,这个中间层便是经常提及的SELECT、EPOLL。

FD:文件描述符,非负整数。linux下一切皆文件,linux中的一切资源都可以通过文件的方式访问和管理,fd就是文件的索引,指向某个文件资源,内核利用fd来访问和管理资源。

同步阻塞:服务端每次只会和一个客户端建立连接,要么就阻塞等待,客户端建立连接
同步非阻塞:服务端每次只会和一个客户端建立连接,他不会被阻塞,如果没有就绪的事件时,非阻塞IO会马上返回一个负数的fd,如果服务端没有和客户端建立上连接,他会返回一个非负的fd继续进行轮询,见下图

总结:同步非阻塞IO其实就是操作系统底层,对同步阻塞IO做了一些优化,提供了一种解决问题的方式,从而避免了单个socket影响到其他socket的情况
缺点:同步非阻塞IO需要我们在用户空间不断的去遍历(涉及到用户态到内核态的一个调用,会是一个问题)调用read函数来检查是否有数据到来。
在这里插入图片描述

3.IO多路复用的演进?

  • select:
    下面的函数中nfds传入的是三个集合描述符的最大值加一,也就是告诉内核,三个集合里面的fd就是这么大,,你只需要检查到这个地方就可以了,而不用做一些无用的检查。
    timeval代表的是超时事件,就是马上判断,判断没有就绪的时候,经过多长时间进行返回。如果是-1,那么就一直等待,直到有就绪的时候才进行返回
    服务端监听4个socket,我们拿到四个socket对应的一个fd,当我们在用户空间调用select函数的时候,首先会先将这四个fd拷贝一份到内核空间,接着内核空间会来遍历这4个fd,就是会依次检查每个fd上对应的socket有没有数据到来,就是有没有就绪,如果没有的话,接着往下检查,直到他检查到某个fd有数据可读了,这个时候,它会将这个fd打上一个标记,然后返回fd的就绪的数量。返回之后,用户空间知道有fd就绪了。,但是他不知道具体是哪一个,所以用户空间就是遍历fd集合找到最终的就绪的fd,然后对就绪的fd进行数据的处理。然后继续下一个fd的调用。
    如果在内核态遍历一次发现4个fd都没有就绪,这个时候内核空间一种就是继续下一次的遍历,一直遍历,直到有一个fd就绪了才终止遍历,将这个fd打标返回给用户空间,这种方法会占用大量的CPU。
    具体的实现其实是遍历一次之后发现没有就绪的,他会把当前的一个用户进程阻塞起来,当客户端向服务端发送数据的时候,数据通过网络到服务端的网卡,网卡通过DMA的方式将这个数据包写入到指定的内存,处理完之后通过中断信号告诉CPU有新的数据到达了,CPU收到中断信号后会进行响应中断,调用中断的处理程序进行处理,首先就是根据这个数据包的ip跟端口号找到对应的这个socket,然后将数据保存到socket队列,然后在检查socket对应的等待队列里是不是有进程在阻塞等待 ,如果有的话,唤醒该进程,用户进程唤醒后,再继续检查一遍这个fd集合,检查到某个fd就绪后,就给这个fd打标,然后结束阻塞,返回给用户
    就绪的文件描述符复用了 readset。用的是bitmap位图,发送的时候代表的是哪些文件描述符是需要检查的,返回的是准备就绪的文件描述符的标记。
    在这里插入图片描述
    在这里插入图片描述
  • Poll:
    poll整体的话跟select是比较类似的,主要是在数据结构上进行了一些优化,
    优化一:存储监听的事件和就绪的事件,所以就不用每次调用完之后进行重置,的限制的
    优化二:层是传入的一个链表,用户传入的时候是一个数组,但是拷贝到内核,它是通过链表存储要监听的文件描述符,这个链表他是没有
    问题:
    1.调用的时候都需要将fd从用户态拷贝到内核态,涉及到用户到内核态的切换,并且说如果fd比较大的时候是需要一定的开销,
    2.返回就绪事件的时候,poll和select是不知道具体是哪个fd事件就绪的,需要进行一个O(n)的遍历
    在这里插入图片描述
    在这里插入图片描述
  • epoll:

epoll主要有三个函数,epoll_create(int size),创建一个epoll,size是epoll想要监听的文件符的数量,返回值就是epoll对应的文件描述符,后面我们可以通过返回的文件描述符来操作我们这个epoll。
第二个函数就是epoll_ctl,就是对我们创建的epoll进行操作。
epoll创建之后,底层内核空间是一个eventpoll,有三个元素,等待队列、就绪队列、红黑树
红黑树的话就是把想要监听的这些文件描述符通过红黑树的形式存储起来,通过红黑树进行高效的新增、删除、查询,
就绪列表:就是说如果有一些fd对应的socket已经是就绪的,就是数据已经到来了,这个时候就要把对应的fd添加到就序列表来,可以很快的知道就绪队列
等待队列:当我们调用的时候发现没有事件就绪,这个时候,我们就将我们的进程进行阻塞,阻塞的时候我们就会把这个进程关联到我们的这个等待队列里面,以便后续有事件到来的时候唤醒我们的进程。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过在内核空间维护一个fd的红黑树(将文件描述符维护到内核态去,这样就不需要每次将我们想要监听的fd拷贝到内核态)和一个就绪链表(poll和select返回的时就绪的文件描述符),解决了poll和select的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/539814.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国考省考行测:科学推理,光学,声学

国考省考行测: 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测,所以大家认真准备吧,我讲一起屡屡申论和行测的重要知识点 遇到寒冬&am…

响应式UI组件库Kendo UI for Vue可轻松创建联系表单!

Kendo UI致力于新的开发,来满足不断变化的需求。Kendo UI for Vue使用旨在提高性能和丰富用户体验的Vue组件,帮助开发人员构建下一代应用程序。它是为Vue技术框架提供可用的Kendo UI组件,以便更快地构建更好的Vue应用程序。 联系表单用于在网…

CRM系统的实施要注意什么?

CRM系统的实施要注意什么? 在如今竞争激烈的商业环境中,拥有一个高效的CRM系统已经变成了企业不可或缺的一部分。 这就来讲一讲,在实施CRM过程中需要注意哪些问题。 01 CRM实施要注意哪些问题? 企业在实施CRM时,需…

虹科案例 | 激光测距仪在高温金属冶炼中的应用

Part.01 应用背景 虹科Dimetix激光测距传感器通常用于钢制热轧机,因为它们提供了一种精确的非接触式方法来确定温度过高而无法触摸的材料的位置或尺寸。苛刻的生产工艺和恶劣的环境条件通常超出了依赖于与被测材料接触的传统传感器的能力。虹科Dimetix激光器拥有良…

博客系统后端设计(五) -实现登录页面要求强制登录功能

文章目录 实现页面要求强制登录实现思路1.约定前后端交互接口2.实现后端代码3.修改前端代码 实现页面要求强制登录 当用户访问列表页/详情页/编辑页的时候,要求用户已经是登录的状态了, 如果用户还没登录,就会强制跳转到登录页面。 实现思路…

精通SpringCloud/Boot配置文件在Nacos中的配置

目录 1 什么是nacos? Nacos 地图 Nacos 生态图 2 springcloud中精通Nacos的配置中心 目录结构 日志配置文件 原始的配置文件 使用Nocas对配置文件进行拆分 引用nacos中的配置文件 共享nacos中的配置文件操作 我们使用同样的方法将日志配置提取出来 1 什么是nacos?…

微信过期视频怎么恢复?恢复视频的方法已经给你总结好了!

案例:微信视频过期,已经被清理怎么办? 【朋友之前发的视频过期了,现在怎么都找不到,有什么方法可以恢复回来吗?感谢!】 微信作为一款热门的社交应用程序,允许用户发送和接收照片、视…

搭建Freekan私人影视电影网站,cpolar内网穿透发布上线

文章目录 1.前言2.本地网页搭建2.1 环境使用2.2 支持组件和环境设置2.3 支持组件选和环境设置2.4 网页安装2.5 测试和使用2.6 问题解决 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转发自CSDNprobezy的文章:使用Cpolarfreekan源码…

MATLAB绘制动画(五)GIF

GIF这个文件大家就比较熟悉了,我们通常当做表情包的动图一般都是用GIF格式。 这是因为GIF格式的文件比较小,传输速度快。 用MATLAB生成GIF图像同样需要将图像保存下来,通过循环展示动画 代码如下: clc; clear; close all; set…

SpringCloud(27. Redis 和 ZK 分布式锁)

上一篇 :26.分布式服务框架Dubbo面试题简析 1. redis 分布式锁 官方叫做 RedLock 算法,是 redis 官方支持的分布式锁算法。这个分布式锁有 3 个重要的考量点: 互斥(只能有一个客户端获取锁)不能死锁容错(…

关于SD webui 部署运行的一些坑

[Bug 1]: RuntimeError: Couldnt install gfpgan 可以先尝试: pip install gfpgan 不过是在虚拟环境venv下的 E:\stable-diffusion-webui\venv\Scripts\python.exe -m pip install gfpgan 如果还是无法安装gfpgan的原因是网络问题,就算已经科学上网…

maven 项目依赖加载不出来

1.依赖加载不出来,查看pom.xml放的位置是否对了 2.1下载mvn到本地,进行解压 2.2新建系统变量MAVEN_HOME,值直接指向安装目录D:\apache-maven-3.9.2 2.3path变量中增加:%MAVEN_HOME%\bin 2.4若仓库位置不在C盘用户下&#xff0…

SpringMVC对请求的处理流程

1.用户发起some.do请求 2.DispatcherServlet中央调度器接收请求some.do,把请求转交给处理器映射器  处理器映射器:SpringMVC框架中的一种对象,框架实现了HandlerMapping接口的类都叫映射器(多个) 处理器映射器的作用:根据请求&a…

Ajax加强(xhr、XML、JSON、xhr上传文件)

文章目录 一、XMLHttpRequest的基本使用1、 使用xhr发起GET请求2、了解xhr对象的readyState属性3、使用xhr发起带参数的GET请求4、查询字符串5、URL编码与解码6、使用xhr发起POST请求 二、数据交换格式1、XML(1)XML和HTML的区别(2&#xff09…

gma 1.1.6 | 2.0.0a1 (2023.05.14) 更新日志

从现在开始,gma 开始同步更新 gma 2 的前期预览版,并与 gma 1 的正式版同步发布。 gma 1.1.6 更新日志 新增 1、添加 3组 新的指北针样式。 修复 1、【map】高分辨栅格数据集内存溢出问题。   添加高分辨率栅格数据集且进行强制数据缩放时 偶现内存…

论文中文翻译——VulCNN An Image-inspired Scalable Vulnerability Detection System

本论文相关内容 论文下载地址——Web Of Science论文中文翻译——VulCNN An Image-inspired Scalable Vulnerability Detection System 文章目录 本论文相关内容前言VulCNN:一种基于图像的可扩展漏洞检测系统作者信息摘要CCS概念关键词ACM参考格式1 引言2 动机3 方…

软考A计划-真题-分类精讲汇总-第十八章(面向对象程序设计)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

CorelDRAW2023最新中文版下载操作教程

CorelDRAW是一个功能强大的矢量绘图工具,也是国内外最流行的平面设计软件之一,它是平面设计和电脑绘画功能为一体的专业设计软件,被广泛应用于平面设计、广告设计、企业形象设计、字体设计、插图设计、工业造型设计、建筑平面图绘制、Web图形…

《终身成长》笔记三——失败挫折的意义

目录 经典摘录 成长型思维方式的人并非感觉不到挫折感,抑郁感,但会很快反应过来,并马上应对 关于能力和成就,我们有很多错误的想法,特别是我们总认为,是那些孤独、聪明的人突然间发明了了不起的东西 思维…

需要买apple pencil吗?比较好用的ipad手写笔

实际上,苹果Pencil和市面上常见的电容笔最大的不同之处在于,它们的重量和压感是不同的。但由于苹果Pencil价格较高,且平替电容笔的各项功能也在不断完善,因此,平替的使用逐渐取代了苹果Pencil。下面,我就给…