非阻塞sokcet和epoll

news2024/11/17 4:55:20

在Muduo网络库中同时使用了非阻塞socket与epoll,在此简单梳理下。

非阻塞sokcet和epoll共同工作的过程主要涉及网络编程中的非阻塞I/O和事件驱动机制。下面将详细解释这两者如何协同工作:

非阻塞socket简介

  • 在传统的阻塞socket编程中,当调用如readwriteaccept等函数时,如果当前没有数据可读或没有空间可写,线程或进程会被挂起,等待数据到来或空间可用。这可能导致资源(如CPU时间)的浪费。
  • 非阻塞socket则不同,它允许socket调用立即返回,即使当前没有数据可读或没有空间可写。这意味着线程或进程不会被挂起,可以继续执行其他任务。
  • 非阻塞socket通过设置socket的选项(如使用fcntl函数设置O_NONBLOCK标志)来实现。

epoll简介

  • epoll是Linux内核提供的一种高效的事件通知机制,用于监控多个文件描述符(如socket)的状态变化。
  • 与传统的select/poll机制相比,epoll具有更高的效率和可扩展性。它使用一种称为“事件驱动”的方式工作,即当某个文件描述符的状态发生变化时,内核会主动通知应用程序。
  • epoll有两种触发模式:水平触发(Level Triggered, LT)和边缘触发(Edge Triggered, ET)。在LT模式下,只要文件描述符的状态未改变,应用程序每次调用epoll_wait都会收到通知;而在ET模式下,应用程序只会收到一次通知,需要在状态改变后主动读取或写入数据。

非阻塞socket与epoll共同工作过程

  • 当使用非阻塞socket编程时,为了避免线程或进程被挂起,通常会结合使用epoll来监控socket的状态变化。
  • 具体而言,应用程序首先会将socket设置为非阻塞模式,并将其注册到epoll的监控列表中。
  • 当socket的状态发生变化(如有数据可读或可写)时,内核会通过epoll通知应用程序。此时,应用程序可以调用相应的socket函数(如readwrite)来处理数据,而不用担心被挂起。
  • 由于socket处于非阻塞模式,因此这些函数会立即返回。如果当前没有数据可读或没有空间可写,函数会返回一个错误码(如-1),并设置相应的errno值(如EWOULDBLOCK)。应用程序可以根据这些错误码来判断是否需要继续等待数据或执行其他任务。
  • 通过这种方式,非阻塞socket与epoll共同实现了高效的网络编程模型,使得应用程序能够充分利用系统资源,提高程序的性能和响应速度。

 

此图是IO复用(IO multiplexing)模型图。epoll属于IO复用的一种。图中下方的read可以是阻塞IO,也可是本文讲的非阻塞IO。

需要注意的是,当使用非阻塞socket和epoll的ET模式结合进行编程时,需要特别注意数据的完整性和连接的稳定性。

例如,在读取数据时,可能需要循环调用read函数以确保读取到完整的数据包,在Muduo库中Buffer的readFd方法封装了readv系统调用,可以最多一次读取64kbyte的数据。在关闭连接时,也需要确保对方已经接收到了所有的数据并关闭了连接。这些都需要在应用程序中进行适当的处理。

非阻塞+epoll是异步IO吗

在这种情况下,虽然非阻塞socket和epoll允许应用程序在等待I/O操作完成时不被阻塞,但它们本身并不直接等同于异步I/O(Asynchronous I/O)。澄清一下这两个概念:

  1. 非阻塞I/O:非阻塞I/O意味着当应用程序尝试执行一个I/O操作时,如果操作不能立即完成(例如,没有数据可读或缓冲区已满),则调用会立即返回一个错误(通常是EWOULDBLOCK),而不是将调用线程挂起。这样,应用程序可以继续执行其他任务,稍后再次尝试该I/O操作。

  2. 异步I/O:异步I/O更进一步。它允许应用程序启动一个I/O操作,然后立即继续执行其他任务,而不必等待该操作完成。当I/O操作完成时,系统会通知应用程序(通常是通过一个回调函数或信号)。这样,应用程序可以真正并行地执行多个任务,而不仅仅是轮询I/O操作的状态。

