首页 > 其他分享 >分发测试

分发测试

时间:2025-01-22 15:23:09浏览次数:1  
标签:分发 测试 多路复用 阻塞 应用程序 线程 内核 IO

协程的IO

asyncio 作为实现异步编程的库,任务执行中遇到系统IO的时能够自动切换到其他任务。协程使用的IO模型是IO多路复用。在 asyncio 低阶API 一篇中提到过 “以Linux系统为例,IO模型有阻塞,非阻塞,IO多路复用等。asyncio 常用的是IO多路复用模型的epoolkqueue”。本篇就介绍一下IO多路复用技术以及操作系统的IO,为后续内容做一个铺垫。

什么是IO

根据冯.诺依曼结构,它将计算机分成分为5个部分:运算器、控制器、存储器、输入设备、输出设备。
涉及计算机核心与其他设备间数据迁移的过程就是IO

image.png

常见的IO包括:文件的读写、网络请求。
以文件读写为例,一个应用程序读一个文件。一个应用程序就是一个进程,操作系统为每一个进程分配的内存分为两个部分,分别是用户空间和内核空间。以32位系统为里,用户空间分配3GB,内核空间分为1GB。IO操作因为都是和硬件设备交互,所以不能让用户进程直接操作,而是需要进程调用操作提供提供的API来完成。
v2-eb9db484a5b08330cf904600e94ea512_720w.png
应用程序读一个文件的流程是:

  1. 应用程序调用系统提供读文件的命令
  2. 系统将磁盘中文件内容读取到内核空间
  3. 系统将文件内容从内核空间拷贝的用户空间
  4. 应用程序读取用户空间中的文件内容

从文件IO总结IO的基本流程为:
image.png

总结来看,IO操作的基本流程是:

  1. 应用程序发起IO调用
  2. 操作系统完成IO操作

阻塞IO模型

阻塞IO模型就是应用程序发起IO调用之后一直阻塞等待,一直等到数据从内核空间拷贝用户空间,此次调用才算完成。
流程图如下:
image.png
存在问题:
如果内核数据一直没准备好,那用户进程将一直阻塞,CPU空转而浪费时间。并发大的情况下将导致进程数量变大,限制并发数量。

非阻塞IO模型

应用程序发起IO调用,如果内核空间数据还没读取完成,可以先返回错误信息给用户进程,让它不需要等待,而是通过轮询的方式再来请求。这就是非阻塞IO,流程图如下:
image.png
非阻塞IO的流程如下:

  • 应用进程向操作系统内核,发起读取数据。
  • 操作系统内核数据没有准备好,立即返回错误码。
  • 应用程序轮询调用,继续向操作系统内核发起读取数据。
  • 操作系统内核空间读取数据完成,从内核缓冲区拷贝到用户空间。
  • 完成调用,返回成功提示。

存在问题:
它相对于阻塞IO,虽然大幅提升了性能,但是它依然存在性能问题,即频繁的轮询,导致频繁的系统调用,同样会消耗大量的CPU资源。

IO多路复用模型

非阻塞IO的问题

非阻塞IO模型下并发情况下应用程序可能会发送上千次请求,如果每一次请求的IO都需要轮询获取结果,那么应用就需要创建上千个线程去轮询监听数据是否拷贝完成。
image.png
这么多的线程不断调用系统函数 recvfrom 请求数据,首先服务器不能支持这么多请求,就算扛得住很明显这种方式太浪费资源了,线程是我们操作系统的宝贵资源,大量的线程用来去读取数据了,那么就意味着能做其它事情的线程就会少。如何解决这个问题呢?使用IO多路复用可以将轮询监听的线程降低到1个。

IO多路复用介绍

IO多路复用的原理
可以由一个线程监控多个网络请求,当有数据准备好之后再通知对应的线程去读取数据。这样就可以只需要一个线程完成数据是否就绪状态的查询。通过复用一个轮询的线程节省出大量的线程资源出来,这个就是IO复用模型的思路。

IO多路复用的流程

  1. 应用程序调用IO请求返回一个文件描述符
  2. IO多路复用的函数(select、poll、epoll)同时监控多个文件描述符
  3. 当某一个文件描述符的状态变成就绪时,IO多路复用函数通知对应应用程序
  4. 应用程序读取文件,数据从内核空间拷贝的用户空间,完成数据IO

image.png

IO多路复用使用的函数有三种,分别是:select、poll、epoll。三者在实现上有一些区别。IO多路复用实现的核心思想是监听文件描述符fd的状态,当fd状态就绪时通知对应的应用读取数据。

select

应用进程通过调用select函数,可以同时监控多个文件描述符。在select函数监控的fd中,只要有任何一个数据状态准备就绪了,select函数就会返回可读状态,这时应用进程再发起recvfrom请求去读取数据。

select缺点:

  • 监听的IO最大连接数有限,在Linux系统上一般为1024。
  • select函数是通过遍历fdset,找到就绪的描述符fd。遍历的时间性能消耗较大

poll

由于select存在连接数限制,所以后来又提出了poll。poll模型里面通过使用链表的形式来保存自己监控的fd信息,连接数限制问题。

缺点:
select和poll一样,还是需要通过遍历文件描述符来获取已经就绪的socket。如果同时连接的大量客户端在一时刻可能只有极少处于就绪状态,伴随着监视的描述符数量的增长,效率也会线性下降。

epoll

epoll并不是像select一样去遍历事件列表逐个轮询的监控fd的事件状态,而是事先就建立了fd与之对应的回调函数,当事件激活后主动回调将fd加入到就绪链表中,这也就避免了遍历事件列表的这个操作。
这里去掉了遍历文件描述符的低性能操作,而是采用监听事件回调的的机制。这就是epoll的亮点。

