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

Linux中I/O复用机制epoll

1. 为什么会出现 epoll

在早期的网络编程中,select 是一个非常常用的 I/O 复用机制,用于在多个文件描述符(如套接字)上进行 I/O 操作的检测。select 会将多个文件描述符传入,轮询检查它们的状态,看哪些是可以读取、写入或者异常的。然而,select 存在以下几个问题,特别是在需要处理大量文件描述符时,epoll 的出现就是为了解决这些问题:

Linux中的 I/O 复用机制 select-CSDN博客

select 存在的问题:
  1. 文件描述符限制select 的一个关键限制是它最大支持的文件描述符数量,通常是 1024(这个数量在 Linux 中默认定义为 FD_SETSIZE)。如果需要监控更多的文件描述符,select 就不适用了。

  2. 每次调用 select 都要传入整个文件描述符集合:在每次调用 select 时,系统需要扫描整个文件描述符集合,检查每个文件描述符的状态,即使其中很多文件描述符并未发生变化。这种轮询会带来较高的开销,尤其是在大量文件描述符的情况下。

  3. 性能低下select 的机制是阻塞式的,当有大量文件描述符时,性能会下降,特别是当许多文件描述符没有变化时,select 还是需要遍历所有文件描述符集合。

 select示意图

为了应对这些问题,Linux 引入了 epoll,它是一种更加高效的 I/O 复用机制,专门用于处理大量的文件描述符。

2. epoll 的作用

epoll 是一种 事件驱动的 I/O 复用机制,主要解决了传统的 selectpoll 的性能瓶颈。它的出现,主要是为了更高效地处理成千上万的连接。epoll 的优势包括:

  • 高效的事件通知机制:与 selectpoll 不同,epoll 采用基于内核的事件通知机制,只有当文件描述符的状态发生变化时,才会通知应用程序。这避免了不必要的遍历和检查,从而提高了效率。

  • 支持大规模文件描述符epoll 可以支持数万个文件描述符,不再受 select 文件描述符限制(1024个)。

  • 单次注册,持续监控:通过一次注册文件描述符,就可以持续地对其进行监控,避免每次调用时都要传递整个文件描述符集合。

 epoll示意图

3. epoll 的工作原理

epoll 的工作原理基于 事件通知,它的基本流程包括以下几个步骤:

  1. 创建 epoll 实例: 使用 epoll_create() 创建一个 epoll 实例,返回一个 epoll 文件描述符。

  2. 注册文件描述符: 使用 epoll_ctl() 向 epoll 实例注册需要监控的文件描述符,指定这些文件描述符上的事件(如读事件、写事件、异常事件)。

  3. 等待事件发生: 使用 epoll_wait() 阻塞或非阻塞地等待文件描述符上的事件发生。当某个文件描述符的事件发生时,epoll_wait() 返回。

  4. 事件处理: 事件发生后,应用程序处理相关文件描述符的数据传输或者其他操作。

epoll 的 API 解释
  1. epoll_create() 用于创建一个 epoll 实例。

    int epoll_create(int size);
    • size 参数用于指定内核为该 epoll 实例分配多少空间,这个值在现代 Linux 中并没有实际作用。

    • 返回值:成功时返回一个 epoll 实例的文件描述符,失败时返回 -1。

  2. epoll_ctl() 用于添加、修改或删除文件描述符的监控事件。

    int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
    • epfd:epoll 实例的文件描述符。

    • op:操作类型(EPOLL_CTL_ADDEPOLL_CTL_MODEPOLL_CTL_DEL)。

    • fd:要监控的文件描述符。

    • event:指定要监控的事件类型(例如 EPOLLINEPOLLOUT 等)。

  3. epoll_wait() 用于等待并获取已经就绪的文件描述符事件。

    int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
    • epfd:epoll 实例的文件描述符。

    • events:保存就绪事件的数组。

    • maxevents:最多返回的事件数。

    • timeout:等待时间,单位为毫秒,0 为不阻塞,-1 为无限等待。