就如Muduo库中,使用非阻塞socket和epoll实现的是基于事件驱动的反应式编程模型,而不是真正的异步I/O。应用程序需要定期调用epoll_wait来检查是否有任何已注册的文件描述符(如socket)的状态发生了变化。当检测到变化时,应用程序会执行相应的处理逻辑。

然而,有些系统调用(如Windows的IOCP或Linux的aio系列函数)提供了真正的异步I/O支持。应用程序可以提交一个I/O请求,并提供一个回调函数,当I/O操作完成时,系统会调用该回调函数。这样,应用程序可以完全避免轮询,从而实现更高的效率和更好的响应性。

相关概念也可移步另一篇博客【IO的阻塞和非阻塞浅析】细看。

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

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

相关文章

web前端项目已有阿里巴巴图标基础上,再次导入阿里巴巴图标的方法

如果是第一次导入阿里巴巴图标请参考: vue项目引入阿里云图标_vue引用阿里云图标fontclass-CSDN博客 本文主要想讲在项目原有阿里巴巴图标基础上,再次导入阿里巴巴图标的解决办法: 1.iconfont.json对应修改就行,这个简单一看就明白; 2.iconfont.js主要改动<symbol><…

3D模型旋转显示不全怎么办---模大狮模型网

在3D建模和渲染过程中&#xff0c;我们有时会遇到旋转模型时显示不全的问题。这种情况可能由多种原因造成&#xff0c;包括模型本身的问题、软件设置不当、硬件配置不足等。本文将为您详细介绍几种可能的解决方法&#xff0c;帮助您解决3D模型旋转显示不全的问题。 一、检查模型…

活动回顾 |观测云在杭州论坛上闪耀:教育创新与技术领导力的双重荣耀

第二届服务韧性工程论坛在杭州顺利闭幕&#xff0c;观测云以其在可观测性领域的杰出成就和创新成果&#xff0c;成为了论坛的瞩目焦点。在此次以“人工智能驱动运维研发革命&#xff0c;SRE 助力出海企业构建健壮的 IT 生态系统”为主题的盛会上&#xff0c;观测云积极参与了四…

物联网实战--平台篇之(十)“我的“页面设计

目录 一、页面布局 二、头像 三、修改密码 四、重新登录 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.html 本项目资源文件htt…

【论文阅读】 YOLOv10: Real-Time End-to-End Object Detection

文章目录 AbstractIntroductionRelated WorkMethodologyConsistent Dual Assignments for NMS-free Training &#xff08;无NMS训练的一致性双重任务分配&#xff09;Holistic Efficiency-Accuracy Driven Model Design &#xff08;效率-精度驱动的整体模型设计&#xff09; …

如何在window中快速建立多个文件夹?

时隔多年&#xff0c;再次开始撰写文章&#xff0c;但是这次却是以设计师的身份 1. 几个基础快捷键先记一下&#xff0c;要不更高级的玩儿不转&#xff08;1&#xff09;快速打开资源管理器&#xff08;2&#xff09;快速建立新文件夹&#xff08;3&#xff09;快速修改文件文件…

作为 App 开发者会推荐安装的 Mac App

Xcode&#xff0c;作为 App 开发者&#xff0c;必须安装的工具。当然&#xff0c;有经验的开发者不会从 Mac App Store 下载&#xff0c;而是从网站下载&#xff0c;除了安装过程更可控&#xff0c;也方便多版本共存。此外&#xff0c;我不信任任何第三方下载方式&#xff1a; …

[LLM-Agents]浅析Agent工具使用框架:MM-ReAct

上文LLM-Agents]详解Agent中工具使用Workflow提到MM-ReAct框架&#xff0c;通过结合ChatGPT 与视觉专家模型来解决复杂的视觉理解任务的框架。通过设计文本提示&#xff08;prompt design&#xff09;&#xff0c;使得语言模型能够接受、关联和处理多模态信息&#xff0c;如图像…

网络安全技术心得体会

