当前位置: 首页 > news >正文

《UNIX网络编程卷1:套接字联网API》第6章 IO复用:select和poll函数

《UNIX网络编程卷1:套接字联网API》第6章 I/O复用:select和poll函数


6.1 I/O复用的核心价值与适用场景

I/O复用是高并发网络编程的基石,允许单个进程/线程同时监控多个文件描述符(套接字)的状态变化,从而高效处理多个客户端请求。其核心价值在于:

  • 资源高效利用:避免为每个连接创建独立线程/进程的内存与调度开销;
  • 事件驱动模型:仅在数据可读/可写时触发处理逻辑,减少空转;
  • 实时性保障:及时响应多个连接的并发事件。

典型应用场景

  • Web服务器(如Nginx):处理数千并发HTTP连接;
  • 实时通信系统(如IM):同时管理多个客户端的长连接;
  • 嵌入式网关:资源受限设备中处理多路传感器数据。

6.2 select函数深度解析
6.2.1 select函数原型与参数
#include <sys/select.h>int select(int nfds, fd_set *restrict readfds,fd_set *restrict writefds,fd_set *restrict exceptfds,struct timeval *restrict timeout);

参数详解

  1. nfds:需监控的最大文件描述符+1(优化内核遍历效率);
  2. readfds/writefds/exceptfds:分别监控可读、可写、异常事件的文件描述符集合;
  3. timeout:超时时间(NULL为阻塞,0为非阻塞,>0为限时等待)。

返回值

  • >0:就绪的文件描述符总数;
  • 0:超时无事件;
  • -1:错误(如被信号中断)。
6.2.2 文件描述符集合操作宏
void FD_ZERO(fd_set *set);       // 清空集合
void FD_SET(int fd, fd_set *set);// 添加描述符到集合
void FD_CLR(int fd, fd_set *set);// 从集合移除描述符
int FD_ISSET(int fd, fd_set *set);// 检查描述符是否就绪
6.2.3 select工作流程
  1. 初始化集合:使用FD_ZEROFD_SET设置需监控的描述符;
  2. 调用select:阻塞或等待事件发生;
  3. 遍历检查:通过FD_ISSET轮询所有描述符,处理就绪事件;
  4. 重置集合:select会修改传入的集合,需在每次调用前重新初始化。

代码示例:基于select的TCP服务器框架

fd_set read_set, all_set;
int maxfd = listenfd; // 监听套接字
FD_ZERO(&all_set);
FD_SET(listenfd, &all_set);for (;;) {read_set = all_set; // 每次select调用前重置集合int nready = select(maxfd + 1, &read_set, NULL, NULL, NULL);if (FD_ISSET(listenfd, &read_set)) { // 新连接到达int connfd = Accept(listenfd, NULL, NULL);FD_SET(connfd, &all_set);maxfd = (connfd > maxfd) ? connfd : maxfd;}for (int fd = listenfd + 1; fd <= maxfd; fd++) { // 检查客户端连接if (FD_ISSET(fd, &read_set)) {// 处理客户端请求(如read/write)}}
}
6.2.4 select的局限性
  1. 文件描述符上限FD_SETSIZE(通常1024)限制最大监控数量;
  2. 线性扫描效率低:每次需遍历所有描述符,时间复杂度O(n);
  3. 内核态内存复制:每次调用需将集合从用户态复制到内核态;
  4. 无法动态扩展:无法在运行中添加/移除描述符,需重新初始化集合。

6.3 poll函数:改进的I/O复用机制
6.3.1 poll函数原型与参数
#include <poll.h>int poll(struct pollfd *fds, nfds_t nfds, int timeout);

参数解析

  1. fds:指向pollfd结构数组,每个元素描述一个监控的描述符;
  2. nfds:数组长度(即监控的描述符数量);
  3. timeout:超时时间(毫秒,-1为阻塞,0为非阻塞)。

pollfd结构体

struct pollfd {int   fd;       // 文件描述符short events;   // 监控的事件(POLLIN、POLLOUT等)short revents;  // 返回的事件(由内核填充)
};
6.3.2 poll事件标志
  • POLLIN:数据可读(包括TCP连接断开时的EOF);
  • POLLPRI:紧急数据可读(如TCP带外数据);
  • POLLOUT:数据可写;
  • POLLERR:错误发生(自动监控,无需设置);
  • POLLHUP:连接挂起(如对端关闭)。
