• 0
  • 0
分享
  • IO多路复用之Select、Poll、Epoll——软件测试圈
  • 曼倩诙谐 2021-07-26 09:45:52 字数 1126 阅读 955 收藏 0

  I/O多路复用就是通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知应用程序进行相应的读写操作。

1.png

  1.select

  基本原理:select 函数监视的文件描述符分3类,分别是writefds、readfds、和exceptfds。调用后select函数会阻塞,直到有描述符就绪(有数据 可读、可写、或者有except),或者超时(timeout指定等待时间,如果立即返回设为null即可),函数返回。当select函数返回后,可以通过遍历fdset,来找到就绪的描述符。

  被监控的fd在select()后会发生改变,所以在下一次进入select()之前要重新初始化fd。

  优点:良好的跨平台特性。

  缺点:单个进程在Linux下默认最大连接数是1024(可以改);对socket扫描时采用轮询,效率低;需要维护fd_set(long型数组),这样会使得用户空间和内核空间在传递该结构时复制开销大,内核遍历开销也大。

  2.poll

  本质上和select没有什么区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历。不同之处在于,它基于链表实现,没有最大连接数限制,但仍受限于硬限制,相对于epoll是 “水平触发”, 只需要初始化一次,关心的事件和发生的事件进行了分离。

  3.epoll:双向链表+红黑树

  epoll支持水平触发和边缘触发,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就绪态,并且只会通知一次。还有一个特点是,epoll使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知,内核空间和用户空间共享一块内存实现。

  优点:

  (1)没有最大并发连接的限制,能打开的fd的上限远大于1024(1G的内存上能监听约10万个端口)。

  (2)效率提升,不是轮询的方式,不会随着fd数目的增加效率下降。只有活跃可用的fd才会调用callback函数;即epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,epoll的效率就会远远高于select和poll。

  (3)内存拷贝,利用mmap()文件映射内存加速与内核空间的消息传递;即epoll使用mmap减少复制开销。



作者:王策   

来源:51Testing软件测试网原创

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   软件测试点分析基本原则——通用  第一步:先了解产品的基本的业务流程逻辑:是个什么项目,做什么的,怎么工作的?  · 画出流程图,业务逻辑梳理。    第二步:细分模块,针对每个小功能模块进行详细的划分:  · 正常:覆盖正常核心业务流程--优先测试? ? --单个功能冒烟测试。     ·异常:各种异常? ? --贴近用户使用场景,确保产品正确处理,提示友好!    注意:确保不遗漏,列出输入项异常输入项。  第三步:针对具体功能,寻找每个输入项,从以下角度来具体分析测试点:  · 长度,数据类型,必填项,重复。  · 需求的约束条件 + 隐形需求。  · 结合业务流程的步骤。  第四步...
            8 8 2445
            分享
          •   应用场景  在API的测试中,有时候需求是对整个文件进行检验而不是某个特定的值,或者说要对某个特定的值在不同的用例中重复地进行验证。这种状况下,我们最喜欢用的就是变量。可以存取外部数据或定义内部变量,使代码变得简洁、又有可阅读性,同时测试用例结果运行也能保持一致性。  学习要点  ·如何读取外部文件并进行文件内容的精确对比  ·如何读取外部文件并进行文件内容的模糊对比  ·使用变量验证某个特定的value是否出现  ·使用变量验证某个特定的key是否出现  示例中get url: https://reqres.in/api/users/2  准备工作  如果您想跟着以下示例操作,需要做好以...
            2 3 2440
            分享
          • 我们平时说的H5测试就是HTML5,其实就是:移动端WEB页面。我们以往的APP是使用原生系统内核的,相当于直接在系统上操作,是我们传统意义上的软件,更加稳定;H5的APP先得调用系统的浏览器内核,相当于是在网页中进行操作,较原生APP稳定性稍差,似乎还没有百万级用户量的H5APP;H5最大的优点是可以跨平台,开发容易,APP的话需要用ANDROID的语言和IOS的语言各自写,H5只要开发一套;简单的说:H5是基于web,native基于客户端。一、如何判断一个APP页面是否是H5页面1、无网络断开网络,显示404或则错误页面的是H5‘2、页面布局在手机设置、开发者选项中开启显示布局边界功能;...
            13 14 1492
            分享
          •   虽然苹果公司错误地将iPad Air中的M2芯片列为 10 核 GPU 而不是 9 核 GPU,但它在MacBook Air发布会上和营销材料中宣称的性能是准确的。在提供给9to5Mac的一份声明中,苹果表示,它所分享的有关 iPad Air 性能的细节始终是基于9核GPU测算出的。  我们正在更新 Apple.com 以更正 M2 iPad Air 的核心数量。M2 iPad Air 的所有性能均准确无误,并基于 9 核 GPU。  苹果公司的网站称,M2 芯片&quo...
            0 0 550
            分享
          •   在刚入行软件测试的时候,shell脚本也就是了解这个概念,那会儿也基本用不到这个技能,工作做得最多的就是点点点。  现在由于所处行业的关系吧,经常要在linux服务器做些常见操作。遇到不会的就百度,也慢慢的学了一些之前没有接触过的linux 命令,也开始看shell脚本的书籍,看过没有实战没有练习,也就存在一个概念。  Linux命令用多了,自然而然想到了shell脚本,想要用它来解决一些工作中的重复操作,于是开始边学边用,效果还不错。  工作场景:  我们测试的时候会把软件包拷贝到管理平台的软件仓库中,如果仓库中有,就要覆盖掉。  手动操作的流程是这样的:  wget【url】:下载软件...
            0 0 799
            分享
      • 51testing软件测试圈微信