4. epollselect 的区别
特性selectepoll
文件描述符数目有最大限制(一般为1024)无限制,支持成千上万的文件描述符
性能文件描述符多时性能差只有状态变化的文件描述符会被通知,性能优越
事件通知方式每次调用都需要遍历所有文件描述符基于事件的通知机制,只有状态变化才通知
内存开销需要传递整个文件描述符集合只需要传递事件队列,开销较小
5. 示例代码

下面是一个简单的使用 epoll 的服务器端示例,它可以同时处理多个客户端连接:

// 服务器端 (`epoll` 示例)
​
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/epoll.h>
#include <arpa/inet.h>
#include <sys/socket.h>
​
#define BUF_SIZE 1024
#define MAX_EVENTS 10
​
void error_handling(char *message);
​
int main(int argc, char *argv[]) {int serv_sock, clnt_sock;struct sockaddr_in serv_adr, clnt_adr;socklen_t clnt_adr_sz;char buf[BUF_SIZE];int str_len;struct epoll_event ev, events[MAX_EVENTS];int epfd, event_count;
​if (argc != 2) {printf("Usage : %s <port>\n", argv[0]);exit(1);}// 创建服务端套接字serv_sock = socket(PF_INET, SOCK_STREAM, 0);memset(&serv_adr, 0, sizeof(serv_adr));serv_adr.sin_family = AF_INET;serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);serv_adr.sin_port = htons(atoi(argv[1]));// 绑定地址if (bind(serv_sock, (struct sockaddr *)&serv_adr, sizeof(serv_adr)) == -1)error_handling("bind() error");// 开始监听if (listen(serv_sock, 5) == -1)error_handling("listen() error");// 创建 epoll 实例epfd = epoll_create1(0);if (epfd == -1)error_handling("epoll_create1() error");// 注册监听套接字到 epollev.events = EPOLLIN;ev.data.fd = serv_sock;if (epoll_ctl(epfd, EPOLL_CTL_ADD, serv_sock, &ev) == -1)error_handling("epoll_ctl() error");while (1) {// 等待事件发生event_count = epoll_wait(epfd, events, MAX_EVENTS, -1);if (event_count == -1)error_handling("epoll_wait() error");// 处理就绪的事件for (int i = 0; i < event_count; i++) {if (events[i].data.fd == serv_sock) {// 新客户端连接clnt_adr_sz = sizeof(clnt_adr);clnt_sock = accept(serv_sock, (struct sockaddr *)&clnt_adr, &clnt_adr_sz);if (clnt_sock == -1)error_handling("accept() error");// 将客户端套接字添加到 epoll 中ev.events = EPOLLIN;ev.data.fd = clnt_sock;if (epoll_ctl(epfd, EPOLL_CTL_ADD, clnt_sock, &ev) == -1)error_handling("epoll_ctl() error");printf("New client connected: %d\n", clnt_sock);} else {// 处理客户端数据str_len = read(events[i].data.fd, buf, BUF_SIZE);if (str_len == 0) {// 客户端关闭连接epoll_ctl(epfd, EPOLL_CTL_DEL, events[i].data.fd, NULL);close(events[i].data.fd);printf("Client disconnected: %d\n", events[i].data.fd);} else {// 回显数据write(events[i].data.fd, buf, str_len);}}}}close(serv_sock);return 0;
​
}
​
void error_handling(char *message) {fputs(message, stderr);fputc('\n', stderr);exit(1);
}
6. 总结
  • epoll 是一种比 select 更高效的 I/O 复用机制,特别适用于需要处理大量并发连接的服务器。

  • 它通过事件驱动的方式来提高性能,避免了每次调用时遍历所有文件描述符的开销。

  • epoll 具有高效的性能,并且不受文件描述符数量的限制,适合大规模的并发处理场景。

epoll 对比 select 的优势使得它成为高并发网络编程中的主流选择,尤其是在 Linux 系统中。