6.3.3 poll工作流程
  1. 初始化pollfd数组:设置每个元素的fdevents
  2. 调用poll:等待事件发生;
  3. 遍历检查revents:处理就绪的描述符;
  4. 动态维护数组:可动态添加或移除描述符。

代码示例:基于poll的TCP服务器框架

#define MAX_CLIENTS 1024
struct pollfd client_fds[MAX_CLIENTS];
int nfds = 1; // 初始只有监听套接字client_fds[0].fd = listenfd;
client_fds[0].events = POLLIN;for (;;) {int nready = poll(client_fds, nfds, -1);if (client_fds[0].revents & POLLIN) { // 新连接到达int connfd = Accept(listenfd, NULL, NULL);client_fds[nfds].fd = connfd;client_fds[nfds].events = POLLIN;nfds++;}for (int i = 1; i < nfds; i++) { // 遍历客户端连接if (client_fds[i].revents & POLLIN) {// 处理客户端请求if (read返回0) { // 客户端关闭连接Close(client_fds[i].fd);client_fds[i] = client_fds[nfds-1]; // 数组末尾元素覆盖当前nfds--;i--; // 重新检查当前位置}}}
}
6.3.4 poll的优势与不足

优势

  • 无描述符数量限制:仅受系统资源约束;
  • 动态管理:可随时添加/移除监控的描述符;
  • 更精细的事件控制:支持更多事件类型(如带外数据)。

不足

  • 仍为线性扫描:时间复杂度O(n);
  • 水平触发模式:未处理事件会持续通知(可能引起忙等)。

6.4 select与poll对比分析
特性selectpoll
描述符上限FD_SETSIZE(通常1024)仅受系统限制
事件类型仅读、写、异常支持更多事件(如POLLPRI)
效率低(O(n)遍历)低(O(n)遍历)
内存拷贝每次调用需复制整个集合仅传递数组指针
可扩展性静态集合,需重新初始化动态数组,可随时修改
跨平台兼容性所有UNIX系统多数UNIX系统(Linux、BSD)

选型建议

  • 嵌入式系统:优先poll(动态管理更灵活);
  • 高并发场景:推荐epoll(第7章详解);
  • 跨平台需求:select兼容性更好。

6.5 性能优化与陷阱规避
6.5.1 select性能优化
  1. 减少nfds值:仅传递当前最大描述符+1;
  2. 分离监控集合:将频繁活动的描述符单独监控;
  3. 避免阻塞操作:在事件处理函数中使用非阻塞I/O。
6.5.2 poll常见陷阱
  1. 未重置revents:每次调用poll前需清空revents或重新初始化结构体;
  2. 数组越界:动态添加描述符时需检查数组上限;
  3. 忽略POLLHUP:未处理可能导致死循环。

代码示例:非阻塞read处理

// 设置套接字为非阻塞
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);char buf[1024];
ssize_t n = read(fd, buf, sizeof(buf));
if (n > 0) {// 处理数据
} else if (n == 0) {// 对端关闭连接
} else if (errno == EAGAIN || errno == EWOULDBLOCK) {// 数据未就绪,继续监控
} else {// 其他错误处理
}

6.6 实战:基于select的聊天服务器
6.6.1 功能需求
  • 支持多客户端连接;
  • 客户端消息广播至所有其他客户端;
  • 客户端退出时自动清理资源。
6.6.2 核心代码实现
#include "unp.h"#define MAX_CLIENTS 1024
int client_fds[MAX_CLIENTS];void broadcast(int sender_fd, char *msg, int len) {for (int i = 0; i < MAX_CLIENTS; i++) {if (client_fds[i] != -1 && client_fds[i] != sender_fd) {Writen(client_fds[i], msg, len);}}
}int main() {int listenfd = Socket(AF_INET, SOCK_STREAM, 0);// 绑定与监听(代码同前)fd_set all_set, read_set;FD_ZERO(&all_set);FD_SET(listenfd, &all_set);int maxfd = listenfd;memset(client_fds, -1, sizeof(client_fds));for (;;) {read_set = all_set;int nready = select(maxfd + 1, &read_set, NULL, NULL, NULL);if (FD_ISSET(listenfd, &read_set)) {int connfd = Accept(listenfd, NULL, NULL);// 将新连接加入数组for (int i = 0; i < MAX_CLIENTS; i++) {if (client_fds[i] == -1) {client_fds[i] = connfd;FD_SET(connfd, &all_set);maxfd = (connfd > maxfd) ? connfd : maxfd;break;}}}for (int i = 0; i < MAX_CLIENTS; i++) {int fd = client_fds[i];if (fd == -1) continue;if (FD_ISSET(fd, &read_set)) {char buf[1024];ssize_t n = Read(fd, buf, sizeof(buf));if (n > 0) {broadcast(fd, buf, n);} else {Close(fd);FD_CLR(fd, &all_set);client_fds[i] = -1;}}}}
}

