计算机网络之多路转接epoll
个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创计算机网络之多路转接epoll
收录于专栏【计算机网络】
本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交流讨论💌
目录
epoll 初识
epoll 相关系统调用
epoll_create
epoll_ctl
epoll_wait
epoll 工作原理
epoll 的优先(和 select 的缺点对应)
epoll 工作方式
水平触发 Level Triggered 工作模式
边缘触发 Edge Triggered 工作模式
对比 LT 和 ET
理解 ET 模式和非阻塞文件描述符
epoll 使用场景
epoll 的惊群效应
epoll 惊群效应产生的原因
多线程环境下解决惊群问题方法
多进程下的解决方法
epoll 初识
按照 man 手册的说法:是为了处理大批量句柄而作了改进的 poll。
它是在 2.5.44 内核中被引进的 (epoll(4) is a new API introduced in Linux kernel 2.5.44)
它几乎具备了之前所说的一切优点,被公认为 Linux2.6 下性能最好的多路 I/O 就绪通知方法。
epoll 相关系统调用
epoll 有 3 个相关的系统调用。
epoll_create
int epoll_create(int size);
创建一个 epoll 句柄。
自从 Linux2.6.8 之后,size 参数是被忽略的。
用完之后,必须调用 close() 关闭。
epoll_ctl
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
epoll 的事件注册函数。
它不同于 select() 是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。
第一个参数是 epoll_create() 的返回值(epoll 句柄)。
第二个参数表示动作,用三个宏来表示。
第三个参数是需要监听的 fd。
第四个参数是告诉内核需要监听什么事。
第二个参数的取值:
1. EPOLL_CTL_ADD:注册新的 fd 到 epfd 中;
2. EPOLL_CTL_MOD:修改已经注册的 fd 的监听事件;
3. EPOLL_CTL_DEL:从 epfd 中删除一个 fd;
struct epill_event 结构如下:
events 可以是以下几个宏的集合:
1. EPOLLIN:表示对应的文件描述符可以读(包括对端 SOCKET 正常关闭)
2. EPOLLOUT:表示对应文件描述符可以写;
3. EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来)
4. EPOLLERR:表示对应的文件描述符发生错误;
5. EPOLLHUP:表示对应的文件描述符被挂断
6. EPOLLET:将 EPOLL 设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。
7. EPOLLONESHOT:只监听一次事件,当监听完这个事件之后,如果还需要继续监听这个 socket 的话,需要再次把这个 socket 加入 EPOLL 队列里
epoll_wait
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
收集在 epoll 监控的事件中已经发送的事件。
参数 events 是分配好的 epoll_event 结构体数组
epoll 将会把发生的事件赋值到 events 数组中(evens 不可以是空指针,内核只负责把数据赋值到这个 events 数组中,不会去帮助我们在用户态中分配内存)。
maxevents 告之内核这个 events 有多大,这个 maxevents 的值不能大于创建 epoll_create() 时的 size。
参数 timeout 是超时时间(毫秒,0会立即返回,-1是永久阻塞)。
如果函数调用成功,返回对应 I/O 上已经准备好的文件秒描述符数目,如返回 0 表示已超时,返回小于 0 表示函数失败。
epoll 工作原理
当某一个进程调用 epoll_create 方法时,Linux 内核会创建一个 eventpoll 结构体,这个结构体中有两个成员与 epoll 的使用方式密切相关。
struct eventpoll
{..../*红黑树的根节点,这颗树中存储着所有添加到 epoll 中的需要监控的事件*/struct rb_root rbr;/*双链表中则存放着将要通过 epoll_wait 返回给用户的满足条件的事件*/ struct list_head rdlist;....
};
struct eventpoll
{//红黑树的根节点,这颗树中存储着所有添加到 epoll 中的需要监控的事件struct rb_root rbr;//双链表中则存放着将要通过 epoll_wait 返回给用户的满足条件的事件*/ struct list_head rdlist;
};
1. 每一个 epoll 对象都有一个独立的 eventpoll 结构体,用于存放通过 epoll_ctl 方法向 epoll 对象中添加进来的事件
2. 这些事件都会被挂载在红黑树中,如此,重复添加的事件就可以通过红黑树而高效识别出来(红黑树的插入时间效率是 logn,其中 n 为树的高度)。
3. 而所有添加到 epoll 中的事件都会与设备(网卡)驱动程序建立回调关系,也就是说,当响应的事件发生时会调用这个回调方法。
4. 这个回调方法在内核中叫 ep_poll_callback,它会将发生的事件添加到 rdist 双链表中。
5. 在 epoll 中,对于每一个事件,都会建立一个 epitem 结构体。
struct epitem
{struct rb_node rbn; // 红黑树节点struct list_head rdllink; // 双向链表节点struct epoll_filefd ffd; // 事件句柄信息struct eventpoll *ep; // 指向其所属的 eventpoll 对象struct epoll_event event; //期待发生的事件类型
}
当调用 epoll_wait 检查是否有事件发生时,只需要检查 eventpoll 对象中的 rdist 双链表中是否有 epitem 元素即可。
如果 rdist 不为空,则把发生的事件赋值到用户态,同时将事件数量返回给用户,这个操作的事件复杂度是 O(1).
总结以下,epoll 的使用过程就是三部曲:
1. 调用 epoll_create 创建一个 epoll 句柄、
2. 调用 epoll_ctl 将要监控的文件描述符进行注册
3. 调用 epoll_wait,等待文件描述符就绪
epoll 的优先(和 select 的缺点对应)
1. 接口使用方便:虽然拆分成了三个函数,但是反而使用起来更方便高效,不需要每次循环都设置关注的文件描述符,也做到了输入输出参数分离。
2. 数据拷贝轻量:只在合适的时候调用 EPOLL_CTL_ADD 将文件描述符结构拷贝到内核中,这个操作并不频繁(而 select/poll 都是每次循环都要进行拷贝)
3. 事件回调机制:避免使用遍历,而是使用回调函数的方式,将就绪的文件描述符结构加入到就绪队列中,epoll_wait 返回直接访问就绪队列就知道哪些文件描述符就绪,这个操作时间复杂度O(1),即文件描述符数目很多,效率也不会收到影响。
epoll 工作方式
epoll 有两种工作方式,这里举一个妈妈喊你回家吃饭的例子:
你正在吃鸡, 眼看进入了决赛圈, 你妈饭做好了, 喊你吃饭的时候有两种方式:
1. 如果你妈喊你一次, 你没动, 那么你妈会继续喊你第二次, 第三次...(亲妈,水平触发)
2. 如果你妈喊你一次, 你没动, 你妈就不管你了(后妈, 边缘触发)
epoll 有两种工作方式 - 水平触发(LT) 和 边缘触发(ET)
假如有这样一个例子:
我们已经把一个 tcp socket 添加到 epoll 描述符
这个时候 socket 的另一端被写入了 2KB 的数据
调用 epoll_wait,并且它会返回,说明它已经准备好了读取操作
然后调用 read,只读取了 1KB 的数据
继续调用 epoll_wait .....
水平触发 Level Triggered 工作模式
epoll 默认状态下就是 LT 工作模式
当 epoll 检测到 socket 上事件就绪的时候,可以不立即进行处理。或者只处理一部分
如上面的例子,由于只读了 1K 数据,缓冲区中还剩 1K 数据,在第二次调用 epoll_wait 时,epoll_wait 仍然会立即返回并通知 socket 读事件就绪。
知道缓冲区上所有数据都被处理完,epoll_wait 才不会立刻返回
支持阻塞读写和非阻塞读写
边缘触发 Edge Triggered 工作模式
如果我们在第一步将 socket 添加到 epoll 描述符的时候使用了 EPOLLET 标志,epoll 进入 ET 工作模式。
当 epoll 检测到 socket 上事件就绪时,必须立刻处理
如上面的例子,虽然只读了 1K 的数据,缓冲区还剩 1K 的数据,在第二次调用 epoll_wait 的时候,epoll_wait 不会再返回了。
也就是说,ET 模式下,文件描述符上的事件就绪后,只有一次处理机会。
ET 的性能比 LT 性能更高(epoll_wait 返回的次数少了很多)。Nginx 默认采用 ET 模式使用 epoll。
只支持非阻塞的读写。
select 和 poll 其实也是工作在 LT 模式下,epoll 既可以支持 LT,也可以支持 ET。
对比 LT 和 ET
LT 是 epoll 的默认行为。
使用 ET 能够减少 epoll 触发的次数,但是代价就是强逼这程序员一次响应就绪过程中就把所有的数据都处理完。
相当于一个文件描述符就绪之后,不会反复提示就绪,看起来就比 LT 更高效一些,但是在 LT 情况下如果也能做到每次就绪的文件描述符都立刻处理,不让这个就绪被重复提示的话,其实性能也是一样的。
另一方面,ET 的代码复杂程度更高了。
理解 ET 模式和非阻塞文件描述符
使用 ET 模式的 epoll,需要将文件描述符设置为非阻塞,这个不是接口上的要求,而是 “工程实践” 上的要求。
假设这样的场景:服务器接收到一个 10K 请求,会向客户端返回一个应答数据。如果客户端收不到应答,不会发送第二个 10k 请求。
如果服务端写的代码是阻塞式的 read,并且一次只 read 1k 数据的话(read 不能保证一次就把所有的数据都读出来,参考 man 手册的说明,可能被信号打断),剩下的 9k 数据就会待在缓冲区中。
但是问题来了。
1. 服务器只读到了 1k 个数据,要 10k 读完才会给客户返回响应数据
2. 客服端读到服务器的响应,才会发送下一个请求
3. 客户端发送下一个请求,epoll_wait 才会返回,才能去读缓冲区中剩余的数据。
所以,为了解决这个问题(阻塞 read 不一定能一下把完整的请求读完),于是就可以使用非阻塞轮询的方式来读取缓冲区,保证一定能把完整的请求都读出来。
而如果是 LT 没这个问题,只要缓冲区中的数据没读完,就能够让 epoll_wait 返回文件描述符就绪。
epoll 使用场景
epoll 的高性能,是有一定的特定场景的。如果场景选择的不适宜,epoll 的性能可能适得其反。
对于多连接,且多连接只有一部分连接比较活跃时,比较适合使用 epoll。
例如,典型的一个需要处理上万个客户端的服务器,例如各种互联网 APP 的入口服务器,这样的服务器就很适合 epoll。
如果只是系统内部,服务器和服务器之间进行通信,只有少数的几个连接,这种情况下用 epoll 就并不合适,具体要根据需要和场景特点来决定使用那种 IO 模型。
epoll 的惊群效应
epoll 惊群效应产生的原因
在 Linux 下使用 epoll 编写过 socket 的服务器程序,在多线程环境下可能会遇到 epoll 惊群效应。那么什么是惊群效应呢。其产生的原因是什么呢?
在多线程或者多进程环境下,有些人为了提高程序的稳定性,往往会让多个线程或者多个进程同时在 epoll_wait 监听的 socket 描述符。当一个新的链接请求进来时,操作系统不知道选派哪个进程或者进程处理此事件,则干脆将其中几个线程或者进程给唤醒,而实际上只有其中一个进程或者线程能够成功处理 accept 事件,其他线程都将失败,且 errno 操作码为 EAGAIN。这种现象称为惊群效应,结果是肯定的,惊群效应肯定会带来资源的消耗和性能的影响。
那么如何解决这个问题呢?
多线程环境下解决惊群问题方法
这种情况,不建议让多个线程同时在 epoll_wait 监听的 socket,而是让其中一个线程 epoll_wait 监听的 socket,当有新的链接请求进来后,由 epoll_wait 的线程调用 accept,建立新的连接,然后交给其他工作线程处理后续的数据读写请求,这样可以避免了由于多线程环境下的 epoll_wait 惊群效应的问题
多进程下的解决方法
目前很多开源软件,如lighttpd,nginx等都采用master/workers的模式提高软件的吞吐能力及并发能力,在nginx中甚至还采用了负载均衡的技术,在某个子进程的处理能力达到一定负载之后,由其他负载较轻的子进程负责epoll_wait的调用,那么nginx和Lighttpd是如何避免epoll_wait的惊群效用的。
lighttpd的解决思路是无视惊群效应,仍然采用master/workers模式,每个子进程仍然管自己在监听的socket上调用epoll_wait,当有新的链接请求发生时,操作系统仍然只是唤醒其中部分的子进程来处理该事件,仍然只有一个子进程能够成功处理此事件,那么其他被惊醒的子进程捕获EAGAIN错误,并无视。
nginx的解决思路:在同一时刻,永远都只有一个子进程在监听的socket上epoll_wait,其做法是,创建一个全局的pthread_mutex_t,在子进程进行epoll_wait前,则先获取锁。
ngx_int_t ngx_trylock_accept_mutex(ngx_cycle_t *cycle) { if (ngx_shmtx_trylock(&ngx_accept_mutex)){if (ngx_enable_accept_events(cycle) == NGX_ERROR) { ngx_shmtx_unlock(&ngx_accept_mutex); return NGX_ERROR; } ngx_accept_mutex_held = 1; return NGX_OK; } if (ngx_accept_mutex_held){ if (ngx_disable_accept_events(cycle) == NGX_ERROR){ return NGX_ERROR; } ngx_accept_mutex_held = 0; } return NGX_OK; }
且只有在ngx_accept_disabled < 0 时,才会去获取全局锁,及只有在子进程的负载能力在一定的范围下才会尝试去获取锁,并进入epoll_wait监听的socket。
void ngx_process_events_and_timers(ngx_cycle_t *cycle)
{if (ngx_accept_disabled > 0){ngx_accept_disabled--;}else{if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR){return;}}
}
ngx_accept_disabled = ngx_cycle->connection_n / 8 - ngx_cycle->free_connection_n;
表示当子进程的连接数达到连接总数的7/8时,是不会尝试去获取全局锁,只会专注于自己的连接事件请求。
相关文章:
计算机网络之多路转接epoll
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络之多路转接epoll 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交流讨论💌 目…...
BPMN与一般的流程图区别在那里?
1. 语义和标准性 BPMN(业务流程建模符号) 基于标准语义:BPMN是一种标准化的业务流程建模语言,拥有一套严谨的语义规范。它由国际对象管理组织(OMG)维护,定义了事件、活动、网关和流向等元素的确…...
内容与资讯API优质清单
作为开发者,拥有一套API合集是必不可少的。这个开发者必备的API合集汇集了各种实用的API资源,为你的开发工作提供了强大的支持!无论你是在构建网站、开发应用还是进行数据分析,这个合集都能满足你的需求。你可以通过这些免费API获…...
uniapp获取内容高度
获取内容高度 getNewsHieght(index) {uni.createSelectorQuery().select(.content_${index}).boundingClientRect(rect > {console.log(打印该盒子的元素, rect.height);swiperHeight.value rect.height// console.log(打印swiperHeight的数值,this.swiperHeight);}).exec…...
Unity局部和世界坐标系相互转换的实现原理
注:本篇是基于唐老师的学习视频做的一些理论实践,需要提前知道一些线性代数的基础知识,原视频链接: 8.数学基础知识学习说明_哔哩哔哩_bilibili 前期准备: 知识点①: Unity中需要遵守的设定:…...
数据结构(Java版)第六期:LinkedList与链表(一)
目录 一、链表 1.1. 链表的概念及结构 1.2. 链表的实现 专栏:数据结构(Java版) 个人主页:手握风云 一、链表 1.1. 链表的概念及结构 链表是⼀种物理存储结构上⾮连续存储结构,数据元素的逻辑顺序是通过链表中的引⽤链接次序实现的。与火车…...
浅谈文生图Stable Diffusion(SD)相关模型基础
1.U-Net模型基础 1.基础概念 UNet模型是一种基于卷积神经网络的图像分割算法,它采用了U型的网络结构,由编码器(下采样路径)和解码器(上采样路径)两部分组成。 编码器负责提取输入图像的特征,…...
7-10 函数和排序练习一
输入n个数(n<10),对其中的素数进行排序(剔除非素数),输出排序后的数列结果。 建议:编写若干函数,用以判断素数,以及对数组进行排序。 输入格式: 第一行是一个正整数t,表示测试的总数。 然后…...
【FFmpeg 教程 一】截图
本章使用 ffmpeg 实现观影中经常会用到的功能,截图。 以下给出两种方式。 课程需具备的基础能力:Python 1. 使用 subprocess 调用 FFmpeg 命令 import subprocess def extract_frame(video_path, output_image_path, timestamp"00:00:05")&qu…...
Python选择题训练工具:高效学习、答题回顾与音频朗读一站式体验
一、引言 随着人工智能技术的不断进步,传统的教学方式已经逐渐向智能化、互动化转变。在众多英语测试题型中,选择题作为一种高效的方式被广泛应用于各类培训与考试中。为了帮助学生高效学习与自测,本篇文章将采用Python编写一款基于 Python …...
【Python】使用Selenium 操作浏览器 自动化测试 记录
【自动化】Python SeleniumUtil 工具 开启开发者模式 自动安装油猴用户脚本等-CSDN博客文章浏览阅读389次。【自动化】Python SeleniumUtil 工具。https://blog.csdn.net/G971005287W/article/details/144565691?spm1001.2014.3001.5501【学习记录】浏览器指纹相关学习记录&am…...
汽车IVI中控开发入门及进阶(42):OpenVG
概览: OpenVG是一个无版权、跨平台的API,它为高级用户界面和矢量图形库(如SVG)提供了一个低级硬件加速接口。OpenVG主要针对需要便携式加速高质量矢量图形以获得引人注目的用户界面和文本的消费电子产品、手持设备、可穿戴设备和汽车设备,同时使硬件加速能够在非常低的功…...
两点间最短距离 - Dijkstra
一、汇总 算法场景说明参考BFS 树 无权图的搜索 标准BFS默认搜索一条最短路径 改造后可以输出所有最短路径 https://blog.csdn.net/m0_37145844/article/details/144534202DFS走迷宫主要利用回溯算法思想,不保证最短路径https://blog.csdn.net/m0_37145844/articl…...
0002__GPU
国内GPU公司主要包括以下几家: 摩尔线程:摩尔线程被誉为“中国版英伟达”,成立于2019年,由前英伟达全球副总裁张建中创立。该公司已获得425项授权专利,计划上市,目标估值高达1500亿元。摩尔线程的技术…...
StarRocks 排查单副本表
文章目录 StarRocks 排查单副本表方式1 查询元数据,检查分区级的副本数方式2 SHOW PARTITIONS命令查看 ReplicationNum修改副本数命令 StarRocks 排查单副本表 方式1 查询元数据,检查分区级的副本数 # 方式一 查询元数据,检查分区级的副本数…...
基于字节大模型的论文翻译(含免费源码)
基于字节大模型的论文翻译 源代码: 👏 star ✨ https://github.com/boots-coder/LLM-application 展示 项目简介 本项目是一个基于大语言模型(Large Language Model, LLM)的论文阅读与翻译辅助工具。它通过用户界面(…...
【原生js案例】ajax的简易封装实现后端数据交互
ajax是前端与后端数据库进行交互的最基础的工具,第三方的工具库比如jquery,axios都有对ajax进行第二次的封装,fecth是浏览器原生自带的功能,但是它与ajax还是有区别的,总结如下: ajax与fetch对比 实现效果 代码实现 …...
uniapp Native.js 调用安卓arr原生service
有问题,文中的内容不正确 最近搞了个uni小项目,一个定制的小平板,带一个nfc设备,厂家只给了一套安卓原生demo,头一次玩原生安卓,废了好半天劲打出来arr包,想镶进uniapp里,网上查了好…...
关于画火山图(by ggplot2)的一些总结和经验
愿武艺晴小朋友一定得每天都开心! 文献中常用经典的火山图,是展示差异表达基因的利器。每次测完转录组,做实验组和对照组的比较后,都会用到。 我自己也画了不算太多也不算太少的次数。然后最近画的时候忽然间意识到这个可视化方法我经常用,却没系统的整理过,一些tips散…...
组装一台电脑需要哪些硬件设备?点击了解
组装一台电脑是一个既有趣又实用的过程,我们可以根据自己的需求和预算来定制一台完全符合个人使用习惯的计算机。 一、核心部件 1、中央处理器(CPU) CPU是计算机的“大脑”,负责执行各种计算任务。它的性能直接影响到计算机的运…...
Mac M1使用pip3安装报错
1. Mac系统使用pip3安装组件的时候报”外部管理环境”错误: error: externally-managed-environment 2.解决办法 去掉这个提示 1、先查看当前python版本: python3 --version 2、查找EXTERNALLY-MANAGED 文件的位置(根据自己当前使用的pytho…...
在Linux系统安装配置 MySQL 和 hive,hive配置为远程模式
前提:已安装配置好了Hadoop环境,因为hive的底层是Hadoop 1 Mysql安装 搜索Centos7自带的mariadb rpm -qa|grep mariadb 卸载mariadb rpm -e mariadb-libs-5.5.64-1.el7.x86_64 --nodeps 再搜索一次看看是否还存在 rpm -qa|grep mariadb 安装mysql 创…...
亚信安全与方天股份达成战略合作,双向奔赴助力数字化转型
近日,亚信安全科技股份有限公司(以下简称“亚信安全”)正式与青岛方天科技股份有限公司(以下简称“方天股份”)签订合作框架协议。双方强强携手,在网络安全运营平台共建、信息化项目安全支撑、政企市场拓展…...
ubuntu镜像开荒ssh
直接unminimized deprecated me ubuntu 安装 ssh,用 service 启动 4o 在 Ubuntu 上安装并启动 SSH 服务,你可以按照以下步骤进行操作: 更新软件包列表: 首先,确保你的软件包列表是最新的。打开终端并运行以下命令&…...
前端yarn工具打包时网络连接问题排查与解决
最近线上前端打包时提示 “There appears to be trouble with your network connection”,以此文档记录下排查过程。 前端打包方式 docker启动临时容器打包,命令如下 docker run --rm -w /app -v pwd:/app alpine-node-common:v16.20-pro sh -c "…...
CCF-GESP 等级考试 C++ 真题解析目录
GESP C 一级 序号日期真题解析链接12023.03CCF-GESP 等级考试 2023年3月认证C一级真题解析22023.06CCF-GESP 等级考试 2023年6月认证C一级真题解析32023.09[CCF-GESP 等级考试 2023年9月认证C一级真题解析]42023.12[CCF-GESP 等级考试 2023年12月认证C一级真题解析]52024.03[C…...
如何使用 WebAssembly 扩展后端应用
1. WebAssembly 简介 随着互联网的发展,越来越多的应用借助 Javascript 转到了 Web 端,但人们也发现,随着移动互联网的兴起,需要把大量的应用迁移到手机端,随着手端的应用逻辑越来越复杂,Javascript 的解析…...
从DINO到DINOv2——自监督视觉Transformer的升级改进之路(基于ViT)
前言 之所以关注到DINOV2,原因在于我解读多个具身机器人模型时——发现他们的视觉基座都用的DINOV2,比如 rekepOpen-TeleVisionOpenVLACogACTOKAMI 不过,实话讲,DINO论文的可读性是真的不高,使得本次解读不易..总之…...
CCF-GESP 等级考试 2024年12月认证C++七级真题解析
2024年12月真题 一、单选题(每题2分,共30分) 正确答案:D 解析:考察字符类型和ASCII码值。 字符类型参与运算,是它所对应的ASCII码值在参与运算,运算结果为整数值。小写字母 b 的ASCII码为98&am…...
Qt之串口设计-线程实现(十二)
Qt开发 系列文章 - Serial-port(十二) 目录 前言 一、SerialPort 二、实现方式 1.创建类 2.相关功能函数 3.用户使用 4.效果演示 5.拓展应用-实时刷新 总结 前言 Qt作为一个跨平台的应用程序开发框架,在串口编程方面提供了方便易用…...
20241217使用M6000显卡在WIN10下跑whisper来识别中英文字幕
20241217使用M6000显卡在WIN10下跑whisper来识别中英文字幕 2024/12/17 17:21 缘起,最近需要识别法国电影《地下铁》的法语字幕,使用 字幕小工具V1.2【whisper套壳/GUI封装了】 无效。 那就是直接使用最原始的whisper来干了。 当你重装WIN10的时候&#…...
基于 uniapp 开发 android 播放 webrtc 流
一、播放rtsp协议流 如果 webrtc 流以 rtsp 协议返回,流地址如:rtsp://127.0.0.1:5115/session.mpg,uniapp的 <video> 编译到android上直接就能播放,但通常会有2-3秒的延迟。 二、播放webrtc协议流 如果 webrtc 流以 webrt…...
Java反射学习(3)(“反射“机制获取成员变量及详细信息(Field类))
目录 一、基本引言。 (1)基本内容回顾。 (2)本篇博客的核心内容-基本介绍。 二、Java中使用"反射"机制获取成员变量及内部的详细信息。 (1)"反射"机制获取成员变量及详细信息的基本概念…...
Flutter组件————AppBar
AppBar 是 Flutter 中用于创建应用程序顶部栏的组件,它遵循 Material Design 规范。 参数: 参数名称类型描述titleWidget设置 AppBar 中的标题文本或自定义标题小部件。automaticallyImplyLeadingbool决定是否自动添加返回按钮(如果页面不是…...
LabVIEW在电液比例控制与伺服控制中的应用
LabVIEW作为一种图形化编程环境,广泛应用于各类控制系统中,包括电液比例控制和伺服控制领域。在这些高精度、高动态要求的控制系统中,LabVIEW的优势尤为突出。以下从多个角度探讨其应用与优势: 1. 灵活的控制架构 LabVIEW为电…...
Jenkins
1.安装 需要先安装jdk11 yum install -y java-11 yum localinstall -y jenkins-2.361.4-1.1.noarch.rpm 启动服务 systemctl enable --now jenkins.service 开始安装 进入下一步,关掉即可 下一步,点击开始使用Jenkins 2.插件的安装 1.方式一&…...
Sigrity System Explorer Snip Via Pattern From Layout模式从其它设计中截取过孔模型和仿真分析操作指导
Sigrity System Explorer Snip Via Pattern From Layout模式从其它设计中截取过孔模型和仿真分析操作指导 Sigrity System Explorer Snip Via Pattern From Layout模式支持从其它设计中截取过孔模型用于仿真分析,同样以差分模板为例 具体操作如下 双击打开System Explorer软件…...
Redux使用教程
Redux使用教程 一、安装依赖 安装ReduxToolkit、react-redux,命令行输入 npm i reduxjs/toolkit react-redux二、创建目录结构 创建标准的store目录结构,当然这一步不是必须的 ① 在src下创建store文件夹 ② 在store文件夹中创建一个modules文…...
gpu硬件架构
1.简介 NVIDIA在视觉计算和人工智能(AI)领域处于领先地位;其旗舰GPU已成为解决包括高性能计算和人工智能在内的各个领域复杂计算挑战所不可或缺的。虽然它们的规格经常被讨论,但很难掌握各种组件的清晰完整的图景。 这些GPU的高性…...
volatility2工具的使用vol2工具篇
vol2工具 命令格式:vol.py -f [image] --profile[profile] [plugin] 1、查看系统的操作版本,系统镜像信息 2.查看用户名密码信息,当前操作系统中的password hash,例如SAM文件内容 3.从注册表提取LSA密钥信息(已解密&…...
LeetCode:104.二叉树的最大深度
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:104.二叉树的最大深度 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节…...
【游戏设计原理】19 - 得益
一、学习与分析 核心概念总结: 得益(Payoff):玩家在游戏中通过决策获得的产出,包括正面和负面。它可以以分数、等级、货币等形式体现。玩家差异:不同玩家追求不同类型的回报,有些人重视分数或…...
简单配置,全面保护:HZERO审计服务让安全触手可及
HZERO技术平台,凭借多年企业资源管理实施经验,深入理解企业痛点,为您提供了一套高效易用的审计解决方案。这套方案旨在帮助您轻松应对企业开发中的审计挑战,确保业务流程的合规性和透明度。 接下来,我将为大家详细介绍…...
day5,数据结构,单向,双向,循环链表
1】思维导图 2】完成单向循环链表的所有操作 【创建、判空、尾插、遍历、尾删、销毁】 创建: LooplinkPtr caerte() {LooplinkPtr h(LooplinkPtr)malloc(sizeof(Looplink));if(NULLh){printf("创建失败\n");return NULL;}h->len0;h->data0;h->…...
构建高性能异步任务引擎:FastAPI + Celery + Redis
在现代应用开发中,异步任务处理是一个常见的需求。无论是数据处理、图像生成,还是复杂的计算任务,异步执行都能显著提升系统的响应速度和吞吐量。今天,我们将通过一个实际项目,探索如何使用 FastAPI、Celery 和 Redis …...
Linux 中检查 Apache Web Server (httpd) 正常运行时间的 4 种方法
注:机翻,未校。 4 Ways To Check Uptime of Apache Web Server (httpd) on Linux November 28, 2019 by Magesh Maruthamuthu We all know about the purpose of uptime command in Linux. 我们都知道 Linux 中 uptime 命令的目的。 It is used to c…...
简易CPU设计入门:内存初始化文件(三)
项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后,我…...
深度解析Meta最新发布的虚拟试穿技术:一键试衣的革命性进展
随着电子商务的发展,消费者对在线购物体验的要求越来越高。为了满足这一需求,Meta最近发布了一款面向电商人群的一键试衣工具,它不仅能够实现精确控制人物的外观(虚拟试衣)和姿态(姿态迁移),还能保持参考图像中的细节纹理特征,避免失真。这项技术通过引入基于注意力机…...
Apache Solr RCE(CVE-2017-12629)--vulhub
Apache Solr 远程命令执行漏洞(CVE-2017-12629) Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个…...
使用二分查找法找出给定点距离给定点集合距离最近的点
1、场景描述 给定点Point A (x,y)和 直线点集合 Points [(x1,y1),(x2,y2),(x3,y3),(x4,y4),(x5,y5)......],计算出集合中距离点A最近的一个点 (如果集合中的两个点距离A点最近且相等,则只取其中一个) 2、代码&#x…...