相关文章:

Linux中I/O复用机制epoll

1. 为什么会出现 epoll&#xff1f; 在早期的网络编程中&#xff0c;select 是一个非常常用的 I/O 复用机制&#xff0c;用于在多个文件描述符&#xff08;如套接字&#xff09;上进行 I/O 操作的检测。select 会将多个文件描述符传入&#xff0c;轮询检查它们的状态&#xff…...

数据库表关系详解

一、一对多关系 特征&#xff1a;表A的一条记录对应表B的多条记录&#xff0c;表B的一条记录仅对应表A的一条记录 示例&#xff1a; 学生表&#xff08;子表&#xff09; | id | name | class_id | |-----|------|----------| |1001| 张三 | 111 | |1002| 张四 | 222 | 班级表…...

Agentic Loop与MCP:大模型能力扩展技术解析

一、什么是MCP MCP&#xff08;Model Context Protocol&#xff09;是一种用于大语言模型与外部工具交互的协议框架。它允许大语言模型能够调用各种外部工具来扩展其能力边界&#xff0c;如访问文件系统、搜索引擎、数据库等。 MCP的核心价值 能力扩展&#xff1a;使大语言模…...

贪心算法 Part04

总结下重叠区间问题 LC 452. 用最少数量的箭引爆气球 和 LC 435. 无重叠区间 本质上是一样的。 LC 452. 用最少数量的箭引爆气球 是求n个区间当中 &#xff0c; 区间的种类数量 k。此处可以理解为&#xff0c;重叠在一起的区间属于同一品种&#xff0c;没有重叠的区间当然…...

Spring事务简单操作

什么是事务&#xff1f; 事务是一组操作的集合&#xff0c;是一个不可分割的操作 事务会把所有的操作作为⼀个整体, ⼀起向数据库提交或者是撤销操作请求. 所以这组操作要么同时 成功, 要么同时失败. 事务的操作 分为三步&#xff1a; 1. 开启事start transaction/ begin …...

04算法学习_209.长度最小的子数组

04算法学习_209.长度最小的子数组题目描述&#xff1a;个人代码&#xff1a;学习思路&#xff1a;第一种写法&#xff1a;题解关键点&#xff1a; 第二种写法&#xff1a;题解关键点&#xff1a; 个人学习时疑惑点解答&#xff1a; 04算法学习_209.长度最小的子数组 力扣题目链…...

./build/mkfs.jffs2: Command not found

参考文章&#xff1a;https://blog.csdn.net/FLM19990626/article/details/132070195 sudo apt-get install lib32stdc6 sudo apt-get install lib32z1 sudo apt-get install mtd-utils sudo apt-get install man-db sudo apt-get install liblzo2-dev:i386sudo ldconfig...

从零基础到最佳实践:Vue.js 系列(4/10):《Vue Router 路由管理:深入探索与实战应用》

引言 在现代前端开发中&#xff0c;单页应用&#xff08;SPA&#xff09;凭借其流畅的用户体验和高性能成为主流。Vue Router 作为 Vue.js 的官方路由管理工具&#xff0c;为开发者提供了强大的路由管理能力&#xff0c;帮助实现页面导航、权限控制和动态内容加载。本文将从基…...

深入解析C++静态成员变量与函数

当然可以&#xff01;下面是对这段 C 代码的逐行详细注释说明和解释&#xff0c;帮助你理解静态成员变量和静态成员函数的使用。 &#x1f9f1; 类定义部分&#xff1a;MyClass cpp 深色版本 #include <iostream> 说明&#xff1a;包含标准输入输出流库&#xff0c;用于…...

基于JDBC的信息管理系统,那么什么是JDBC呢?什么又是DAO类?

1.JDBC JDBC 即 Java Database Connectivity&#xff0c;是 Java 语言中用于与数据库进行交互的一套 API。它提供了一种标准的方式&#xff0c;让 Java 程序能够连接到各种不同类型的数据库&#xff0c;并执行 SQL 语句来实现对数据库的查询、插入、更新和删除等操作。 主要功…...