小结

需要注意的是IO多路复用也是阻塞的IO,只不过它能并发处理的IO效率更高。

信号驱动模型

信号驱动IO不再用主动询问的方式去确认数据是否就绪,而是向内核发送一个信号(调用sigaction的时候建立一个SIGIO的信号),然后应用用户进程可以去做别的事,不用阻塞。当内核数据准备好后,再通过SIGIO信号通知应用进程,数据准备好后的可读状态。应用用户进程收到信号之后,立即调用recvfrom,去读取数据。

image.png
信号驱动IO模型,在应用进程发出信号后,是立即返回的,不会阻塞进程。它已经有异步操作的感觉了。但是数据复制到应用缓冲的时候,应用进程还是阻塞的。
回过头来看下,不管是非阻塞IO、IO多路复用还是信号驱动,在数据从内核复制到应用缓冲的时候,都是阻塞的。

异步IO模型

非阻塞IO、IO多路复用还是信号驱动在数据从内核复制到应用缓冲的时候,都是阻塞的,因此都不是真正的异步。
异步IO实现了IO全流程的非阻塞,就是应用进程发出系统调用后,是立即返回的,但是立即返回的不是处理结果,而是表示提交成功类似的意思。等内核数据准备好,将数据拷贝到用户进程缓冲区,发送信号通知用户进程IO操作执行完毕。
image.png
异步IO的原理很简单,只需要向内核发送一次请求,就可以完成数据状态询问和数据拷贝的所有操作,并且不用阻塞等待结果。

同步、异步、阻塞、非阻塞总结

相关术语:

  • 同步阻塞(blocking-IO)简称BIO
  • 同步非阻塞(non-blocking-IO)简称NIO
  • 异步非阻塞(asynchronous-non-blocking-IO)简称AIO

image.png

参考文章:
https://zhuanlan.zhihu.com/p/439770090

本文由mdnice多平台发布

标签:分发,测试,多路复用,阻塞,应用程序,线程,内核,IO
From: https://www.cnblogs.com/goldsunshine/p/18686090

相关文章

  • 电子负载的开关电源测试
    在现代电子设备的设计与测试过程中,开关电源作为最常见的电源转换装置,其性能的优劣直接影响到整个系统的稳定性与可靠性。电子负载作为一种重要的测试工具,广泛应用于开关电源的性能评估、调试与验收等多个环节。本文将探讨电子负载在开关电源测试中的重要性及相关方法。......
  • C# 锐捷 RJ68XX 耐压测试仪通讯 --石文进
    话不多说,直接上代码usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms.VisualStyles;namespaceDeviceControl{///<summary>///锐捷RJ68XX///</summar......
  • 初级渗透测试工程师需要学什么?
    1、前言本文主要介绍如何成为一名初级的渗透测试工程师所需要学习的内容,后续也会基于此将自己的学习总结、心得记录下来。相信在不断坚持下,争取在今年五月初成为一名初级的渗透测试工程师。2、涉及知识领域基础网络知识:理解TCP/IP协议、DNS、HTTP/HTTPS等基础网络协议......
  • 你写的前端代码有做过单元测试吗?使用什么工具?怎么测试的?
    是的,我写的前端代码进行过单元测试。在前端开发中,单元测试是确保代码质量和稳定性的重要环节。我通常使用以下工具和框架来进行单元测试:1.测试框架:Jest:这是一个由Facebook开发的测试框架,它提供了丰富的断言库和模拟功能,支持异步代码测试,并且能够生成详细的测试报告。Jest的易......
  • Postman测试接口报错401,token,jwt
    postman中请求报错401(token,jwt)1.报错1.1报错1在访问需要登录才能访问的接口时,即使已经登录了,也依然报错据我学习心得,是因为没有添加token请求头用户登录成功后,系统会自动下发JWT令牌,然后在后续的每次请求中,浏览器都需要在请求头header中携带到服务端,请求头的名称为Au......
  • Springboot+vue3驾考在线学习与测试系统
    目录具体实现截图技术介绍开发核心技术介绍:技术创新点vue3和vue2的区别:核心代码部分展示非功能需求分析系统开发流程软件测试源码获取具体实现截图技术介绍选用SpringBoot作为开发框架,简化项目结构,提高网站性能和易维护性。采用MVC模式将数据对象、业务逻辑以......
  • SSM基于微信小程序的课堂测试小程序[编号:project55762]
    收藏关注不迷路!!......
  • 软件测试交流
        欢迎大家加入我们的软件测试交流群!无论你是初涉软件测试领域的新手,对各种测试工具和方法充满好奇,渴望在实践中积累经验;还是经验丰富的行业老手,熟练掌握自动化测试、性能测试等复杂技术,有着独到的见解和心得,都能在这里找到属于自己的舞台。   在这里,我们可......
  • Mac OS中测试App出现libcrypto1.0.0.dylib 无法找到的错误 “Image Not Found“ “Cod
    最近在升级App时,本地测试没有问题,在其他机器上测试时,出现了,"libcrypto.1.0.0.dylib" ImageNotFound,"Librarymissing"的问题。XCode出现“ImageNotFound”的错误,可能有以下几个原因:1.libcrpto.1.0.0.dylib,文件没有copy到程序包里面。需要检查程序包里是否有改文件2......
  • 微信 Callkit 扩大测试范围;DeepSeek-R1 模型发布,性能对标 OpenAI o1 正式版丨 RTE 开
     开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个......