事件驱动reactor的原理与实现

fdset 集合:(就是说)

  • fd_set是一个位图(bitmap)结构
  • 每个位代表一个文件描述符
  • 0表示不在集合中,1表示在集合中

fd_set结构(简化):
[0][1][2][3][4][5]...[1023]
 0  0  1  0  1  0     0
   ↑     ↑
   |     |
sockfd  clientfd

// select方式
fd_set rfds;
select(maxfd+1, &rfds, NULL, NULL, NULL);// epoll方式
struct epoll_event events[1024];
epoll_wait(epfd, events, 1024, -1);

 maxfd就是1023,rfds就是read fds 读事件,

select的返回值是就绪事件操作如下:

int ret = select(nfds, &readfds, &writefds, &exceptfds, &timeout);
if (ret > 0) {// 有事件发生printf("有 %d 个文件描述符就绪\n", ret);// 检查读事件if (FD_ISSET(sockfd, &readfds)) {// 处理读事件}// 检查写事件if (FD_ISSET(sockfd, &writefds)) {// 处理写事件}// 检查异常事件if (FD_ISSET(sockfd, &exceptfds)) {// 处理异常事件}
}

 fd操作如下:

// 清空集合
FD_ZERO(&rfds);
// 结果:[0][0][0][0][0]...[0]// 添加fd到集合
FD_SET(sockfd, &rfds);
// 例如sockfd=2:[0][0][1][0][0]...[0]// 从集合中删除fd
FD_CLR(sockfd, &rfds);
// 例如sockfd=2:[0][0][0][0][0]...[0]// 检查fd是否在集合中
FD_ISSET(sockfd, &rfds);
// 返回1表示在集合中,0表示不在

a) 一个连接一个线程:

优点:
- 实现简单
- 逻辑清晰
- 适合并发量小的场景

缺点:
- 线程资源消耗大
- 线程切换开销大
- 不适合高并发

select

优点:
- 单线程处理多连接
- 资源消耗小
- 适合中等并发

缺点:
- 效率较低
- 连接数有限
- 需要轮询

epoll

优点:
- 高效的事件通知
- 适合高并发
- 资源消耗小

缺点:
- 实现较复杂
- 需要系统支持