6.7 调试工具与性能分析
6.7.1 使用strace跟踪系统调用
strace -e select,poll,read,write ./server

输出示例

select(5, [3 4], NULL, NULL, NULL) = 1 (in [3])
read(3, "hello", 1024)             = 5
6.7.2 监控文件描述符状态
# 查看进程打开的文件描述符
ls -l /proc/<pid>/fd
6.7.3 性能压测工具
# 使用netcat模拟多客户端
for i in {1..1000}; donc 127.0.0.1 9999 &
done

6.8 本章小结与进阶习题

小结:本章深入解析了select和poll的原理、使用场景与优化技巧,通过实战案例展示了高并发服务器的实现方法。

习题

  1. 实现基于poll的聊天服务器,支持昵称注册与私聊功能;
  2. 对比select与poll在1000并发连接下的CPU使用率差异;
  3. 扩展select服务器支持可写事件监控,实现大文件传输。

说明

  1. Linux下更详细select函数内容,可参见博主相关博文Linux下select使用
  2. 嵌入式下如何高效使用select与epoll,可参见博主相关专题博文在嵌入式Linux中实现高并发TCP服务器:从select到epoll的演进与实战
  3. Linux下更详细epoll函数内容,可参见博主相关博文Linux下epoll函数使用详解

付费用户专属资源

  • 完整聊天服务器代码工程(含Makefile);
  • select/poll性能对比测试报告;
  • 扩展阅读:《从select到epoll:Linux I/O模型的演进》。

通过本章学习,读者将掌握I/O复用的核心技术,并能够开发高并发的网络应用。

相关文章:

《UNIX网络编程卷1:套接字联网API》第6章 IO复用:select和poll函数

《UNIX网络编程卷1&#xff1a;套接字联网API》第6章 I/O复用&#xff1a;select和poll函数 6.1 I/O复用的核心价值与适用场景 I/O复用是高并发网络编程的基石&#xff0c;允许单个进程/线程同时监控多个文件描述符&#xff08;套接字&#xff09;的状态变化&#xff0c;从而高…...

Three.js 系列专题 1:入门与基础

什么是 Three.js? Three.js 是一个基于 WebGL 的 JavaScript 库,它简化了 3D 图形编程,让开发者无需深入了解底层 WebGL API 就能创建复杂的 3D 场景。它广泛应用于网页游戏、可视化、虚拟现实等领域。 学习目标 理解 Three.js 的核心组件:场景(Scene)、相机(Camera)…...

Qt框架深度解析:核心技术、应用场景与实战指南

Qt&#xff08;发音同“cute”&#xff09;是一个跨平台的C应用程序开发框架&#xff0c;广泛用于开发图形用户界面&#xff08;GUI&#xff09;程序&#xff0c;但也支持非GUI的后台服务、命令行工具等。它由挪威的Trolltech公司于1995年推出&#xff0c;后由诺基亚、Digia等公…...

低代码开发平台:飞帆中的控件中转区

低代码开发平台&#xff1a;飞帆中的控件中转区的作用 当控件因为尺寸太大难以拖到 div 框中时&#xff0c;可以先拖到控件中转区中&#xff0c;此时控件会变成一个标签&#xff0c;然后将这个标签拖到 div 框中即可。 飞帆 fvi.cn...

基于STM32的智能门禁系统设计与实现

一、项目背景与功能概述 在物联网技术快速发展的今天&#xff0c;传统门锁正在向智能化方向演进。本系统基于STM32F103C8T6微控制器&#xff0c;整合多种外设模块&#xff0c;实现了一个具备以下核心功能的智能门禁系统&#xff1a; 密码输入与验证&#xff08;4x3矩阵键盘&a…...

maven项目打包jar给其他项目pom外部引用