网络与信息安全技术心得体会 通过对网络安全这门课程的学习&#xff0c;我进一步了解了网络安全技术的相关知识。大致来说&#xff0c;所谓网络安全指的是对网络系统中各类软硬件和数据信息等提供保护屏障&#xff0c;确保数据信息不受到恶意侵入、窃取等破坏&#xff0c;保证…

FaceFusion源码框架解读

FaceFusion源码框架解读 我的视频讲解&#xff1a;FaceFusion入门教学 FaceFusion官网 FaceFusion是一款开源的AI换脸工具&#xff0c;一款非常好用的换脸工具&#xff0c;操作简单&#xff0c;上手容易。 Facefusion&#xff1a;GitHub - facefusion/facefusion: Next gene…

最新Adaptive特征融合策略,涨点又高效,想发表论文可以参考

自适应特征融合是一种非常高效的数据处理方法&#xff0c;它比传统的特征更能适应不同的数据和任务需求&#xff0c;也因此拥有广泛的应用前景&#xff0c;是深度学习领域的研究热点。 这种方法通过动态选择和整合来自不同层次或尺度的特征信息&#xff0c;不仅显著提升了模型…

USB抓包工具:bushound安装及使用

一、环境搭建 下载busbound6.01安装包&#xff0c;安装完成&#xff0c;重启电脑。 二、工具配置 按照下图配置工具&#xff1a; 使能自动识别新设备 2. 设置抓取数据的容量 三、抓包 回到capture选项卡&#xff0c;在页面的右下角有个run的按钮&#xff0c;点击使能&…

nacos-opera(k8s)安装问题解决

整理一些关于k8s部署nacos出现的一些恶心的问题 网上说其他说的更改数据库连接都未解决。 在用nacos-opera想安装高可用nacos时连接mysql数据库报错: 报错具体项: No DataSource set 具体就是说没找到数据源。 第一个 检查一下nacos连接数据库配置 : 第二个 检查一下数据库…

视频监控汇聚平台LntonCVS通过GB/T28181国标协议实现视频监控平台的级联方案

近年来&#xff0c;随着网络视频监控应用范围的拓展&#xff0c;越来越多的政府部门和跨区域行业单位对视频监控的需求已经不局限于本地联网监控。他们正在探索在原有的本地联网监控基础上&#xff0c;建设省级乃至全国范围内的跨区域监控联网&#xff0c;以全面打造数据共享平…

【Unity2D:C#Script】实现角色射击功能

一、创建子弹预制体 1. 创建子弹预制体 2. 调整图片大小、层级 二、为子弹添加碰撞体积 1. 添加Box Collider 2D、Rigidbody 2D组件 2. 锁定z轴 三、编辑敌人脚本 注&#xff1a;在以下代码中&#xff0c;只显示本章节新增的代码&#xff0c;省略原有的代码 1. 为敌人添加生…

安科瑞为河南省促进分布式光伏发电健康持续发展提供解决方案

1 光伏、储能运维市场分析 在光伏、储能行业飞速发展的同时&#xff0c;已建的光伏、风力发电站和储能系统的监控、运维管理项目的招标也非常多&#xff0c;2023年上半年&#xff0c;光伏电站开发企业运维招标规模28.6GW&#xff0c;同比增长204.3%&#xff0c;上述28.6GW招标…

抖店一件代发,从0到1操作全流程

我是王路飞。 先说明一点&#xff0c;新手不需要纠结抖店一件代发&#xff08;即无货源模式&#xff09;还能不能做的问题。 无货源只是前期帮助新手阶段的你进入到这个市场里来的一种方式&#xff0c;不是你长期做店的思路。 入门之后&#xff0c;基本就转型为有货源去玩了…

深度学习之基于暗通道算法+卷积神经网络图像去雾可视化系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 在图像处理领域&#xff0c;图像去雾技术一直是一个重要的研究方向。由于雾霾等天气条件的影响…

vue项目中如何使用iconfont

导读&#xff1a;vue项目中引入iconfont的方式 iconfont 的三种使用方法 unicode 不常用Font class 像字体一样使用&#xff0c;默认黑色图标&#xff0c;无法修改颜色Symbol 支持多色图标&#xff0c;更灵活&#xff0c;推荐 一、unicode 略 二、Font class 方式一&#…