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

I/O多路复用(select/poll/epoll)

通过一个进程来维护多个Socket,也就是I/O多路复用,是一种常见的并发编程技术,它允许单个线程或进程同时监视多个输入/输出(I/O)流(例如网络连接、文件描述符)。当任何一个I/O流准备好进行读写操作时,该机制会通知应用程序,从而使得应用程序可以在不为每个连接创建单独线程或进程的情况下,高效地处理多个并发连接。

常见的系统调用有select/poll/epoll,进程可以通过一个系统调用函数从内核中获取多个事件。

select

通过一种“轮询”或者说“检查”的方式工作。应用程序需要告诉内核它关心哪些文件描述符的哪些事件(可读、可写、异常)。其实现多路复用的方式是,将已连接的 Socket 通过FD_SET放入到要监视的文件描述符集中,然后调用 select 函数将文件描述符集合拷贝到内核里,让内核来检查是否有网络事件产生,检查的方式很粗暴,就是通过遍历文件描述符集合的方式,当检查到有事件产生后,将此 Socket 标记为可读或可写, 接着再把整个文件描述符集合拷贝回用户态里,然后用户态还需要再通过遍历的方法找到可读或可写的 Socket,然后再对其处理。

select需要用户自己维护一个文件描述符数组,需要手动设置关心的事件以及处理完后重设状态,并且这个数组的大小是固定的,因为所要的参数类型是fd_set类型的,这个类型是有固定大小的,即使最终是通过位图来标识文件描述符是否准备就绪的,最大的大小也是sizeof(fd_set) * 8;

其次,select需要遍历文件描述符集合,一次是在内核态里,一个次是在用户态里,而且还会发生2次拷贝文件描述符集合,先从用户空间传入内核空间,由内核修改后,再传出到用户空间中。

所以从操作者实用角度和来回拷贝还有文件描述符数量的限制来看,select是有很多缺点的。

poll

poll 不再用位图来存储所关注的文件描述符,取而代之用动态数组,应用程序创建一个 struct pollfd 类型的数组。每个 struct pollfd 结构包含三个主要成员:

  • int fd: 要监视的文件描述符。
  • short events: 一个位掩码,表示应用程序关心该FD上的哪些事件(如 POLLIN 表示可读,POLLOUT 表示可写等)。
  • short revents: 一个位掩码,由内核在 poll 返回时设置,表示该FD上实际发生的事件。

以链表形式来组织,突破了select 的文件描述符个数限制,当然还会受到系统文件描述符限制。
但是 poll 和 select 并没有太大的区别,都需要遍历文件描述符集合来找到可读或可写的Socket,时间复杂度为 0(n),而且也需要在用户态与内核态之间拷贝文件描述符集合,这种方式随着并发数上来,性能的损耗会呈指数级增长。

epoll

epoll 是对 select 和 poll 的重大改进,特别是在需要监视大量文件描述符时,性能远超前两者。它不再是简单的轮询,而是采用了一种基于事件通知的机制,并且内核会维护一个“就绪列表”。

epoll会用到三个系统调用:

epoll_create:

int epoll_create(int size);创建一个epoll模型,参数 size 在早期版本的内核中用于提示内核期望监视的FD数量,但在现代内核中此参数已被忽略(但仍需大于0)。

返回值是一个文件描述符,后续的操作都将围绕它进行。内核会为这个 epoll 实例维护一个数据结构(通常是红黑树)来存储被监视的FD及其关心的事件,以及一个链表来存放已就绪的FD。

epoll_ctl:

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

第一个参数是epoll_create()的返回值;第二个参数表示动作,用三个宏来表示,第三个参数是需要监听的fd,第四个参数是告诉内核需要监听什么事。第二个参数的取值:

EPOLL_CTL_ADD :注册新的fd到epfd中;

EPOLL_CTL_MOD :修改已经注册的fd的监听事件;

EPOLL_CTL_DEL :从epfd中删除一个fd;

struct epoll event *event:指向一个结构,该结构定义了要监听epoll event的事件类型(如 EPOLLIN,EPOLLOUT,EPOLLET等)以及可选的用户数据(epoll_data_t)。

在epoll中,不同于select和poll的是:

