【Linux】system V消息队列,信号量
🔥个人主页:Quitecoder
🔥专栏:linux笔记仓
目录
- 01.消息队列
- System V 消息队列接口
- 02.信号量
- System V 信号量接口
- 03.OS对system V ipc的管理
- 消息队列管理结构
- 共享内存管理结构
- 信号量管理结构
01.消息队列
消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法
每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值
发送方将消息放入队列,接收方从队列中取出消息
发送方和接收方不需要同时在线,消息可以存储在队列中,等待接收方处理
消息队列也有自己的属性
struct msqid_ds
{struct ipc_perm msg_perm; /* Ownership and permissions */time_t msg_stime; /* Time of last msgsnd(2) */time_t msg_rtime; /* Time of last msgrcv(2) */time_t msg_ctime; /* Time of creation or lastmodification by msgctl() */unsigned long msg_cbytes; /* # of bytes in queue */msgqnum_t msg_qnum; /* # number of messages in queue */msglen_t msg_qbytes; /* Maximum # of bytes in queue */pid_t msg_lspid; /* PID of last msgsnd(2) */pid_t msg_lrpid; /* PID of last msgrcv(2) */
};
System V 消息队列接口
System V 消息队列是 UNIX 系统提供的一种 IPC 机制,主要接口包括:
(1) ftok
• 功能:生成消息队列的键值(key_t
)。
• 原型:
key_t ftok(const char *pathname, int proj_id);
• 参数:
• pathname
:文件路径。
• proj_id
:项目 ID。
• 返回值:生成的键值。
(2) msgget
• 功能:创建或获取消息队列。
• 原型:
int msgget(key_t key, int msgflg);
• 参数:
• key
:消息队列的键值。
• msgflg
:标志位(如 IPC_CREAT
、IPC_EXCL
)。
• 返回值:消息队列的标识符(msqid
)。
(3) msgsnd
• 功能:向消息队列发送消息。
• 原型:
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
• 参数:
• msqid
:消息队列标识符。
• msgp
:指向消息结构的指针。
• msgsz
:消息的大小。
• msgflg
:标志位(如 IPC_NOWAIT
)。
消息结构通常定义如下:
struct Message {long mtype; // 消息类型(必须为 long 类型)char mtext[100]; // 消息内容(可以是任意类型)
};
消息类型必须为 long 类型
消息内容,可以是字符数组、结构体等
(4) msgrcv
• 功能:从消息队列接收消息。
• 原型:
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
• 参数:
• msqid
:消息队列标识符。
• msgp
:指向消息结构的指针。
• msgsz
:消息的大小。
• msgtyp
:消息类型。
• msgflg
:标志位(如 IPC_NOWAIT
)。
(5) msgctl
• 功能:控制消息队列(如删除队列、获取状态等)。
• 原型:
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
• 参数:
• msqid
:消息队列标识符。
• cmd
:控制命令(如 IPC_RMID
、IPC_STAT
)。
• buf
:指向 msqid_ds
结构的指针。
dyx@dyx-VMware-Virtual-Platform:~/bitcode$ ipcs--------- 消息队列 -----------
键 msqid 拥有者 权限 已用字节数 消息 ------------ 共享内存段 --------------
键 shmid 拥有者 权限 字节 连接数 状态 --------- 信号量数组 -----------
键 semid 拥有者 权限 nsems
02.信号量
首先进行几个概念的理解:
- 多个执行流(进程),能看到的一份资源:共享资源
- 被保护起来的共享资源 - 临界资源 —同步和互斥来保护
- 互斥:任何时刻只能有一个进程在访问共享资源
- 资源被访问,朴素的认识就是通过代码访问—代码=访问共享资源的代码+不访问共享资源的代码
- 临界区是指访问临界资源的代码段。在临界区内,线程或进程会访问或修改共享资源
#include <mutex>std::mutex mtx;
int shared_variable = 0;void increment() {mtx.lock(); // 加锁shared_variable++; // 临界区mtx.unlock(); // 解锁
}
信号量是用来保护共享资源,实现资源的互斥访问,信号量的核心思想是通过一个计数器来管理资源的可用数量
申请信号量的本质就是对资源的预定机制
它通过 原子操作 来控制资源的分配和释放,确保多个线程或进程能够安全地访问共享资源。信号量的核心思想是:
-
计数器:
• 信号量维护一个非负整数计数器,表示当前可用资源的数量。
• 当计数器大于 0 时,表示资源可用;当计数器为 0 时,表示资源不可用。 -
原子操作:
• 信号量的操作(P 操作和 V 操作)是原子的,即这些操作在执行过程中不会被中断。
• 原子性确保了多个线程或进程在访问信号量时不会发生竞争条件。 -
阻塞与唤醒:
• 当线程或进程请求资源时(P 操作),如果计数器为 0,则线程或进程会被阻塞,直到资源可用。
• 当线程或进程释放资源时(V 操作),如果有等待的线程或进程,则唤醒其中一个。
信号量与共享资源之间的交互通过 P 操作 和 V 操作 实现。以下是信号量与共享资源的交互过程:
- P 操作(Wait 或 Acquire)
• 功能:请求资源。
• 实现:
• 计数器减 1。
• 如果计数器小于 0,则当前线程或进程被阻塞,直到计数器大于 0。
• 伪代码:
P(semaphore):semaphore--if semaphore < 0:block()
- V 操作(Signal 或 Release)
• 功能:释放资源。
• 实现:
• 计数器加 1。
• 如果有等待的线程或进程,则唤醒其中一个。
• 伪代码:
V(semaphore):semaphore++if semaphore <= 0:wakeup()
假设有一个共享资源(如打印机),使用信号量来管理其访问:
-
初始化信号量:
• 信号量计数器初始化为 1(表示资源可用)。semaphore = 1;
-
线程 A 请求资源:
• 执行 P 操作,计数器减 1。
• 计数器变为 0,资源被线程 A 占用。P(semaphore); // semaphore = 0
-
线程 B 请求资源:
• 执行 P 操作,计数器减 1。
• 计数器变为 -1,线程 B 被阻塞。P(semaphore); // semaphore = -1
-
线程 A 释放资源:
• 执行 V 操作,计数器加 1。
• 计数器变为 0,唤醒线程 B。V(semaphore); // semaphore = 0
-
线程 B 占用资源:
• 线程 B 被唤醒,占用资源。
• 计数器仍为 0,表示资源被线程 B 占用。 -
线程 B 释放资源:
• 执行 V 操作,计数器加 1。
• 计数器变为 1,资源可用。V(semaphore); // semaphore = 1
和共享内存,消息队列一样,必须先让不同的进程看到同一个计数器
意味着信号量也是一个公共资源
System V 信号量接口
(1) semget
• 功能:创建或获取信号量集。
• 原型:
int semget(key_t key, int nsems, int semflg);
• 参数:
• key
:信号量集的键值。
• nsems
:信号量集中的信号量数量。
• semflg
:标志位(如 IPC_CREAT
、IPC_EXCL
)。
• 返回值:成功返回信号量集的标识符,失败返回 -1。
(2) semop
• 功能:执行信号量操作(P 操作或 V 操作)。
• 原型:
int semop(int semid, struct sembuf *sops, size_t nsops);
• 参数:
• semid
:信号量集的标识符。
• sops
:指向 sembuf
结构数组的指针。
• nsops
:操作的数量。
• 返回值:成功返回 0,失败返回 -1。
(3) semctl
• 功能:控制信号量集(如初始化、删除、获取状态等)。
• 原型:
int semctl(int semid, int semnum, int cmd, ...);
• 参数:
• semid
:信号量集的标识符。
• semnum
:信号量的索引。
• cmd
:控制命令(如 IPC_RMID
、SETVAL
)。
• ...
:可选参数,通常是一个 union semun
结构。
• 返回值:成功返回 0 或其他值(取决于 cmd
),失败返回 -1。
示例:
#include <sys/ipc.h>
#include <sys/sem.h>
#include <iostream>int main() {key_t key = ftok("semfile", 65);int semid = semget(key, 1, 0666 | IPC_CREAT);// 初始化信号量值为 1semctl(semid, 0, SETVAL, 1);struct sembuf sb;sb.sem_num = 0;sb.sem_op = -1; // P 操作sb.sem_flg = 0;semop(semid, &sb, 1);std::cout << "Critical section" << std::endl;sb.sem_op = 1; // V 操作semop(semid, &sb, 1);// 删除信号量semctl(semid, 0, IPC_RMID);return 0;
}
03.OS对system V ipc的管理
不管是共享内存,消息队列还是信号量,他们调用接口都为xxxget,xxxctl
- IPC 标识符
操作系统为每个 IPC 资源分配一个唯一的 标识符(ID),用于标识和管理该资源。标识符的类型包括:
• 消息队列标识符(msqid
):用于标识消息队列。
• 共享内存标识符(shmid
):用于标识共享内存段。
• 信号量标识符(semid
):用于标识信号量集。
标识符的生成方式:
• 通过 ftok
函数生成键值(key_t
),然后使用 msgget
、shmget
或 semget
创建或获取 IPC 资源。
- 资源管理结构
操作系统为每种 IPC 资源维护一个 管理结构,用于存储资源的属性和状态。以下是常见的管理结构:
消息队列管理结构
• msqid_ds
:
• 存储消息队列的属性,如权限、消息数量、最后操作时间等。
• 示例:
```cpp
struct msqid_ds {struct ipc_perm msg_perm; // 权限信息time_t msg_stime; // 最后发送时间time_t msg_rtime; // 最后接收时间time_t msg_ctime; // 最后修改时间unsigned long msg_cbytes; // 当前字节数msgqnum_t msg_qnum; // 当前消息数量msglen_t msg_qbytes; // 最大字节数pid_t msg_lspid; // 最后发送进程的 PIDpid_t msg_lrpid; // 最后接收进程的 PID
};
```
共享内存管理结构
• shmid_ds
:
• 存储共享内存段的属性,如大小、权限、附加进程数等。
• 示例:
```cpp
struct shmid_ds {struct ipc_perm shm_perm; // 权限信息size_t shm_segsz; // 共享内存大小time_t shm_atime; // 最后附加时间time_t shm_dtime; // 最后分离时间time_t shm_ctime; // 最后修改时间pid_t shm_cpid; // 创建进程的 PIDpid_t shm_lpid; // 最后操作进程的 PIDshmatt_t shm_nattch; // 当前附加进程数
};
```
信号量管理结构
• semid_ds
:
• 存储信号量集的属性,如权限、信号量数量、最后操作时间等。
• 示例:
```cpp
struct semid_ds {struct ipc_perm sem_perm; // 权限信息time_t sem_otime; // 最后操作时间time_t sem_ctime; // 最后修改时间unsigned short sem_nsems; // 信号量数量
};
```
- 资源权限
每种 IPC 资源都有一个 权限结构(ipc_perm
),用于控制资源的访问权限。权限结构包括:
• 所有者用户 ID(uid
):资源的所有者。
• 所有者组 ID(gid
):资源的所有者组。
• 创建者用户 ID(cuid
):资源的创建者。
• 创建者组 ID(cgid
):资源的创建者组。
• 权限模式(mode
):资源的访问权限(如读、写、执行)。
- 资源生命周期
IPC 资源的生命周期包括: - 创建:通过
msgget
、shmget
或semget
创建资源。 - 使用:进程通过标识符访问资源。
- 修改:通过
msgctl
、shmctl
或semctl
修改资源属性。 - 删除:通过
msgctl
、shmctl
或semctl
删除资源。
操作系统维护一个 全局的 IPC 资源表,用于存储所有 IPC 资源的信息。每种 IPC 资源(消息队列、共享内存、信号量)都有自己的资源表,表中的每一项对应一个具体的 IPC 资源
相关文章:
【Linux】system V消息队列,信号量
🔥个人主页:Quitecoder 🔥专栏:linux笔记仓 目录 01.消息队列System V 消息队列接口 02.信号量System V 信号量接口 03.OS对system V ipc的管理消息队列管理结构共享内存管理结构信号量管理结构 01.消息队列 消息队列提供了一个…...
【新能源汽车“心脏”赋能:三电系统研发、测试与应用匹配的恒压恒流源技术秘籍】
新能源汽车“心脏”赋能:三电系统研发、测试与应用匹配的恒压恒流源技术秘籍 在新能源汽车蓬勃发展的浪潮中,三电系统(电池、电机、电控)无疑是其核心驱动力。而恒压源与恒流源,作为电源管理的关键要素,在…...
在 Vue.js 中使用递归组件:轻松处理嵌套数据结构
在开发前端应用时,我们经常会遇到需要处理嵌套数据结构的场景,比如树形菜单、评论列表、文件夹结构等。Vue.js 提供了一种优雅的方式来解决这类问题——递归组件。通过递归组件,我们可以轻松地渲染嵌套数据,并保持代码的简洁和可维…...
飞腾2000+/64核加固服务器
在当今信息化高速发展的时代,数据中心作为信息技术的核心支撑,其稳定性、安全性和高效性成为了各行各业关注的焦点。特别是在国防、金融、电信等关键领域,对服务器的性能、可靠性和安全性提出了前所未有的高要求。正是在这样的背景下…...
AutoMQ x OSS 的 Iceberg 数据入湖的最佳实践
背景 在数字化转型进程中,用户交互行为产生的多维度数据已成为企业的重要战略资产。以短视频平台为例,基于用户点赞事件的实时推荐算法能显著提升用户活跃度和平台粘性。这类实时数据主要通过 Apache Kafka 流处理平台进行传输,通过其扇出&a…...
深度学习大模型补充知识点
文章目录 VIT用途处理方法与CNN区别 多模态LLM:大语言模型预训练指令微调强化学习 总结 VIT ViT(Vision Transformer) 首次将 Transformer架构成功应用于计算机视觉领域(尤其是图像分类任务)。传统视觉任务主要依赖卷…...
定义模型生成数据表
1. 数据库配置 js import { Sequelize, DataTypes } from sequelize; // 创建一个 Sequelize 实例,连接到 SQLite 数据库。 export const sequelize new Sequelize(test, sa, "123456", { host: localhost, dialect: sqlite, storage: ./blog.db })…...
C++与C的基本不同
文章目录 变量定义规则1. 基本语法2. 初始化3. 作用域4. 存储类别 函数定义规则1. 基本语法2. 函数声明和定义3. 默认参数4. 内联函数 解析输出流void BluetoothA2DPSink::start(const char* name)class BluetoothA2DPSink : public BluetoothA2DPCommon C是在C语言基础上发展而…...
React19源码系列之createRoot的执行流程是怎么的?
2024年12月5日,react发布了react19版本。后面一段时间都将学习它的源码,并着手记录。 react官网:react19新特性 https://react.dev/blog/2024/12/05/react-19 在用vite创建react项目的使用,main.tsx主文件都会有以下代码。 //i…...
【CXX-Qt】1.5 使用CMake构建
在本示例中,我们将演示如何使用CMake将CXX-Qt代码集成到C应用程序中。Cargo将CXX-Qt代码构建为静态库,然后CMake将其链接到C可执行文件中。 我们首先需要修改项目结构,以分离项目的不同部分。 tutorial cpp qml rust将Rust项目移动到rust文…...
前端面试项目拷打
Axios相关 1.在Axios二次封装时,具体封装了哪些内容,如何处理请求拦截和响应拦截? axios二次封装的目的:为了统一处理请求和响应拦截器、错误处理、请求超时、请求头配置等,提高代码可维护性和复用性。 首先创建axios…...
“Ubuntu禁止root用户通过SSH直接登录”问题的解决
目录 1 前言 2 问题的解决 2.1 修改sshd_config文件 2.2 重启 SSH 服务 1 前言 最近在做毕设的时候,由于使用普通用户,在MobaXterm的图形界面上,无法正常查看/root文件夹内容,如下图所示: 于是我就想直接想用oot…...
Kafka的零拷贝
Kafka的零拷贝(Zero-Copy)技术是其实现高吞吐量的关键优化之一,主要通过减少数据在内核空间和用户空间之间的冗余复制及上下文切换来提升性能。以下是其核心要点: 1. 传统数据拷贝的问题 多次复制:传统文件传输需经历…...
《大语言模型》学习笔记(三)
GPT系列模型的技术演变 2022 年11月底,OpenAI推出了基于大语言模型的在线对话应用—ChatGPT。由于具备出色的人机对话能力和任务解决能力,ChatGPT一经发布就引发了全社会对于大语言模型的广泛关注,众多的大语言模型应运而生,并且…...
华为OD机试 - 最长回文字符串 - 贪心算法(Java 2024 E卷 100分)
题目描述 如果一个字符串正读和反读都一样(大小写敏感),则称之为一个「回文串」。例如: level 是一个「回文串」,因为它的正读和反读都是 level。art 不是一个「回文串」,因为它的反读 tra 与正读不同。Level 不是一个「回文串」,因为它的反读 leveL 与正读不同(因大小…...
K8S-etcd服务无法启动问题排查
一、环境、版本信息说明 k8s:v1.19.16 etcdctl version: 3.5.1 3台etcd(10.xxx.xx.129、10.xxx.xx.130、10.xxx.xx.131)组成的集群。 二、问题根因 129节点的etcd数据与其他两台数据不一致,集群一致性校验出错导致无法加入集…...
基于WebRTC的嵌入式音视频通话SDK:EasyRTC跨平台兼容性技术架构实时通信的底层实现
EasyRTC的核心架构围绕WebRTC技术构建,同时通过扩展信令服务、媒体服务器和NAT穿透机制,解决了WebRTC在实际部署中的痛点。其架构可以分为以下几个核心模块: 1)WebRTC基础层 媒体捕获与处理:通过getUserMediaAPI获取…...
SpringBoot-已添加并下载的依赖,reload和mvn clean 后还是提示找不到jar包问题
背景: 添加spring-jdbc依赖时,原来是指定版本的,担心版本冲突,就改成依赖托管,悲剧的是反复reload和mvn clean,import到类的该包一直标红,提示jar包找不到。。。 解决方案: Idea左上…...
HTML5扫雷游戏开发实战
HTML5扫雷游戏开发实战 这里写目录标题 HTML5扫雷游戏开发实战项目介绍技术栈项目架构1. 游戏界面设计2. 核心类设计 核心功能实现1. 游戏初始化2. 地雷布置算法3. 数字计算逻辑4. 扫雷功能实现 性能优化1. DOM操作优化2. 算法优化 项目亮点技术难点突破1. 首次点击保护2. 连锁…...
机器学习——数据清洗(缺失值处理、异常值处理、数据标准化)
数据清洗(缺失值处理、异常值处理、数据标准化) 在数据处理与分析流程中,数据清洗占据着极为关键的地位。原始数据往往充斥着各种问题,如缺失值、异常值,且数据的尺度和分布也可能存在差异,这些问题会严重影响后续数据分析和机器学习模型的准确性与性能。因此,有效的数据…...
【综述】An Introduction to Vision-Language Modeling【一】
介绍 发表在预印本上的综述,长达76页,其中正文46页。 来自Meta 在Meta工作期间完成 ‡蒙特利尔大学, Mila ♡麦吉尔大学, Mila †多伦多大学 ♠卡内基梅隆大学 ♣麻省理工学院 ∧纽约大学 △加州大学伯克利分校 ▽马里兰大学 ♢阿卜杜拉国王科技大学 •…...
MySQL常用函数详解及SQL代码示例
MySQL常用函数详解及SQL代码示例 引言当前日期和时间函数字符串函数数学函数聚合函数结论 引言 MySQL作为一种广泛使用的关系型数据库管理系统,提供了丰富的内置函数来简化数据查询、处理和转换。掌握这些函数可以大大提高数据库操作的效率和准确性。本文将详细介绍…...
Unity教程(二十二)技能系统 分身技能
Unity开发2D类银河恶魔城游戏学习笔记 Unity教程(零)Unity和VS的使用相关内容 Unity教程(一)开始学习状态机 Unity教程(二)角色移动的实现 Unity教程(三)角色跳跃的实现 Unity教程&…...
RTSPtoWeb, 一个将rtsp转换成webrtc的开源项目
RTSPtoWeb是一个开源项目,旨在将RTSP流转换为可在现代web浏览器中消费的格式,如Media Source Extensions (MSE)、WebRtc或HLS。该项目完全使用golang编写,不依赖于ffmpeg或gstreamer,确保了高效的性能和轻量…...
AIAgent有哪些不错的开源平台
AIAgent领域有许多优秀的开源平台和框架,以下是一些值得推荐的开源平台: AutoGPT AutoGPT 是一个基于 OpenAI 的 GPT-4 和 GPT-3.5 大型语言模型的开源框架,能够根据用户给定的目标自动生成所需提示,并利用多种工具 API 执行多步骤…...
Java---JavaSpringMVC解析(1)
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC" 1.MVC MVC是Model View Controller的缩写&#…...
Vector 的模拟实现:从基础到高级
文章目录 1. 引言2. vector的核心设计3. vector的常用接口介绍3.1 构造函数和析构函数3.1.1 默认构造函数3.1.2 带初始容量的构造函数3.1.3 析构函数 3.2 拷贝构造函数和拷贝赋值运算符3.2.1 拷贝构造函数3.2.2 拷贝赋值运算符 3.5 数组长度调整和动态扩容3.5.1 调整大小&#…...
【大模型科普】大模型:人工智能的前沿(一文读懂大模型)
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能(AI)通过算法模拟人类智能,利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络(如ChatGPT&…...
[漏洞修复]用yum update修openssh漏洞
[漏洞修复]用yum update修openssh漏洞 1. 需求2. 更新Yum仓库2.1 生成本地仓库2.2 生成内网仓库2.3 将Openssh的包更新到仓库 3. 客户端升级3.1 客户端repo文件配置3.2 升级Openssh3.3 升级后的确认 1. 需求 最近经常有朋友问Openssh 漏洞修复的问题,我也在自己的gitee仓库里更…...
[RH342]iscsi配置与排错
[RH342]iscsi配置与排错 1. 服务端配置1.1 安装targetcli1.2 准备磁盘1.3 服务端配置1.4 防火墙配置 2. 客户端配置2.1 安装客户端软件2.2 配置客户端2.3 连接登录服务端2.4 挂载使用 3. 安全验证扩展3.1 服务端3.2 客户端 4. 常见的排错点4.1 服务端常见错误4.2 客户端常见错误…...
Nginx 代理访问一个 Web 界面时缺少内容
1. 资源路径问题 Web 页面中的静态资源(如图片、CSS、JavaScript 文件)可能使用了相对路径或绝对路径,而这些路径在代理后无法正确加载。 解决方法: 检查资源路径:打开浏览器的开发者工具(按 F12…...
HOVER:人形机器人的多功能神经网络全身控制器
编辑:陈萍萍的公主一点人工一点智能 HOVER:人形机器人的多功能神经网络全身控制器HOVER通过策略蒸馏和统一命令空间设计,为人形机器人提供了通用、高效的全身控制框架。https://mp.weixin.qq.com/s/R1cw47I4BOi2UfF_m-KzWg 01 介绍 1.1 摘…...
SEO新手基础优化三步法
内容概要 在网站优化的初始阶段,新手常因缺乏系统性认知而陷入技术细节的误区。本文以“三步法”为核心框架,系统梳理从关键词定位到内容布局、再到外链构建的完整优化链路。通过拆解搜索引擎工作原理,重点阐明基础操作中容易被忽视的底层逻…...
遨游科普:三防平板是哪三防?有哪些应用场景?
在工业智能化与数字化转型的浪潮中,电子设备的耐用性和环境适应性成为关键需求。普通消费级平板电脑虽然功能强大,但在极端环境下往往“水土不服”。而三防平板凭借其独特的防护性能,正逐步成为“危、急、特”场景的核心工具。 AORO P300 Ult…...
Etcd 服务搭建
💢欢迎来到张胤尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Etcd 服务搭建预编译的二进制文件安装下载 etcd 的…...
C++《红黑树》
在之前的篇章当中我们已经了解了基于二叉搜索树的AVL树,那么接下来在本篇当中将继续来学习另一种基于二叉搜索树的树状结构——红黑树,在此和之前学习AVL树类似还是通过先了解红黑树是什么以及红黑树的结构特点,接下来在试着实现红黑树的结构…...
Axios 请求取消:从原理到实践
Axios 请求取消:从原理到实践 在现代前端开发中,网络请求是不可或缺的一部分。Axios 是一个基于 Promise 的 HTTP 客户端,广泛应用于浏览器和 Node.js 环境中。然而,在某些场景下,我们可能需要取消正在进行的请求&…...
【css酷炫效果】纯CSS实现照片堆叠效果
【css酷炫效果】纯CSS实现照片堆叠效果 缘创作背景html结构css样式完整代码基础版进阶版(增加鼠标悬停查看) 效果图 想直接拿走的老板,链接放在这里:https://download.csdn.net/download/u011561335/90492022 缘 创作随缘,不定时更新。 创…...
论文精度:Transformers without Normalization
前言 论文题目:Transformers without Normalization 作者:Jiachen Zhu 1,2 , Xinlei Chen 1 , Kaiming He 3 , Yann LeCun 1,2 , Zhuang Liu 1,4,† 论文地址:https://arxiv.org/pdf/2503.10282 摘要 这篇论文探讨了现代神经网络中广泛使用的归一化层是否是必不可少的。…...
基于香橙派 KunpengPro学习CANN(3)——pytorch 模型迁移
通用模型迁移适配可以分为四个阶段:迁移分析、迁移适配、精度调试与性能调优。 迁移分析 迁移支持度分析: 准备NPU环境,获取模型的源码、权重和数据集等文件;使用迁移分析工具采集目标网络中的模型/算子清单,识别第三方…...
微软远程桌面即将下架?Splashtop:更稳、更快、更安全的 RDP 替代方案
近日,Windows 官方博客宣布:将于2025年5月27日起,在 Windows 10 和 Windows 11 应用商店中下架“Microsoft 远程桌面”应用,建议用户迁移至新的 Windows App。这一变动引发了广大用户对远程访问解决方案的关注。作为全球领先的远程…...
【Python】Python与算法有应用关系吗?
李升伟 整理 是的,Python与算法有着密切的应用关系。Python作为一种高级编程语言,因其简洁的语法和强大的库支持,被广泛应用于算法设计、实现和应用中。以下是Python与算法之间的一些主要应用关系: 1. 算法学习与教学࿱…...
js,html,css,vuejs手搓级联单选
<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>级联选择器</title><script src"h…...
将Django连接到mysql
将Django连接到mysql 文章目录 将Django连接到mysql一.按照我的文章 在Django模型中的Mysql安装 此篇 的步骤完成mysql的基础配置二.Django配置 一.按照我的文章 ‘在Django模型中的Mysql安装’ 此篇 的步骤完成mysql的基础配置 基础配置具体内容 1.打开PowerShell 安装mysql的…...
每天五分钟深度学习框架pytorch:基于pytorch搭建循环神经网络RNN
本文重点 我们前面介绍了循环神经网络RNN,主要分析了它的维度信息,其实它的维度信息是最重要的,一旦我们把维度弄清楚了,一起就很简单了,本文我们正式的来学习一下,如何使用pytorch搭建循环神经网络RNN。 RNN的搭建 在pytorch中我们使用nn.RNN()就可以创建出RNN神经网络…...
【力扣刷题实战】无重复的最长字串
大家好,我是小卡皮巴拉 文章目录 目录 力扣题目: 无重复的最长字串 题目描述 解题思路 问题理解 算法选择 具体思路 解题要点 完整代码(C) 兄弟们共勉 !!! 每篇前言 博客主页&#x…...
vulhub/joker 靶机----练习攻略
1. 靶机下载地址 https://download.vulnhub.com/ha/joker.zip 下载下来是ova文件,直接双击,在VMware打开,选择保存位置,点击导入。 2. 设置网卡模式为NAT,打开靶机 3.老规矩,打开kali,扫同C…...
Nuxt2 vue 给特定的页面 body 设置 background 不影响其他页面
首先认识一下 BODY_ATTRS 他可以在页面单独设置 head () {return {bodyAttrs: {form: form-body}};},设置完效果是只有这个页面会加上 接下来在APP.vue中添加样式...
【Go】运算符笔记
基本数学运算 Go 语言支持常见的 算术运算符,用于执行数学计算。 运算符说明加法-减法*乘法/除法%取余自增--自减 整数运算只能得到整数部分 package mainimport ("fmt""math" )func main() {go_math() }func go_math() {x, y : 8, 5fmt.Pr…...
常见的前端安全问题
前端安全是 Web 开发中至关重要的一环,以下是常见的前端安全问题及对应的防御措施: 1. XSS(跨站脚本攻击) 攻击原理 攻击者向页面注入恶意脚本(如 JavaScript),在用户浏览器中执行,…...