// 多线程方式
void *client_thread(void *arg) {int clientfd = *(int *)arg;while (1) {recv(clientfd, buffer, 1024, 0);// 处理数据}
}// epoll方式
while (1) {epoll_wait(epfd, events, 1024, -1);for (i = 0; i < nready; i++) {if (events[i].data.fd == sockfd) {// 处理新连接} else {// 处理数据}}
}
// 方式1:一个连接一个线程
while (1) {int clientfd = accept(sockfd, ...);pthread_t thid;pthread_create(&thid, NULL, client_thread, &clientfd);
}// 方式2:单线程处理多个连接(select)
while (1) {select(maxfd+1, &rset, NULL, NULL, NULL);// 处理多个连接
}// 方式3:单线程处理多个连接(epoll)
while (1) {epoll_wait(epfd, events, 1024, -1);// 处理多个连接
}

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

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

相关文章

一分钟在Cherry Studio和VSCode集成火山引擎veimagex-mcp

MCP的出现打通了AI模型和外部数据库、网页API等资源&#xff0c;成倍提升工作效率。近期火山引擎团队推出了 MCP Server SDK&#xff1a; veimagex-mcp。本文介绍如何在Cherry Studio 和VSCode平台集成 veimagex-mcp。 什么是MCP MCP&#xff08;Model Context Protocol&…

掌控随心 - 服务网格的流量管理艺术 (Istio 实例)

掌控随心 - 服务网格的流量管理艺术 (Istio 实例) 想象一下,没有服务网格的时候,我们要实现像“将 1% 的用户流量导入到新版本应用”、“根据用户设备类型访问不同后端”、“模拟下游服务故障”这类高级流量策略,通常需要在代码、负载均衡器、API 网关等多个地方进行复杂且分…

[ARM][汇编] 01.基础概念

目录 1.全局标号 1.1.使用方法 1.1.1.声明全局标号 1.1.2.定义全局标号 1.1.3.引用全局标号 1.2.全局标号与局部标号的区别 1.3.注意事项 2.局部标号 2.1.使用方法 2.1.1.定义局部标号 2.1.2.跳转引用 2.2.局部标号与全局标号的对比 2.3.注意事项 3.符号定义伪指…

如何使用远程桌面控制电脑

目的&#xff1a; 通过路由器使用pc控制台式机&#xff0c;实现了有线/无线pc与台式机的双向远程桌面控制 最核心就两条&#xff1a;get ip地址与被控制机器的账户与密码。 现象挺神奇&#xff1a;被控制电脑的电脑桌面处于休眠模式&#xff0c;此时强行唤醒被控电脑会导致中断…

Hive表JOIN性能问

在处理100TB的Hive表JOIN性能问题时&#xff0c;需采用分层优化策略&#xff0c;结合数据分布特征、存储格式和计算引擎特性。以下是系统性优化方案&#xff1a; 1. 数据倾斜优化&#xff08;Skew Join&#xff09; 1.1 识别倾斜键 方法&#xff1a;统计JOIN键的分布频率&…

MongoDB 的核心概念(文档、集合、数据库、BSON)是什么?

MongoDB 是一个面向文档的数据库&#xff0c;它的核心概念与传统的关系型数据库&#xff08;RDBMS&#xff09;有所不同。以下是它的四个主要核心概念&#xff1a; 文档 (Document) 定义&#xff1a; 文档是 MongoDB 中的基本数据单元。它类似于关系型数据库中的一行记录&#…

AI智慧公园管理方案:用科技重塑市民的“夜游体验”

AI智慧公园管理方案&#xff1a;多场景智能巡检与安全防控 一、背景与痛点分析 夏季夜间&#xff0c;公园成为市民休闲娱乐的核心场所&#xff0c;但管理难度随之激增&#xff1a; 宠物管理失控&#xff1a;未牵绳宠物进入园区&#xff0c;随地排泄、惊扰游客&#xff0c;甚…

Spring Cloud Gateway 聚合 Swagger 文档:一站式API管理解决方案

前言 在微服务架构中&#xff0c;随着服务数量的增加&#xff0c;API文档管理变得越来越复杂。每个微服务都有自己的Swagger文档&#xff0c;开发人员需要记住每个服务的文档地址&#xff0c;这无疑增加了开发难度。本文将介绍如何使用Spring Cloud Gateway聚合所有微服务的Sw…

尼康VR镜头防抖模式NORMAL和ACTIVE的区别(私人笔记)

1. NORMAL 模式&#xff08;常规模式&#xff09; 适用场景&#xff1a;一般手持拍摄&#xff0c;比如人像、静物、风景或缓慢平移镜头&#xff08;如水平追拍&#xff09;等。工作特性&#xff1a; 补偿手抖引起的小幅度震动&#xff08;比如手持时自然的不稳&#xff09;&am…

Babylon.js学习之路《四、Babylon.js 中的相机(Camera)与视角控制》

文章目录 1. 引言&#xff1a;为什么相机是 3D 场景的“眼睛”&#xff1f;1.1 相机的核心作用1.2 常见相机类型概览 2. 相机基础参数解析2.1 通用属性2.2 相机坐标系 3. 详解常用相机类型3.1 自由相机&#xff08;FreeCamera&#xff09;3.2 弧形旋转相机&#xff08;ArcRotat…

【Python】普通方法、类方法和静态方法的区分

Python 中普通方法、类方法和静态方法的区分 下面我将从多个维度对这三种方法进行详细对比&#xff0c;并通过示例说明它们的使用场景和区别。 1. 核心区别总结 特性普通方法(实例方法)类方法(classmethod)静态方法(staticmethod)定义装饰器无classmethodstaticmethod第一个…

geoserver发布arcgis瓦片地图服务(最新版本)

第一步&#xff1a;下载geoserver服务&#xff0c;进入bin目录启动 需要提前安装好JDK环境&#xff0c;1.8及以上版本 安装完成&#xff0c;页面访问端口&#xff0c;进入控制台界面,默认用户名密码admin/geoserver 第二步&#xff1a;下载地图 破解版全能电子地图下载器&…

Linux服务之lvs集群与dr模式部署

目录 一.lvs相关概述 1.lvs集群的工作模式 2.lvs调度算法 3.ipvsadm工具 二.DR模式部署 一.lvs相关概述 1.lvs集群的工作模式 lvs-nat&#xff1a;修改请求报文的目标IP,多目标IP的DNAT lvs-dr&#xff1a;操纵封装新的MAC地址&#xff08;直接路由&#xff09;lvs-tu…

OFCMS代码审计-freemaker注入sql注入xxexss文件上传

环境搭建 下载地址&#xff1a;https://gitee.com/oufu/ofcms/repository/archive/V1.1.2?formatzip SSTI模板注入&#xff08;freemaker) FreeMarker模板注入实现远程命令执行 - Eleven_Liu - 博客园 在admin中找到这个 发现请求的是这个 找到他 <#assign value"f…

一键部署NSFW检测模型:快速识别并过滤敏感图片内容

以下是对nsfw_detector的简单介绍&#xff1a; nsfw_detector是一个 NSFW 内容检测器&#xff0c;支持快速docker私有部署&#xff0c;提供API服务低资源消耗&#xff0c;2GB内存即可运行该模型&#xff0c;多核CPU自动调度加速推理 - 可以识别多种文件类型&#xff1a;图片、…

【Redis】缓存穿透、缓存雪崩、缓存击穿

1.缓存穿透 是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;导致请求直接穿透缓存到达数据库&#xff0c;给数据库带来压力的情况。 常见的解决方案有两种&#xff1a; 缓存空对象&#xff1a;实现简单&#xff0c;维护方便&am…

【C】初阶数据结构15 -- 计数排序与稳定性分析

本文主要讲解七大排序算法之外的另一种排序算法 -- 计数排序 目录 1 计数排序 1&#xff09; 算法思想 2&#xff09; 代码 3&#xff09; 时间复杂度与空间复杂度分析 &#xff08;1&#xff09; 时间复杂度 &#xff08;2&#xff09; 空间复杂度 4&#xff09; 计…

mysql的一个缺点

最近再移植一个从oracle转mysql的项目&#xff0c;喜提一个报错&#xff1a; You cant specify target table A016 for update in FROM clause 对应的程序代码&#xff1a; public void setCurrent(String setId, String pk, String userId) throws SysException {String[]…

Ubuntu 上安装 FTP 服务、开放指定端口并创建用户

一、安装 FTP 服务&#xff08;vsftpd&#xff09; sudo apt update sudo apt install vsftpd -y二、修改 vsftpd 配置&#xff0c;使用 21000 端口 编辑配置文件&#xff1a; sudo nano /etc/vsftpd.conf修改或添加以下配置&#xff1a; 使用以下配置文件需要修改的地方:l…

用自写的jQuery库+Ajax实现了省市联动

1. 省市联动&#xff1a;在网页上&#xff0c;选择对应的省份之后&#xff0c;动态的关联出该省份对应的市。选择对应的市之后&#xff0c;动态地关联出城市对应的区。 2. 设计数据库表 t_area &#xff08;区域表&#xff09; id(PK-自增) code name pcode ------------…