epoll 在内核里使用红黑树来跟踪进程所有待检测的文件描述字,把需要监控的 socket 通过epoll_ctl() 函数加入内核中的红黑树里,红黑树是个高效的数据结构,增删改一般时间复杂度是0(logn)。而 select/poll 内核里没有类似 epoll 红黑树这种保存所有待检测的 socket的数据结构,所以select/poll 每次操作时都传入整个 socket 集合给内核,而 epoll 因为在内核维护了红黑树,可以保存所有待检测的 socket ,所以只需要传入一个待检测的 socket,减少了内核和用户空间大量的数据拷贝和内存分配。

epoll_wait:

int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

events:是一个由应用程序分配的 epoll_event 结构数组,内核会将已就绪的FD及其发生的事件填充到这个数组中。

maxevents:告诉内核 events 数组的大小,即最多可以返回多少个就绪事件。

timeout:超时时间(毫秒)。-1表示无限期阻塞,0表示立即返回。

epoll 使用事件驱动的机制,内核里维护了一个链表来记录就绪事件(就绪队列),当某个 socket 有事件发生时,通过回调函数内核会将其加入到这个就绪事件列表中(从红黑树链入到就绪队列中),当用户调用 epoll_wait()函数时,只会返回有事件发生的文件描述符的个数,不需要像 select/poll 那样轮询扫描整个 socket 集合来找哪一个就绪了,大大提高了检测的效率。

所以总结一下就是:

epoll_create:创建epoll模型

epoll_ctl:在红黑树上增删改

epoll_wait:从就绪队列(这个队列中都是就绪的)中把就绪事件拿出来

epoll支持边缘触发 (Edge Triggered, ET)水平触发 (Level Triggered, LT) 两种模式

LT (默认模式):只要FD处于可读/可写状态,epoll_wait 每次都会返回该FD。如果一次没有完全读/写完数据,下次调用 epoll_wait 仍然会通知该FD就绪。

ET:当FD从未就绪变为就绪状态时,epoll_wait 会通知一次。之后即使FD仍然可读/可写,在没有新的事件(例如新的数据到达)之前,epoll_wait 不会再通知该FD。这要求应用程序在收到通知后必须将该FD上的数据一次性处理完毕(通常是循环读/写直到返回 EAGAINEWOULDBLOCK)。ET模式通常效率更高,但编程更复杂。

在使用ET模式的时候,就需要把对应的文件描述符设置成非阻塞的才可以,因为我们不知道到底能读写多少数据,所以在收到通知后应尽可能地读写数据,以免错失读写的机会。因此,我们会循环从文件描述符读写数据,一次性读完所有的内容,那么如果文件描述符是阻塞读取的,没有数据可读写时,进程会阻塞在读写函数那里,程序就没办法继续往下执行。所以,边缘触发模式一般和非阻塞 I/0 搭配使用,程序会一直执行I/0 操作,直到系统调用(如 read和 write)返回错误,错误类型为EAGAIN或EWOULDBLOCK。

相关文章:

I/O多路复用(select/poll/epoll)

通过一个进程来维护多个Socket,也就是I/O多路复用,是一种常见的并发编程技术,它允许单个线程或进程同时监视多个输入/输出(I/O)流(例如网络连接、文件描述符)。当任何一个I/O流准备好进行读写操…...

一键生成达梦、Oracle、MySQL 数据库 ER 图!解锁高效数据库设计!

从事企业软件项目开发的同学们一定对 ER 图很熟悉,可以帮助用户快速厘清数据库结构,方便后续维护和优化。但是在日常工作中,面对复杂的数据结构,整理表设计文档对于每一位DBA来说都很头大,需要将设计细节转化为条理清晰…...

学习黑客 windows 设置与控制面板详解

Windows 设置与控制面板详解:双剑合璧的系统配置工具 ⚙️🔧 学习目标:理解Windows设置和控制面板的异同、掌握系统配置的安全最佳实践 1. 引言:双界面的系统配置世界 🌐 在Windows操作系统中,有两个强大的…...

pytorch模型画质增强简单实现

使用数据增强技术可以增加数据集中图像的多样性,从而提高模型的性能和泛化能力,主要的图像增强技术包括。 亮度,对比度调节 在开始图像大小的调整之前我们需要导入数据(图像以眼底图像为例)。 from PIL import Image f…...

C++中的std::allocator