Java虚拟机 -虚拟机栈

虚拟机栈详解 虚拟机栈概述案例常见的跟虚拟栈异常相关的异常StackOverflowError异常OutOfMemoryError异常 栈的基本存储单位局部变量表IDEA Jclasslib Bytecode Viewer插件slot 操作数栈方法调用&#xff08;待后续补充&#xff09; 虚拟机栈 上一篇文章&#xff0c;我们简单…...

【AI News | 20250521】每日AI进展

AI Repos 1、OpenHands OpenHands&#xff08;前身为OpenDevin&#xff09;是一个由AI驱动的软件开发代理平台&#xff0c;它能够像人类开发者一样修改代码、运行命令、浏览网页、调用API&#xff0c;甚至从StackOverflow复制代码片段。用户可以通过OpenHands Cloud轻松上手&a…...

RAG 挑战赛冠军方案解析:从数据解析到多路由器检索的工程实践,推荐阅读!

多路由器 动态知识库&#xff1a;RAG 冠军方案的核心技术揭秘 源码地址&#xff1a;https://github.com/IlyaRice/RAG-Challenge-2/tree/main 公司年报智能问答比赛任务简介 比赛的任务是基于公司年度报告构建一个问答系统。简单来说&#xff0c;比赛当天的流程如下&#xff…...

Java基础 Day17

一、递归 方法直接或者间接调用本身 将大问题, 层层转化为一个与原问题相似的、规模更小的问题来解决 二、异常 程序在编译或执行过程中&#xff0c;出现的非正常的情况 (错误) 语法错误不是异常 1、阅读异常信息 从下往上看&#xff1a;发生异常的位置、异常名称、发生异…...

系分论文《论软件系统安全分析和应用》

系统分析师论文范文系列 【摘要】 2023年3月&#xff0c;我司承接了某知名电商企业“智能化供应链管理系统”的开发任务&#xff0c;我作为系统分析师负责全面的安全分析与设计工作。该系统以提升电商供应链效率为核心&#xff0c;整合仓储、物流、支付等模块&#xff0c;并需应…...

蓝耘Ubantu服务器测试最新 PP-StructureV3 教程

一、服务器配置 二、安装Anaconda3 进入云服务器后删除minconda文件夹 官网&#xff1a; https://repo.anaconda.com/archive/ 在里面找到自己系统的安装包&#xff0c;然后右击复制链接安装。 一定要选择Anaconda,因为很多依赖问题用Minconda容易报错。 wget https://repo…...

File文件

路径&#xff1a; 相对路径&#xff1a;以 当前工作目录&#xff08;或指定的基准目录&#xff09;为起点&#xff0c;描述目标文件或目录的位置&#xff0c;不包含根目录信息&#xff0c;仅表示与基准目录的相对位置关系。绝对路径&#xff1a;从文件系统的 根目录 开始&…...

Wireshark抓包分析小程序接口请求教程

## 1. 准备工作 ### 1.1 安装Wireshark - 访问Wireshark官网 (https://www.wireshark.org/) 下载最新版本 - 按照安装向导完成安装 - 确保安装时选择安装WinPcap或Npcap&#xff08;用于网络数据包捕获&#xff09; ### 1.2 配置环境 - 确保电脑已连接网络 - 如果使用手机…...

C++之模板进阶(探索C++模板:非类型参数与特化技巧)

本节目标&#xff1a; 1.非类型模板参数 2.类模板的特化 3.类模板特化的应用之类型萃取 4.模板的分离编译 非类型模板参数 模板参数分 类型形参与非类型形参 类型形参&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称 非类型形…...

【项目记录】准备工作及查询部门