maven项目打包jar给其他项目pom外部引用 在现实开发过程中&#xff0c;很多代码需要被重复利用的&#xff0c;但是代码量又是很多&#xff0c;这样的代码可以提出出来作为公共代码或者叫做工具使用&#xff0c;通常这样的工具会以jar包的形式被其他项目pom引入使用。第一步 创…...

Linux线程

一、线程的使用 线程创建 函数原型及头文件 #include <pthread.h> int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg); 参数&#xff1a; tidp&#xff1a;当pthread_create成功…...

Keepalive+LVS+Nginx+NFS高可用项目

项目架构 分析 主机规划 主机系统安装应用网络IPclientredhat 9.5无NAT172.25.250.115/24lvs-masterrocky 9.5ipvsadm&#xff0c;keepalivedNAT172.25.250.116/24 VIP 172.25.250.100/32lvs-backuprocky 9.5ipvsadm&#xff0c;keepalivedNAT172.25.250.117/24 VIP 172.25.2…...

在线编辑数学公式

参考工具&#xff1a; https://www.processon.com/mathtype https://www.latexlive.com/ 一、简单好用的数学公式编辑工具推荐 1. MathType / AxMath • 特点&#xff1a;专业公式编辑软件&#xff0c;支持与Word、WPS等办公软件无缝集成&#xff0c;提供丰富的数学符号和模…...

【spring Cloud Netflix】OpenFeign组件

1.概述 Feign旨在使编写Java Http客户端变得更容易。前面在使用RibbonRestTemplate进行服务的远程调用 时&#xff0c;利用RestTemplate对Http请求的封装处理&#xff0c;形成了一套模板化的调用方法。但是在实际开发中&#xff0c;由 于对服务的依赖调用可不止一处&#xff0…...

基于Flask的Windows命令大全Web应用技术解析与架构设计

基于Flask的Windows命令大全Web应用技术解析与架构设计 引言 Windows命令行工具是系统管理和开发调试的核心技能之一。然而&#xff0c;许多用户对常用命令的用法和场景并不熟悉。本文通过一个基于Flask框架开发的Web应用&#xff0c;系统性地整理了50个Windows命令的用法&…...

Qt中左侧项目菜单中构建设置功能中的构建步骤是怎么回事

在 Qt Creator 中&#xff0c;**构建设置&#xff08;Build Settings&#xff09;下的构建步骤&#xff08;Build Steps&#xff09;**是控制项目如何编译、链接和生成最终产物的核心配置区域。它允许你自定义编译过程中的各个阶段&#xff08;如 qmake、make、cmake 等命令的具…...

(一)从零开始:用 LangChain 和 ZhipuAI 搭建简单对话

最近一直在研究如何用 LangChain 和 ZhipuAI 搭建一个智能对话系统&#xff0c;发现这个组合真的非常强大&#xff0c;而且实现起来并不复杂。今天就来分享一下我的学习过程和一些心得体会&#xff0c;希望能帮到同样在探索这个领域的小伙伴们。 一、 环境搭建&#xff1a;从零…...

Java大厂面试题 -- JVM 优化进阶之路:从原理到实战的深度剖析(2)

最近佳作推荐&#xff1a; Java大厂面试题 – 深度揭秘 JVM 优化&#xff1a;六道面试题与行业巨头实战解析&#xff08;1&#xff09;&#xff08;New&#xff09; 开源架构与人工智能的融合&#xff1a;开启技术新纪元&#xff08;New&#xff09; 开源架构的自动化测试策略优…...

C++ 标准库参考手册深度解析

C 标准库参考手册是每个 C 开发者的必备工具。本文将系统性解析其架构设计、核心功能及实战应用技巧&#xff0c;帮助开发者构建高效的知识检索与代码开发工作流&#xff0c;涵盖从语法查询到编译器适配的全流程技术细节。 一、网站架构与技术细节 1. 信息组织体系 1.1 层级化…...

单片机学习笔记8.定时器

IAP15W4K58S4定时/计数器结构工作原理 定时器工作方式控制寄存器TMOD 不能进行位寻址&#xff0c;只能对整个寄存器进行赋值 寄存器地址D7D6D5D4D3D2D1D0复位值TMOD89HGATEC/(T低电平有效)M1M0GATEC/(T低电平有效)M1M000000000B D0-D3为T0控制&#xff0c;D4-D7为T1控制 GAT…...

神经网络入门:生动解读机器学习的“神经元”

