非阻塞sokcet和epoll

在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的阻塞和非阻塞浅析】细看。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot-阿里羚羊 服务端埋点

官方文档 集成Java SDK 手动引入jar包「quickaplus-log-collector-java-sdk-1.0.1-SNAPSHOT.jar」 <dependency><groupId>com.alibaba.lingyang</groupId><artifactId>quickaplus-log-collector-java-sdk</artifactId><version>1.0.1&l…

老Java学 Go 笔录(二) 从 go 的编译开始学起

目录 一.版本选择二.环境准备三.工具的选择四.第一个 hello go4.1 开发4.2 编译4.3 编译运行4.4 直接安装 五.用 go 快速搭建 webserver六.调用外部三方方法七.go vs java 的执行 前言 专栏旨在利用现有的 java 体系内容去完成 go 语言的学习. 本次行文是在 https://go.dev/doc…

华为编程题目(实时更新)

1.大小端整数 计算机中对整型数据的表示有两种方式&#xff1a;大端序和小端序&#xff0c;大端序的高位字节在低地址&#xff0c;小端序的高位字节在高地址。例如&#xff1a;对数字 65538&#xff0c;其4字节表示的大端序内容为00 01 00 02&#xff0c;小端序内容为02 00 01…

JavaScript面试 题

1.延时加载JS有哪些方式 延时加载 :async defer 例如:<script defer type"type/javascript" srcscript.js></ script> defer:等html全部解析完成,才会执行js代码,顺次执行的 async: js和html解析是同步的,不是顺次执行js脚本(谁先加载完先执行谁)2.JS数…

AI视频教程下载:零代码创建10个GPTs 和Ai Agents

你将学到什么&#xff1a; 理解GPTs的基础知识&#xff1a;掌握GPTs Agent的基础知识及其在现代AI应用中的作用。 创建自定义ChatGPT Agent&#xff1a;学习构建针对内容创作、沟通和社交媒体管理等多种任务量身定制的ChatGPT Agent。 在商业和个人项目中的实用应用&#xf…

“闻起来有股答辩的味道”,答辩到底是什么味?

“闻起来有股答辩的味道”&#xff0c;答辩到底是什么味&#xff1f; 一位名叫“小鸡全家桶”的作者虚构了这样一个学校故事&#xff0c;故事说&#xff0c;由于学生的考试试卷印刷得特别模糊&#xff0c;导致里面的插图根本看不清&#xff0c;学生感到懵逼&#xff0c;监考老…

Python语法学习之 - 生成器表达式(Generator Expression)

第一次见这样的语法 本人之前一直是Java工程师&#xff0c;最近接触了一个Python项目&#xff0c;第一次看到如下的代码&#xff1a; i sum(letter in target_arr for letter in source_arr)这条语句是计算source 与 target 数组中有几个单词是相同的。 当我第一眼看到这样…

23种设计模式(持续输出中)

一.设计模式的作用 设计模式是软件从业人员长期总结出来用于解决特定问题的通用性框架&#xff0c;它提高了代码的可维护性、可扩展性、可读性以及复用性。 二.设计模式 1.工厂模式 工厂模式提供了创建对象的接口&#xff0c;而无需制定创建对象的具体类&#xff0c;工厂类…

防抖和节流的区别和举例(简要说明、形象比喻、容易理解)

1、含义&#xff1a; 在前端开发技术中&#xff0c;防抖&#xff08;Debounce&#xff09;和节流&#xff08;Throttle&#xff09;是两种常用的性能优化技术&#xff0c;主要用于处理高频事件触发&#xff0c;如用户的点击、滚动、输入等操作。 防抖&#xff08;Debounce&am…

【Linux系统】文件与基础IO

本篇博客整理了文件与文件系统、文件与IO的相关知识&#xff0c;借由库函数、系统调用、硬件之间的交互、操作系统管理文件的手段等&#xff0c;旨在让读者更深刻地理解“Linux下一切皆文件”。 【Tips】文件的基本认识 文件 内容 属性。文件在创建时就有基本属性&#xff0…

Ribbon负载均衡(自己总结的)

文章目录 Ribbon负载均衡负载均衡解决的问题不要把Ribbon负载均衡和Eureka-Server服务器集群搞混了Ribbon负载均衡代码怎么写ribbon负载均衡依赖是怎么引入的&#xff1f; Ribbon负载均衡 负载均衡解决的问题 首先Ribbon负载均衡配合Eureka注册中心一块使用。 在SpringCloud…

Packet Tracer-HSRP+DHCPv4+VLAN间路由+以太通道综合实验

实验拓扑&#xff1a; 实验内容&#xff1a; VLAN及VLAN间路由的配置&#xff0c;以太通道的配置&#xff0c;STP的根调整&#xff0c;DHCPv4的配置&#xff0c;首跳冗余HSRP的配置。 实验最终结果&#xff1a; PC可以自动获取到DHCP-Server分配的IP地址&#xff0c;实现首跳…

【MySQL精通之路】InnoDB(5)-内存结构

总目录&#xff1a; 【MySQL精通之路】InnoDB存储引擎-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】InnoDB(4)-架构图-CSDN博客 目录 ​编辑 1 缓存池&#xff08;Buffer Pool&#xff09; 1.1 缓存池LRU算法 1.2 缓存区配置 1.3 使用InnoDB标准监视器监视缓存池 …

Kettle简介

一、Kettle简介 Kettle是一个开源的ETL&#xff08;Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程&#xff09;项目。 项目名很有意思&#xff0c;水壶。按项目负责人Matt的说法&#xff1a;把各种数据放到一个壶里&#xff0c;然后呢&#xff0c;以…

【Crypto】Rabbit

文章目录 一、Rabbit解题感悟 一、Rabbit 题目提示很明显是Rabbit加密&#xff0c;直接解 小小flag&#xff0c;拿下&#xff01; 解题感悟 提示的太明显了

【Pixso如何对设计好的UI进行切片导出图片文件】

当软件UI设计好之后&#xff0c;并不是直接把设计图给开发就可以了&#xff0c;开发还会向你要各种图标的图片文件&#xff0c;这个时候就要用到”切片”功能了。 1、目的&#xff1a;把所有UI界面的图标都切下来&#xff0c;做成UI图标文件夹 2、在UI界面点击【】-【切片】-‘…

【linux】linux中免交互命令expect原理与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

聚恒中台系统 data.ashx SQL注入致RCE漏洞复现

0x01 产品简介 聚恒中台是山东聚恒网络技术有限公司打造的一款BPM流程管理系统,平台以低代码敏捷开发、流程协同、移动互联、软硬互联、大数据分析等前沿技术为支撑,平台包含8大引擎、16种业务组件,支持三种部署方式,四级权限控制,五大应用模式(PC、手机、PDA、工业平板…

基于EBAZ4205矿板的图像处理:07sobel边缘检测算法

基于EBAZ4205矿板的图像处理&#xff1a;07sobel边缘检测算法 项目文件 随后会上传项目全部文件&#xff0c;和之前一样免费下载 先看效果 如上所见&#xff0c;能够提取图像的边缘&#xff0c;这个sobel边缘检测算法的阈值&#xff08;认定是否为边缘的阈值&#xff09;一样…

与WAF的“相爱相杀”的RASP

用什么来保护Web应用的安全&#xff1f; 猜想大部分安全从业者都会回答&#xff1a;“WAF&#xff08;Web Application Firewall,应用程序防火墙&#xff09;。”不过RASP&#xff08;Runtime Application Self-Protection&#xff0c;应用运行时自我保护&#xff09;横空出世…