1 开发规范 1.1 前后端分离开发 现在的企业项目开发有2种开发模式&#xff1a;前后台混合开发和前后台分离开发。 前后台混合开发&#xff0c;顾名思义就是前台后台代码混在一起开发 这种开发模式有如下缺点&#xff1a; 1. 沟通成本高&#xff1a;后台人员发现前端有问题&a…...

chromedp -—— 基于 go 的自动化操作浏览器库

chromedp chromedp 是一个用于 Chrome 浏览器的自动化测试工具&#xff0c;基于 Go 语言开发&#xff0c;专门用于控制和操作 Chrome 浏览器实例。 chromedp 安装 go get -u github.com/chromedp/chromedp基于chromedp 实现的的简易学习通刷课系统 目前实现的功能&#xff…...

企业级调度器LVS

访问效果 涉及内容&#xff1a;浏览拆分、 DNS 解析、反向代理、负载均衡、数据库等 1 集群 1.1 集群类型简介 对于⼀个业务项⽬集群来说&#xff0c;根据业务中的特性和特点&#xff0c;它主要有三种分类&#xff1a; 高扩展 (LB) &#xff1a;单个主机负载不足的时候&#xf…...

MySQL中的重要常见知识点(入门到入土!)

基础篇 基础语法 添加数据 -- 完整语法 INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);-- 示例 insert into employee(id,workno,name,gender,age,idcard,entrydate) values(1,1,Itcast,男,10,123456789012345678,2000-01-01) 修改数据 -- 完整语法 UPDA…...

29.第二阶段x64游戏实战-技能冷却

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;28.第二阶段x64游戏实战-代码实现遍历技能 找技能冷却要通过一个技能cd长点的&…...

第19天-Python自动化生成PPT图文教程(基于python-pptx)

环境准备 pip install python-pptx Pillow 基础示例:批量插入图片 from pptx import Presentation from pptx.util import Inches import os from PIL import Image def create_image_slides(): # 初始化演示文稿 prs = Presentation() # 获取当前目录所…...

基于STM32的骑行语音播报系统

目录 一、前言 二、项目功能说明 三、主要元器件 四、原理图与PCB 五、手机APP 六、完整资料 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; 咸鱼商品链接&#xff1a; 基于STM32的骑行语音播报系统 二、项目功能说明 基础功能&#xff1a; 1&…...

springboot链接nacos测试

代码资料链接&#xff1a;https://download.csdn.net/download/ly1h1/90881498 场景说明&#xff1a;本次测试是springboot项目&#xff0c;可以链接上ncaos&#xff0c;将对应命名空间下的配置信息读取出俩&#xff0c;然后可以在接口进行返回显示。 0.环境配置 1.代码结构 …...

【初识】内网渗透——基础概念,基本工具使用

目录 一、域&#xff0c;工作组&#xff0c;域控制器&#xff0c;活动目录相关概念&#xff1a; 域环境&#xff1a; 工作组&#xff1a; 域控制器DC&#xff1a; 活动目录AD&#xff1a; 二、内网的基本场景&#xff1a; 三、内网渗透基本测试方案&#xff1a; #案例1一基本信…...

AI练习:混合圆

方法一&#xff1a;在圆内 1.画圆 选择椭圆工具&#xff0c;按住Shift键绘制正圆&#xff1b; CtrlC复制&#xff0c;CtrlF原地粘贴&#xff0c;按住Shift键缩小圆&#xff0c;移动位置&#xff1b; 再CtrlC&#xff0c;CtrlF&#xff0c;再按住Shift键缩小圆&#xff0c;移…...

心知天气 API 获取天气预报 2025/5/21

心知天气 API 获取天气预报 2025/5/21 URL格式: https://api.seniverse.com/v3/weather/now.json?key填你的秘钥&locationbeijing(这里填城市 可以用拼音)&languagezh-Hans&unitc 返回格式如下:...

PCB设计教程【入门篇】——电路分析基础-元件数据手册