神经网络作为机器学习中的核心算法之一&#xff0c;其灵感来源于生物神经系统。在本文中&#xff0c;我们将带领大家手把手学习神经网络的基本原理、结构和训练过程&#xff0c;并通过详细的 Python 代码实例让理论与实践紧密结合。无论你是编程新手还是机器学习爱好者&#xf…...

2025-04-05 吴恩达机器学习5——逻辑回归(2):过拟合与正则化

文章目录 1 过拟合1.1 过拟合问题1.2 解决过拟合 2 正则化2.1 正则化代价函数2.2 线性回归的正则化2.3 逻辑回归的正则化 1 过拟合 1.1 过拟合问题 欠拟合&#xff08;Underfitting&#xff09; 模型过于简单&#xff0c;无法捕捉数据中的模式&#xff0c;导致训练误差和测试误…...

美团滑块 分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向过程 距离识别不准简单学习一下&…...

C++ atomic 原子操作

一、原子操作简介 在多线程编程中&#xff0c;通常我们需要多个线程共享数据。但如果不加以控制&#xff0c;多个线程同时访问同一数据&#xff0c;可能会导致数据不一致或竞争条件&#xff08;race conditions&#xff09;。为了解决这个问题&#xff0c;我们引入了 原子操作…...

Leetcode - 双周赛153

目录 一、3498. 字符串的反转度二、3499. 操作后最大活跃区段数 I三、3500. 将数组分割为子数组的最小代价四、3501. 操作后最大活跃区段数 II 一、3498. 字符串的反转度 题目连接 本题直接模拟&#xff0c;代码如下&#xff1a; class Solution {public int reverseDegree(…...

25.4 GLM-4+RAG智能标注实战:标注成本暴降60%,检索准确率飙升40%!

使用 GLM-4 优化 RAG 程序:智能标注提升检索质量 关键词:GLM-4 数据标注, RAG 优化, 检索增强生成, 向量数据库, 语义关联度分析 1. RAG 数据标注的核心挑战 在检索增强生成(Retrieval-Augmented Generation)系统中,检索数据的标注质量直接影响最终生成效果。传统标注方…...

基于sklearn实现文本摘要思考

和各位小伙伴分享一下使用sklearn进行文本摘要的思考。 第一版本 原理 提取式文本摘要的基本原理是&#xff1a; 将文本分割成句子 计算每个句子的重要性(权重) 选择权重最高的几个句子组成摘要 常用的句子权重计算方法&#xff1a; TF-IDF&#xff1a;基于词频-逆文档频…...

Cortex-M3 NVIC可以控制异常向量表的哪些部分

Cortex-M3 的 NVIC(嵌套向量中断控制器)不直接控制整个异常向量表,但可以管理向量表中与中断相关的部分行为。以下是 NVIC 对异常向量表的具体控制范围和相关机制: 1. NVIC 直接控制的部分 NVIC 主要管理 外部中断(IRQ) 和部分 系统异常 的行为,但对向量表本身的存储位…...

AI朝代应避免AI幻觉:分析与应对策略

随着人工智能&#xff08;AI&#xff09;技术的不断发展&#xff0c;AI的应用领域已经涵盖了文本生成、图像与视频创作以及程序编写等多个方面。然而&#xff0c;AI的生成能力并非没有缺陷&#xff0c;其中最为显著的之一就是所谓的“AI幻觉”&#xff08;AI hallucination&…...

网络传输H.264方法对比

一、引言 网络传输H.264有多种方法&#xff0c;包括但不限于&#xff1a;1.通过RTP直接传输H.264&#xff1b;2.通过UDP传输TS流&#xff1b;3.通过RTP传输TS流&#xff1b;4.通过RTP传输PS流。本文对这些方法进行对比。 二、通过RTP直接传输H.264 这种方案就是RTP包&#xf…...

第九章:可靠通信_《凤凰架构:构建可靠的大型分布式系统》

第九章 可靠通信 一、零信任网络模型 核心难点&#xff1a;理解安全模型从传统边界防护到动态信任验证的转变 零信任的核心原则 不再区分"内部可信网络"与"外部不可信网络"&#xff08;传统防火墙模型失效&#xff09;每次请求都需要进行身份验证和授权…...

HeidiSQL:多数据库管理工具

HeidiSQL 是一款广受欢迎的免费开源数据库管理工具&#xff0c;专为数据库管理员及开发者设计。无论您是刚接触数据库领域的新手&#xff0c;还是需要同时处理多种数据库系统的专业开发者&#xff0c;该工具都能凭借其直观的界面和强大的功能&#xff0c;助您轻松完成数据管理任…...

