linux网络编程 - epoll边沿触发/水平触发内核实现代码分析

news2024/11/18 11:19:36

1、listen socket水平触发的poll函数调用

        以服务器端epoll为例,加入监听、等待并接受连接、再次等待,会有3次检查是否有连接就绪的操作,分别是epoll_ctl、epoll_wait、epoll_wait。

1.1、epoll_wait(第1次调用)

        等待就绪链表相关内核看前面发布的文章《linux网络编程 - epoll内核实现代码分析》。这里介绍水平触发下,如果还有等待接受的连接,epoll_wait是如何触发或者说获取到读事件的。

        ep_send_events_proc代码:

        如上图代码1533行,这行代码将就绪epitem从就绪链表删掉,然后调用ep_item_poll检查获取该epitem的就绪事件,监听的就绪事件保存到revents,如果没有就绪的监听事件,那么revents就为0,1543行就是检查epitem是否有就绪事件,如果没有,那么if分支代码就不会执行(if代码块之后没有代码将epitem再次加入就绪链表),下次再次调用epoll_wait就不会再检查该epitem。

        接下来看1543行if分支里面的代码,有就绪的监听事件就调用__put_user拷贝事件到用户态,最后判断触发方式,ep_send_events_proc代码如下所示:

         1554行检查是否是边沿触发EPOLLET,如果不是边沿触发,就执行if里面的代码,调用list_add_tail将epitem再次加入到就绪链表里面,也就是水平触发模式,epoll_wait获取到就绪事件之后并不会将就绪事件删除,用户程序获取到就绪事件之后,不管是接受所有连接还是接受部分连接,listen的socket还是"可读"的。

1.2、epoll_wait(第2次调用)

        epoll_wait调用返回之后,用户程序可以不处理事件,也可以只接受部分连接,然后再次调用epoll_wait:

  • 如果用户程序接受所有连接之后再次调用epoll_wait,此时epitem虽然还在就绪链表里面,但是实际上epitem是不可读的,因为epitem还在就绪链表里面,所以内核还会再次调用ep_item_poll对socket事件再次进行检查,正如前面介绍的内核会先将epitem从就绪链表删除,因为当前epitem实际上不可读,所以不会返回就绪事件,也就是revents为0,那么epitem就不会被再次加入就绪链表,也就是水平触发的epoll_wait多做了一次无用的检查;
  • 如果用户程序没有接受连接或者接受部分连接,那么再次调用epoll_wait的时候epitem自然是就绪的,也就是前面为什么获取到就绪事件之后,还要再次将epitem加入到就绪链表的原因。

2、listen socket边沿触发的poll函数调用

        边沿触发在前面实际已经介绍到了,水平触发epitem从就绪链表删除之后还会再添加到就绪链表,但是边沿触发就不会,如果epoll_wait获取事件之后不读取连接或者读取部分连接,那么再次调用epoll_wait,此时epitem已经不再就绪链表里面了,那么就检查不到就绪事件(虽然此时有连接等待接受),从前面的文章《linux网络编程 - epoll内核实现代码分析》可以看到,如果有新的连接,那么会调用sock_def_readable,sock_def_readable一级级调用下去就会检查epitem是否在就绪链表里面,如果不在,那么就会添加到就绪链表并唤醒阻塞线程,

        ep_poll_callback添加就绪链表唤醒阻塞线程代码如下:

        函数调用栈如下:

 

 

 

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

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

相关文章

dropout 机制存在,对于同一句子的两次输出是不同的

SimCSE 提供了无监督(上图 a)和有监督(上图 b)两种架构,由于业务需要我们只用了无监督方式,其基本思路是: 1. 同一个 batch 内的数据两次输入模型。 2. 由于有 dropout 机制存在,对…

摩托车商城系统(基于javaweb开发的项目)

目录 前言 一、项目目录 二、效果图 2.1 首页面效果图 2.2 商品分类页面 ​​​​​​​2.3 热销栏页面 2.4 新品栏页面 2.5 购物狂欢栏页面 2.6 我的订单页面 2.7 个人中心页面 2.8 注册页面 2.9 用户登录页面 2.10 Admin后台管理主页面 2.11 Admin订单管理页面 2.12 A…

[附源码]SSM计算机毕业设计基于社区生鲜配送系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

万字总结线程池

本文将从背景、原理、架构、实现、参数状态等方面详细介绍percona-线程池。此外,还将简单介绍腾讯云企业级MySQL(CDB)内核技术--TXSQL,关于线程池的动态启停、负载均衡以及快速断连等优化。 「第一部分 背景」 社区版的MySQL的连接处理方法默认是为每个…

“信任机制”才是数字化时代发展中的精髓所在

2008年,美国次贷危机全面爆发并不断蔓延,最终席卷全球,酿成了世界性的金融危机。当年11月1日,一位署名为中本聪的人发表一篇《比特币:一种点对点的电子现金系统》论文提出了一种完全通过点对点技术实现的电子现金系统。…