前言 本教程基于B站Expert电子实验室的PCB设计教学的整理&#xff0c;为个人学习记录&#xff0c;旨在帮助PCB设计新手入门。所有内容仅作学习交流使用&#xff0c;无任何商业目的。若涉及侵权&#xff0c;请随时联系&#xff0c;将会立即处理 目录 前言 一、数据手册的重要…...

java上机测试错题回顾(1)

平时不能摸鱼太多&#xff0c;这样导致到最后不能摸鱼...... 看了看日历原来是6.12就结课了&#xff0c;啊哈哈&#xff0c;真没几天准备了&#xff0c;期末月你要来了吗&#xff1f; 1 参数传递&#xff0c;值传递~&#xff01; 题目 以下代码的输出结果为&#xff08; &a…...

HTTP相关内容

应用层 自定义应用层协议,协议:约定 1.约定好通信传输的信息 2.约定好数据的组织格式(xml, json(重点), protobuf) 也可以基于现成的应用层协议,来进行开发 协议的种类非常多(HTTP 协议属于翘楚,1.手机,2 网站) 跟正确的说,咱们现在使用的是 HTTPS 这个协议,HTTP和HTTPS …...

【笔记】排查并解决Error in LLM call after 3 attempts: (status code: 502)

#工作记录 一、问题描述 在部署运行部署对冲基金分析工具 ai-hedge-fund 时&#xff0c;不断出现以下报错&#xff0c;导致项目运行异常&#xff1a; Error in LLM call after 3 attempts: (status code: 502) Error in LLM call after 3 attempts: [WinError 10054] 远程主…...

基于python的机器学习(七)—— 数据特征选择

目录 一、特征选择概念 二、特征选择的方法 2.1 过滤式特征选择 2.1.1 方差分析 2.1.2 相关系数 2.1.3 卡方检验 2.2 包裹式特征选择 2.2.1 递归特征消除 2.3 嵌入式特征选择 2.3.1 决策树特征重要性 一、特征选择概念 特征选择是机器学习非常重要的一个步骤&#x…...

从电商角度设计大模型的 Prompt

从电商角度设计大模型的 Prompt&#xff0c;有一个关键核心思路&#xff1a;围绕具体业务场景明确任务目标输出格式&#xff0c;帮助模型为运营、客服、营销、数据分析等工作提效。以下是电商场景下 Prompt 设计的完整指南&#xff0c;包含通用思路、模块范例、实战案例等内容。…...

从零基础到最佳实践:Vue.js 系列(5/10):《状态管理》

引言 你是不是正在用 Vue.js 开发一个很酷的应用&#xff0c;然后发现组件之间的数据传递变得越来越混乱&#xff1f;比如&#xff0c;一个按钮的状态要传到好几层组件&#xff0c;或者多个页面需要共享同一个用户信息。这时候&#xff0c;状态管理就登场了&#xff01;在 Vue…...

git checkout HEAD

git checkout HEAD 主要用于将工作目录和暂存区的内容重置为当前 HEAD 指向的提交状态&#xff0c;常用于撤销未提交的修改15。具体行为如下&#xff1a; 一、核心作用 ‌恢复工作区文件‌ 将指定文件或全部文件恢复到 HEAD 指向的提交状态&#xff0c;丢弃工作区中未暂存的修改…...

git工具使用

安装Git 在开始使用Git之前&#xff0c;需要在本地计算机上安装Git工具。Git支持Windows、macOS和Linux系统。可以从Git官方网站下载适合操作系统的安装包&#xff0c;并按照安装向导进行安装。 bash复制插入 # 在Linux上安装Git sudo apt-get install git# 在macOS上安装Git…...

极大似然估计与机器学习

复习概统的时候突然发现好像极大似然估计MLE与机器学习的数据驱动非常相似&#xff0c;都是采样样本然后估计模型参数。貌似&#xff0c;后知后觉的才意识到极大似然估计就是机器学习有效的数学保证 下面以拟合线性分布的最小二乘与分类问题为例推到以下如何从似然函数推导出M…...