文件系统-inode/软硬件连接(未完结)

首先我们了解一下文件简洁理解来说就是&#xff1a;文件内容文件属性 ---> 磁盘上存储的文件存文件的内容存文件的属性&#xff1b;而文件的内容----存放在每个数据块 &#xff1b;文件属性存放在iNode里面。 要明白&#xff1a;linux系统中的文件是存储在磁盘中的&#xf…...

数据库并发控制问题

并发控制问题是数据库管理系统&#xff08;DBMS&#xff09;中处理多个事务并发执行时&#xff0c;确保数据一致性、可靠性和完整性的一系列技术和挑战。并发控制问题通常与事务的隔离性和事务之间的相互影响有关。以下是并发控制中主要的几种问题及其解决方式的详细解释&#…...

(五)智能体与工具协同——打造智能对话的超级助手

上一篇&#xff1a;&#xff08;四&#xff09;数据检索与增强生成——让对话系统更智能、更高效 在前四个阶段&#xff0c;我们已经搭建了一个功能强大的智能对话&#xff0c;并深入探讨了输入输出处理、链式工作流构建和数据检索与增强生成的细节。现在&#xff0c;我们将进…...

第十三届蓝桥杯 2022 省 B 刷题统计

题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a a a 道题目,周六和周日每天做 b b b 道题目。请你帮小明计算,按照计划他将在第几天实现做题数大于等于 n n n 题? 输入格式 输入一行包含三个整数 a , b a, b a,b 和 n n n. 输出格…...

NLP/大模型八股专栏结构解析

1.transformer 结构相关 &#xff08;1&#xff09;transformer的基本结构有哪些&#xff0c;分别的作用是什么&#xff0c;代码实现。 NLP高频面试题&#xff08;一&#xff09;——Transformer的基本结构、作用和代码实现 &#xff08;2&#xff09;LSTM、GRU和Transformer结…...

不在 qtdesigner中提升,进行主题程序设计

以下是无需在Qt Designer中提升控件的完整主题化方案&#xff0c;保持现有代码结构的同时实现动态阴影效果管理&#xff1a; 一、增强主题管理器&#xff08;支持动态控件发现&#xff09; // thememanager.h #pragma once #include <QObject> #include <QSet> #…...

TDengine 3.3.6.0 版本中非常实用的 Cols 函数

简介 在刚刚发布的 TDengine 3.3.6.0 版本 中&#xff0c;新增了一个非常实用的 函数COLS &#xff0c;此函数用于获取选择函数所在行列信息&#xff0c;主要应用在生成报表数据&#xff0c;每行需要出现多个选择函数结果&#xff0c;如统计每天最大及最小电压&#xff0c;并报…...

MessageQueue --- RabbitMQ WorkQueue and Prefetch

MessageQueue --- RabbitMQ WorkQueue and Prefetch 什么是WorkQueue分发机制 --- RoundRobin分发机制 --- PrefetchSpring example use prefetch --- Fair Dispatch 什么是WorkQueue Work queues&#xff0c;任务模型。简单来说就是让多个消费者绑定到一个队列&#xff0c;共同…...

第四章:透明多级分流系统_《凤凰架构:构建可靠的大型分布式系统》

第四章&#xff1a;透明多级分流系统 一、客户端缓存 核心目标&#xff1a;减少重复请求&#xff0c;降低服务端压力。 1. 强制缓存 定义&#xff1a;客户端直接根据缓存规则决定是否使用本地缓存&#xff0c;无需与服务端交互。关键HTTP头&#xff1a; Cache-Control&#…...

题解:AT_abc241_f [ABC241F] Skate

一道经典的 bfs 题。 提醒&#xff1a;本题解是为小白专做的&#xff0c;不想看的大佬请离开。 这道题首先一看就知道是 bfs&#xff0c;但是数据点不让我们过&#xff1a; 1 ≤ H , W ≤ 1 0 9 1\le H,W\le10^9 1≤H,W≤109。 那么我们就需要优化了&#xff0c;从哪儿下手…...

热题100-字母异位词分组

方法用Arrays.sort对每个String 进行排序&#xff0c;毕竟排序以后都一样了&#xff0c;然后放入Map中的key跟value&#xff0c;可以一对多&#xff0c;然后返回的时候只要返回Map中所有的values就可以了 class Solution {public List<List<String>> groupAnagram…...