Flutter 实现背景 Parallax 动画

Flutter 实现背景 Parallax 动画 原文 https://arkapp.medium.com/background-parallax-animation-in-flutter-4aa9e23d6cfb 前言 我们将创建我们的 Flutter 项目惊人的 Parallax 动画。 在本文中,我们将实现一个简单的实用工具 widget ,它将在任何 widg…

Transformer/Bert

诸神缄默不语-个人CSDN博文目录 文章目录1. Transformer1.1 Transformer整体工作流程1.2 Transformer的输入1.2.1 单词 Embedding1.2.2 位置 Embedding1.3 Block1.3.1 Add & Norm层1.3.2 Self-Attention1.3.3 Multi-Head Attention1.3.4 Feed Forward1.3.5 Masked Multi-He…

[附源码]计算机毕业设计JAVA篮球装备商城系统

[附源码]计算机毕业设计JAVA篮球装备商城系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybati…

HTTP/2是什么?和HTTP/1.1有什么不同?和SPDY有什么不同?

HTTP/2简介 HTTP/2 是超文本传输协议第2版,最初命名为 HTTP 2.0 ,其简称为 h2(基于TLS/1.2或以上版本的加密连接)或 h2c(非加密连接),是HTTP协议的的第二个主要版本,使用于万维网。 …

备考2023年软考需要了解什么?

2022年软考已经结束啦!下半年还是有不少地区取消了,没能报上名或是没能正常参考的朋友们,只能把目光转向2023年了。 这篇文章就来给大家讲讲备考2023年软考需要了解什么? 软考小白必看哦! 一、软考是啥?…

带你走进神奇的元宇宙的世界

🏠个人主页:黑洞晓威 🧑个人简介:大家好,我是晓威,一名普普通通的大二在校生,希望在CSDN中与大家一起成长。🎁如果你也在正在学习Java,欢迎各位大佬来到我的博客查漏补缺…

阿里架构师推荐,微服务分布式构架开发实战PDF,快快收藏吧

什么是微服务架构 微服务是一种软件架构风格,目标是将一个复杂的应用拆分成多个服务模块,每个模块专注单一业务功能对外提供服务,并可以独立编译及部署,同时各模块间互相通信彼此协作,组合为整体对外提供完整服务。 微…

嵌入式开发学习之--创建工程

提示:本篇文章依旧是了解为主,实际做项目时直接找开源的类似项目做模板更效率。 文章目录一、前言二、新建工程三、使用模板工程四、总结一、前言 前面的学习,都是文件内的代码联系,这一篇,是学习文件与目录的联系。当…

数字信号处理-8-自相关

1 皮尔森相关系数 假设 x 和 y 均为 N 个样本的数组,皮尔森公式如下: 皮尔森相关系数总是在 -1 到 1 之间(包含这两个字)。ρ 的绝对值意味着相关性的强度。ρ 接近 1 表示强正相关;ρ 接近 -1 表示强负相关&#xf…

上传文件很费时费力?那是你没用对方式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、前端直传的优点二、实现步骤2.1、后端方面2.1.1 添加依赖2.1.2 增加接口2.1.3 测试接口2.2、前端方面2.2.1 安装 cos-js-sdk-v5 依赖2.2.2 新建组件2.2.3 使…

你的哪些SQL慢?看看MySQL慢查询日志吧

前言 在项目里面,多多少少都隐藏着一些执行比较慢的SQL, 不同的开发测试人员在平时使用的过程中多多少少都能够遇到,但是无法立马有时间去排查解决。那么如果有一个文件能够将这些使用过程中比较慢的SQL记录下来,定期去分析排查,…

meta视口标签

属性解释说明width宽度设置的是viewport宽度,可以设置device-width特殊值initial-scale初始缩放比,大于0的数字maximum-scale最大缩放比,大于0的数字minimum-scale最小缩放比,大于0的数字user-scalable用户是否可以缩放&#xff0…

关于我们编写好的java程序是如何运行部署的

了解如何去查看项目如何运行怎么部署java项目部署到服务器的程序和在本地运行的程序有什么不同java中的Class文件是如何形成的Class文件如何执行的怎么部署java项目 首先宏观的说一下,程序的运行都是要有一个启动入口的,也就是我们经常说的main函数是程…

【Shell 脚本速成】03、Shell 脚本实战案例(一)数据磁盘初始化

目录 一、案例应用场景 二、案例需求 脚本所需相关知识点 三、案例算法 四、代码实现 五、实现验证 一、案例应用场景 生产环境中的服务器一般会分为系统盘和数据盘两种磁盘,以dell R730举例,该服务器是一个2U的机架式服务器,满载可以挂…

HTML+CSS简单的网页制作期末作业——浙江旅游景点介绍网页制作

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法,如盒子的嵌套、浮动、margin、border、background等属性的使用,外部大盒子设定居中,内部左中右布局,下方横向浮动排列,大学学习的前端知识点和布局方式都有…