基于 Guns v5.1 框架的分页教程

基于 Guns v5.1 框架的分页教程 第一步&#xff1a;Controller 层处理前端请求 在 Controller 中&#xff0c;需要接收 Bootstrap Table 传来的分页参数&#xff08;limit, offset, sort, order&#xff09;。Guns 提供了封装好的 PageFactory 类来简化 Page 对象的创建。 R…...

从零搭建SpringBoot Web 单体项目【基础篇】2、SpringBoot 整合数据库

系列文章 从零搭建SpringBoot Web单体项目【基础篇】1、IDEA搭建SpringBoot项目 从零搭建 SpringBoot Web 单体项目【基础篇】2、SpringBoot 整合数据库 目录 一、项目基础环境说明 二、数据库整合流程 1. 添加 MyBatis-Plus 相关依赖&#xff08;pom.xml&#xff09; 2…...

Supplemental Table 5FAM49B H-SCORE与其他临床特征的关系

以下是针对 Supplemental Table 5 中不同变量类型所需检验方法的 SPSS纯界面操作步骤(严格匹配原文统计方法): Supplemental Table 5 SPSS操作步骤 目标:分析FAM49B H-SCORE与其他临床特征的关系,按变量类型选择检验方法。 变量与检验方法对应表 变量变量类型检验方法SP…...

信息系统项目管理师考前练习4

项目范围基准变更 当客户提出新增功能需求时,项目经理首先应该: A. 立即更新范围说明书 B. 提交变更请求并评估影响 C. 要求团队加班实现 D. 拒绝变更以保持进度 答案:B 解析:所有范围变更必须走正式变更流程(第5版强调变更控制),评估影响是第一步。 混合项目管理模式…...

C语言判断素数(附带源码和解析)

素数&#xff0c;也称为质数&#xff0c;是一个大于 1 的自然数&#xff0c;除了 1 和它本身外&#xff0c;不能被其他自然数整除。换句话说&#xff0c;素数只有两个因子&#xff1a;1 和它自身。例如&#xff0c;2、3、5、7、11 和 13 都是素数。 素数在数学和计算机科学中扮…...

汽车电子电气架构诊断功能开发全流程解析

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

Xilinx XCAU10P-2FFVB676I 赛灵思 Artix UltraScale+ FPGA

XCAU10P-2FFVB676I 是 AMD Xilinx 推出的 Artix UltraScale™ FPGA 器件&#xff0c;内部集成了约 96,250 逻辑单元&#xff0c;满足中等规模高性能应用的需求。该芯片采用 16 nm FinFET 制程工艺&#xff0c;核心电压典型值约 0.85 V&#xff0c;能够在较低功耗下提供高达 775…...

DS18B20 温度传感器实验探索与实践分享​

DS18B20 温度传感器实验探索与实践分享 在嵌入式系统开发领域&#xff0c;温度监测是常见的应用场景。本次实验聚焦于 DS18B20 温度传感器&#xff0c;旨在掌握其工作原理、单总线通信方式&#xff0c;以及实现温度采集与数码管显示&#xff0c;同时开启温度报警功能。接下来&…...

RT_Thread——内存管理

文章目录 一、为什么要自己实现内存管理二、RT-Thread 的内存管理方法2.1 小内存管理算法2.2 slab 管理算法2.3 memheap 管理算法 三、Heap 相关的函数3.1 rt_system_heap_init3.2 rt_malloc/rt_realloc/rt_calloc2.3 rt_free2.4 rt_malloc_sethook/rt_free_sethook 一、为什么…...

Temporary failure in name resolution

这个错误 ping: baidu.com: Temporary failure in name resolution 通常表示 DNS 解析的问题&#xff0c;也就是说你的系统无法通过域名服务器解析 baidu.com 的 IP 地址。 解决方案&#xff1a; 检查 DNS 配置( 有效 )&#xff1a; 确保系统的 DNS 配置是正确的。你可以检查 …...