WiFi加密协议

目录 1. 认证(Authentication)‌ ‌1.1 开放系统认证(Open System Authentication)‌ 1.2 共享密钥认证(Shared Key Authentication)‌ ‌1.3 802.1X/EAP认证(企业级认证)‌ ‌2. 关联(Association)‌ ‌3. 加密协议(Security Handshake)‌ ‌整体流程总结‌…...

【AI提示词】书籍推荐专家

提示说明 帮助您找到适合您的好书。 提示词 ## Role: 书籍推荐专家## Profile: - author: xxx - version: 1.0.0 - language: 中文 - description: 我是一位书籍推荐专家&#xff0c;我可以帮助您找到适合您的好书。## Goals: - 吸引读者的注意力&#xff0c;引导他们阅读更…...

Linux进程间通信——有名管道

一.概念 函数形式&#xff1a;int mkfifo(const char \*filename,mode_t mode); 功能&#xff1a;创建管道文件 参数&#xff1a;管道文件文件名\路径&#xff0c;权限&#xff0c;创建的文件权限仍然和umask有关系。 返回值&#xff1a;创建成功返回0&#xff0c;创建失败返回…...

JavaScript基础--01-JS简介

字面量&#xff1a;数字、字符串、布尔值 前言JavaScript背景Web前端有三层&#xff1a;发展历史JavaScript的发展&#xff1a;蒸蒸日上 JavaScript介绍JavaScript入门易学性JavaScript是脚本语言JavaScript的组成 JavaScript 的特点特点1&#xff1a;解释型语言特点2&#xff…...

2025年 能够有效提升AI的生成质量和逻辑严谨性 的通用型系统提示

以下是三个经过精心设计的通用型系统提示&#xff08;System Prompt&#xff09;&#xff0c;能够有效提升AI的生成质量和逻辑严谨性&#xff0c;适用于各类对话、分析和创作场景&#xff1a; Prompt 1 - 专家级分步验证模式 你是一个具备跨领域知识整合能力的超级AI&#xff…...

xss攻击

XSS 攻击&#xff0c;即跨站脚本攻击&#xff08;Cross - Site Scripting&#xff09;&#xff0c;是一种常见的 Web 应用程序安全漏洞。以下是关于它的详细介绍&#xff1a; 原理 输入输出控制不严&#xff1a;程序对用户输入和输出处理不当。用户输入的数据没有经过充分的过…...

Node.js核心模块及Api详解

以下是 Node.js 最常用的核心模块及 API 详解&#xff0c;按使用频率和重要性分类整理&#xff1a; 一、高频核心模块 1. fs 文件系统 const fs require(fs); const fsPromises require(fs).promises; // Promise 版本// 异步读取文件&#xff08;推荐&#xff09; fs.read…...

解析keras.layers.Layer中的权重参数

文章目录 概要__init__()build()add_weight() 概要 keras.layers.Layers是所有层对象的父类,在keras.layers下所有实现类都是其子类&#xff0c;自定义层时需要继承该类。 init() Layer的构造函数&#xff0c;需要注意两个参数trainable和name trainable&#xff1a;指定该层…...

原型设计工具即时设计的简单使用攻略

即时设计是一款国产在线协同设计工具&#xff0c;支持从原型设计到开发交付的全流程&#xff0c;尤其擅长Web/App界面原型制作。其核心优势体现在&#xff1a; • 零门槛入门&#xff1a;浏览器直接访问无需安装&#xff0c;中文界面友好 • 资源生态完善&#xff1a;内置3000原…...

深入解析C++智能指针:从内存管理到现代编程实践

一、智能指针核心概念 1.1 智能指针的本质 智能指针是基于**RAII&#xff08;资源获取即初始化&#xff09;**的封装类&#xff0c;通过对象生命周期自动管理动态内存。与传统指针相比&#xff1a; 特性原始指针智能指针内存管理手动自动空指针检查需显式判断支持空状态检测…...

在 Langflow 中构建灵活的自定义组件:从基础到高级实践

本文深入探讨了如何在 Langflow 平台中创建功能丰富的自定义组件。通过详细的目录结构解析、分步实现指南和多个实战案例&#xff0c;帮助开发者掌握利用 Python 生态扩展低代码平台的方法&#xff0c;打造高效的数据处理流程。 理解组件架构设计 自定义组件是在 Langflow 中创…...