C中的std::allocator 文章目录 C中的std::allocator1.std::allocator1.1C中的placement new 和operator new1.2一个custom allocator的实现1.3使用std::allocator_traits实现allocator 1.std::allocator C中的std::allocator默默工作在CSTL中的所有容器的内存分配上&#xff0…...

Linux文件编程——read函数与lseek函数

一、read函数 在 Linux 文件编程中,read 函数是一个系统调用,用于从文件描述符(File Descriptor)指向的文件或设备中读取数据到缓冲区。它是 Unix/Linux 系统编程中实现底层 I/O 操作的核心函数之一。以下是 read 函数的详细使用…...

STM32 变量存储

一、存储区划分与变量分类 STM32的存储空间分为Flash(非易失性)和RAM(易失性)两大区域: ​Flash存储器 ​代码段(Code)​:存储程序指令和常量(如字符串、const变量&…...

解锁性能密码:Linux 环境下 Oracle 大页配置全攻略​

在 Oracle 数据库运行过程中,内存管理是影响其性能的关键因素之一。大页内存(Large Pages)作为一种优化内存使用的技术,能够显著提升 Oracle 数据库的运行效率。本文将深入介绍大页内存的相关概念,并详细阐述 Oracle 在…...

HashMap中哈希值与数组坐标的关联

目录 1、哈希值的生成与处理 2、计算桶的索引 3、哈希值总结 4、哈希冲突解决方案 4.1. 拉链法(Separate Chaining) 4.2. 开放寻址法(Open Addressing) 1、线性探测(Linear Probing) 2、二次探测&a…...

GBK与UTF-8编码问题(1)

1. 问题现象 我们在编译.py的python代码时,有时会遇到如下图这种问题。提示说“SyntaxError: (unicode error) ‘utf-8’ codec can’t decode byte 0xc4 in position 0: invalid continuation byte”,代码中有中文字符,这似乎和文件的编码方…...

大模型的实践应用41-天气预测与分析决策系统:Qwen3(32B)+langchain框架+MCP(大模型上下文协议)+RAG+传统算法

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用41-Qwen3(32B)+langchain框架+MCP(大模型上下文协议)+RAG+传统算法研发天气预测与分析决策系统。本项目构建一个基于大模型Qwen3(32B)、LangChain框架、MCP协议、RAG技术以及传统算法的天气预测与分析决策系统。该系统通…...

单片机学习Day08--相邻流水灯

一&#xff0c;题目&#xff1a;同时点亮相邻的两个灯&#xff0c;并实现流水设计。 亮的是0&#xff1b; 最前面是LED8. #include <REGX51.H> typedef unsigned int u16; typedef unsigned char u8; #define led P2 void delay_10us(u16 t) { while(t--); } void mai…...

邮件营销应对高退信率的策略

一、邮件列表管理 1. 使用专业工具验证 借助如 Geeksend 邮箱验证等专业工具&#xff0c;全面清洗邮件列表&#xff0c;剔除无效、过期或格式错误的邮箱地址&#xff0c;确保邮件精准送达有效收件人&#xff0c;从而降低退信率。 2. 定期清理无效地址 将定期清理邮件列表纳入…...

无线定位之 三 SX1302 网关源码 thread_gps 线程详解

前言 笔者计划通过无线定位系列文章、系统的描述 TDOA 无线定位和混合定位相关技术知识点, 并以实践来验证此定位系统精度。 笔者从实践出发、本篇直接走读无线定位系统关键节点、网关 SX1302 源码框架,并在源码走读过程 中、着重分析与无线定位相关的PPS时间的来龙去脉、并在…...

Kubernetes控制平面组件:Kubelet详解(一):API接口层介绍

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…...

Java项目层级介绍 java 层级 层次

java 层级 层次 实体层 控制器层 数据连接层 Service : 业务处理类 Repository &#xff1a;数据库访问类 Java项目层级介绍 https://blog.csdn.net/m0_67574906/article/details/145811846 在Java项目中&#xff0c;层级结构&#xff08;Layered Architecture&#xf…...

【操作系统】零拷贝技术

1. DMA技术 DMA技术也就是直接内存访问技术。在进行I/O设备和内存的数据传输的时候&#xff0c;数据传输的工作全部交给DMA控制器&#xff0c;而不是CPU负责。 2. 传统的文件传输 传统的文件传输的代码如下&#xff1a; read(file, tmp_buf, len); write(socket, tmp_buf,…...

从零构建高性能桌面应用:GPUI Component全解析与实战指南

简介 高性能UI组件库正在重塑桌面应用开发的格局,而GPUI Component作为新兴的Rust桌面UI组件库,凭借其卓越的跨平台支持能力、GPU加速渲染和企业级功能特性,正成为构建现代化高性能桌面应用的首选。本文将从零开始,全面解析GPUI Component的核心特性、安装配置流程,并通过…...

java 中 DTO 和 VO 的核心区别

DTO 和 VO 的核心区别 特性DTO&#xff08;数据传输对象&#xff09;VO&#xff08;视图对象&#xff09;设计目的服务层与外部系统&#xff08;如前端、其他服务&#xff09;之间的数据传输为前端展示层定制数据&#xff0c;通常与 UI 强绑定数据内容可能包含业务逻辑需要的字…...

bazel迁移cmake要点及具体迁移工程示例(apollo radar)

文章目录 bazel迁移cmake要点及具体迁移工程示例迁移要点指南依赖库管理proto编译目标库及二进制文件生成项目导出runtime_data软件打包 conti_rardar完整迁移过程common_msgcommoncanbusconti_radar编译 bazel迁移cmake要点及具体迁移工程示例 迁移要点指南 迁移主要的内容包…...

跨时钟域(CDC,clock domain crossing)信号处理

参考视频&#xff1a; 数字IC&#xff0c;FPGA秋招【单bit信号的CDC跨时钟域处理手撕代码合集】_哔哩哔哩_bilibili 一、亚稳态 原因是&#xff1a;建立时间和保持时间没有保持住。然后在下图的红框里面&#xff0c;产生亚稳态。因为电路反馈机制&#xff0c;最后大概率会恢复…...

Java高频面试之并发编程-16

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天又来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;volatile 实现原理是什么&#xff1f; volatile 关键字的实现原理 volatile 是 Java 中用于解决多线程环境下变量可见性…...

MyBatis 一对多关联映射在Spring Boot中的XML配置

在Spring Boot中使用MyBatis实现一对多关系时&#xff0c;可以通过XML映射文件来配置。下面我将详细介绍几种实现方式。 基本概念 一对多关系指的是一个实体对象包含多个子对象集合的情况&#xff0c;例如&#xff1a; 一个部门有多个员工一个订单有多个订单项一个博客有多个…...

Spring Boot异步任务失效的8大原因及解决方案

Spring Boot异步任务失效的8大原因及解决方案 摘要:在使用Spring Boot的@Async实现异步任务时,你是否遇到过异步不生效的问题?本文总结了8种常见的异步失效场景,并提供对应的解决方案,帮助你彻底解决异步任务失效的难题。 一、异步失效的常见场景 1. 未启用异步支持 ❌ …...

嵌入式Linux I2C驱动开发详解

文章目录 一、I2C协议的核心原理 1. I2C协议的“双线制”通信 2. I2C的地址寻址机制 二、Linux I2C驱动框架的分层设计 1. I2C核心 2. I2C适配器 3. I2C设备驱动 三、I2C驱动开发测试 一、I2C协议的核心原理 1. I2C协议的“双线制”通信 SDA&#xff08;数据线&#xff09; 和…...

基于 Spring Boot 瑞吉外卖系统开发(十二)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;十二&#xff09; 菜品删除 单击“批量删除”和“删除”时&#xff0c;会携带需要删除的菜品的id以delete请求方式向“/dish”发送请求。 URLhttp://127.0.0.1:8080/dish调用方法DELETE参数ids DishController添加删除方法 …...

基于 51 单片机的 PWM 电机调速系统实现

51 单片机通过定时器来实现 PWM(脉冲宽度调制)控制,这是一种通过调整方波信号的占空比来控制输出功率的技术。下面详细介绍如何使用 51 单片机实现 PWM 控制并应用于电机调速。 1. PWM 控制原理 PWM 信号是一个周期性的方波,通过调整高电平时间(Ton)与周期(T)的比例(…...

wordpress主题分享

发布于&#xff1a;Eucalyptus-Blog 一、引言 大家对WordPress免费主题都非常感兴趣&#xff0c;但是一般收费的WordPress主题功能才多&#xff0c;其实有很多开源的免费WordPress主题都很不错&#xff0c;对于很多新建站的小伙伴&#xff0c;这些主题完全足够用了。这里就分享…...

【合新通信】无人机天线拉远RFOF(射频光纤传输)解决方案

无人机天线拉远RFOF方案通过光纤替代传统射频电缆&#xff0c;实现无人机与地面控制站之间的高保真、低损耗信号传输&#xff0c;尤其适用于高频段&#xff08;如毫米波&#xff09;、远距离或复杂电磁环境下的无人机作业场景。 核心应用场景 军事侦察与电子战 隐蔽部署&…...

视觉-语言-动作模型:概念、进展、应用与挑战(下)

25年5月来自 Cornell 大学、香港科大和希腊 U Peloponnese 的论文“Vision-Language-Action Models: Concepts, Progress, Applications and Challenges”。 视觉-语言-动作 (VLA) 模型标志着人工智能的变革性进步&#xff0c;旨在将感知、自然语言理解和具体动作统一在一个计…...

git如何将本地 dev 分支与远程 dev 分支同步

要让本地 dev 分支与远程 dev 分支完全同步&#xff08;丢弃本地多余的提交记录&#xff09;&#xff0c;可以按照以下步骤操作&#xff1a; 1. ​​获取远程最新状态​ git fetch origin dev # 拉取远程 dev 分支的最新提交&#xff0c;但不会修改本地代码 IDEA中点击fetc…...

自动化测试与功能测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 什么是自动化测试? 自动化测试是指利用软件测试工具自动实现全部或部分测试&#xff0c;它是软件测试的一个重要组成 部分&#xff0c;能完成许多手工测试无…...

python3数据类型

常见python3数据类型 Number&#xff08;数字&#xff09;String&#xff08;字符串&#xff09;bool&#xff08;布尔类型&#xff09;List&#xff08;列表&#xff09;Tuple&#xff08;元组&#xff09;Set&#xff08;集合&#xff09;Dictionary&#xff08;字典&#x…...

《Python星球日记》 第66天:序列建模与语言模型

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、传统语言模型1. n-gram 模型基础2. n-gram 模型的局限性 二、RNN 在语言建模…...

CRM和SCRM有什么区别

CRM&#xff08;客户关系管理&#xff09;与SCRM&#xff08;社会化客户关系管理&#xff09;的主要区别在于沟通方式、客户互动、数据来源和客户参与度。CRM更侧重企业对客户信息的管理与内部流程优化&#xff0c;而SCRM强调客户主动参与&#xff0c;通过社交媒体等平台加强互…...

破解 Qt QProcess 在 Release 模式下的“卡死”之谜

在使用 Qt 的 QProcess 以调用外部 ffmpeg/ffprobe 进行音视频处理时&#xff0c;常见的工作流程是&#xff1a; gatherParams&#xff1a;通过 ffprobe 同步获取媒体文件的参数&#xff08;分辨率、采样率、声道数、码率等&#xff09;。 reencode&#xff1a;逐个文件调用 f…...

重学安卓14/15自由窗口freeform企业实战bug-学员作业

背景&#xff1a; 在aosp14版本及以后版本上&#xff0c;安卓的自由窗口部分的工具栏部分都有了较大的更新 工具栏这部分已经移到了SystemUI进程的WMShell进行统一的管理。 但是近来有学员朋友在对自由窗口进行相关的拖拽操作时候&#xff0c;有遇到这个工具栏相关的一个bug&…...

【layout组件 与 路由镶嵌】vue3 后台管理系统

前言 很多同学在第一次搭建后台管理系统时&#xff0c;会遇到一个问题&#xff0c;layout组件该放哪里&#xff1f;如何使用&#xff1f;路由又该如何设计&#xff1f; 这边会讲一下我的思考过程和最后的结果&#xff0c;大家可以参考一下&#xff0c;希望大家看完能有所收获。…...

【PXIE301-211】基于PXIE总线的16路并行LVDS数据采集、1路光纤数据收发处理平台

板卡概述 PXIE301-211是一款基于PXIE总线架构的16路并行LVDS数据采集、1路光纤收发处理平台&#xff0c;该板卡采用Xilinx的高性能Kintex 7系列FPGA XC7K325T作为实时处理器&#xff0c;实现各个接口之间的互联。板载1组64位的DDR3 SDRAM用作数据缓存。板卡具有1个FMC&#xf…...

linux-进程信号的产生

Linux中的进程信号&#xff08;signal&#xff09;是一种用于进程间通信或向进程传递异步事件通知的机制。信号是一种软中断&#xff0c;用于通知进程某个事件的发生&#xff0c;如错误、终止请求、计时器到期等。 1. 信号的基本概念 - 信号&#xff08;Signal&#xff09;&am…...

基于 Nexus 在 Dockerfile 配置 yum, conda, pip 仓库的方法和参考

在 Nexus 配置代理仓库的方法&#xff0c;可参考 pypi 的配置博客&#xff1a;https://hellogitlab.com/CI/docker/create_your_nexus_2 更多代理格式&#xff0c;参考官方文档&#xff0c;如 pypi&#xff1a;https://help.sonatype.com/en/pypi-repositories.html 配置 yum…...

精品可编辑PPT | 全面风险管理信息系统项目建设风控一体化标准方案

这份文档是一份全面风险管理信息系统项目建设风控一体化标准方案&#xff0c;涵盖了业务架构、功能方案、系统技术架构设计、项目实施及服务等多个方面的详细内容。方案旨在通过信息化手段提升企业全面风险管理工作水平&#xff0c;促进风险管理落地和内部控制规范化&#xff0…...

Redis集群安装

Redis集群安装 1.集群介绍 首先要了解&#xff0c;Redis的高可用机制。 2个master节点&#xff0c;挂掉1个&#xff0c;1不过半&#xff0c;则集群宕机&#xff0c;不可用&#xff0c;容错率为0&#xff1b;3个master节点&#xff0c;挂掉1个&#xff0c;2>1&#xff0c;…...

下载知网外文文献全文的方法

知网和一些外文数据库机构是合作关系&#xff0c;因知网没有订购外文文献全文&#xff0c;所以可以搜到外文文献但不能下载全文&#xff0c;基本提供的都是外文文献摘要。本文就实例演示一下获取知网外文文献全文的方法步骤。 例如下面这篇知网外文文献&#xff0c;该文献被收…...

解决IDEA无法运行git的问题

之前git一直没有问题&#xff0c;今天打开就提示我安装git&#xff0c;自然用git去提交新项目也会遇到问题。 我出现问题的原因是&#xff1a;git路径缺失 文件->设置->git 发现git的路径为空&#xff0c;按照实际位置填写即可...

基于Qt6 + MuPDF在 Arm IMX6ULL运行的PDF浏览器——MuPDF Adapter文档

项目地址&#xff1a;总项目Charliechen114514/CCIMXDesktop: This is a Qt Written Desktop with base GUI Utilities 本子项目地址&#xff1a;CCIMXDesktop/extern_app/pdfReader at main Charliechen114514/CCIMXDesktop 前言 这个部分说的是Mupdf_adaper下的文档的工…...

Ubuntu20.04 搭建Kubernetes 1.28版本集群

环境依赖 以下操作,无特殊说明,所有节点都需要执行 安装 ssh 服务安装 openssh-server复制代码 sudo apt-get install openssh-server修改配置文件复制代码 vim /etc/ssh/sshd_config找到配置项 复制代码 LoginGraceTime 120 PermitRootLogin prohibit-password StrictModes…...

操作系统和数据库账号密码的安全管理、使用,安当SMS凭据管理系统

引言&#xff1a;密码管理困局下的破局之道 在数字化转型的深水区&#xff0c;企业正面临前所未有的密码管理挑战。某跨国制造企业因数据库密码泄露导致核心工艺参数外泄&#xff0c;某三甲医院因运维账号滥用引发百万级医疗数据泄露事件&#xff0c;这些真实案例揭示着传统密…...

Java设计模式之代理模式:从入门到精通(保姆级教程)

1. 代理模式概述 代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介作用,可以在不改变目标对象代码的情况下增加额外的功能。 1.1 专业概念解释 代理模式:为其他对象提供一种代理…...

单片机-STM32部分:13-1、蜂鸣器

飞书文档https://x509p6c8to.feishu.cn/wiki/V8rpwIlYIiEuXLkUljTcXWiKnSc 一、应用场景 大部分的电子产品、家电&#xff08;风扇、空调、电水壶&#xff09;都会有蜂鸣器&#xff0c;用于提示设备的工作状态 二、原理 蜂鸣器是一种将电信号转换为声音信号的器件&#xff0…...