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

Linux操作系统--进程间通信(system V共享内存)

目录

1.system V共享内存

2.共享内存数据结构

3.共享内存函数

4.实例代码:


1.system V共享内存

共享内存区是最快的IPC(进程间通信)形式。一旦这样的内存映射到共享它的进程地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。

共享内存区它是指多个进程可以访问和共享同一块内存区域,从而实现进程间的数据交换和通信。共享内存区通常被认为是最快的IPC形式,因为它避免了数据的复制和传输,进程可以直接在共享的内存区域中读写数据,速度较快

system V的特性:

  1. 共享内存没有同步互斥之类的保护机制
  2. 共享内存是所有进程间通信中,速度最快的
  3. 共享内存内部的数据由用户自己维护

2.共享内存数据结构

进程间通信的本质:先让不同的进程,看到同一份资源

操作系统要不要管理所有的共享内存?要,先描述再组织

1. 防止冲突

如果没有操作系统统一管理共享内存,多个进程可能会同时尝试访问同一块内存区域,从而引发数据竞争或不一致的情况。这种情况下可能导致程序崩溃甚至整个系统不稳定。

2. 保护隐私与安全

操作系统通过权限控制机制确保只有授权的进程能够访问特定的共享内存区域。这不仅有助于维护不同应用程序之间的隔离性,还增强了整体系统的安全性。

3. 优化性能

通过虚拟内存技术和工作集理论的支持,操作系统可以更高效地调度和分配共享内存给各个需要它的进程。这样不仅可以减少不必要的物理内存占用,还能提升多任务环境下的响应速度和吞吐量。

4. 简化编程模型

对于开发者而言,拥有一个由操作系统提供并保障的一致性和可靠性高的共享内存抽象层是非常重要的。它可以让程序员专注于业务逻辑而非底层复杂的同步细节。

struct shmid_ds {struct ipc_perm shm_perm;        /* Ownership and permissions */size_t          shm_segsz;       /* Size of segment (bytes) */time_t          shm_atime;       /* Last attach time */time_t          shm_dtime;       /* Last detach time */time_t          shm_ctime;       /* Last change time */unsigned short  shm_cpid;        /* PID of creator */unsigned short  shm_lpid;        /* PID of last operator */unsigned short  shm_nattch;      /* Number of current attaches */
};
struct ipc_perm {key_t          __key;    /* Key supplied to shmget(2) */uid_t          uid;      /* Effective UID of owner */gid_t          gid;      /* Effective GID of owner */uid_t          cuid;     /* Effective UID of creator */gid_t          cgid;     /* Effective GID of creator */unsigned short mode;     /* Permissions + SHM_DEST andSHM_LOCKED flags */unsigned short __seq;    /* Sequence number */};

3.共享内存函数

ftok函数

功能:生成一个key

首先,我们需要谈谈 什么是key

  1. key是一个数字,这个数字是几不重要,关键在于它必须在内核中具有唯一性,能够让不同的进程进行唯一性标识
  2. 第一个进程可以通过key创建共享内存,第二个之后的进程,只要拿着同一个key就可以和第一个进程看到同一个共享内存
  3. 对于一个已经创建好的共享内存key在哪?key在共享内存的描述对象中
  4. 第一次创建的时候必须有一个key了
  5. key--类似路径--唯一

参数

        pathname:一个已存在的文件路径名,函数会依据该文件的inode号参与生成键值。要确保调用ftok的进程对该文件有读权限

        proj_id:一个整数,通常使用0 - 255(8 位)范围内的值,作为项目标识符进一步确保生成键值的唯一性

返回值:key值

shmget函数

功能:用来创建共享内存
原型
        int shmget(key_t key, size_t size, int shmflg);
参数
        key:这个共享内存段名字
        size:共享内存大小(单位是字节)
        shmflg:由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的
返回值:成功返回一个非负整数,即该共享内存段的标识码;失败返回-1

shmat函数

功能:将共享内存段连接到进程地址空间
原型
        void *shmat(int shmid, const void *shmaddr, int shmflg);
参数
        shmid: 共享内存标识
        shmaddr:指定共享内存出现在进程内存地址的位置
        shmflg:它的两个可能取值是SHM_RND和SHM_RDONLY
返回值:成功返回一个指针,指向共享内存第一个节;失败返回-1

说明:

shmaddr为NULL,核心自动选择一个地址
shmaddr不为NULL且shmflg无SHM_RND标记,则以shmaddr为连接地址。
shmaddr不为NULL且shmflg设置了SHM_RND标记,则连接的地址会自动向下调整为SHMLBA的整数倍。公式:shmaddr -
(shmaddr % SHMLBA)
shmflg=SHM_RDONLY,表示连接操作用来只读共享内存

shmdt函数

功能:将共享内存段与当前进程脱离
原型
        int shmdt(const void *shmaddr);
参数
        shmaddr: 由shmat所返回的指针
返回值:成功返回0;失败返回-1


注意:将共享内存段与当前进程脱离不等于删除共享内存段

shmctl函数

功能:用于控制共享内存
原型
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数
shmid:由shmget返回的共享内存标识码
cmd:将要采取的动作(有三个可取值)
buf:指向一个保存着共享内存的模式状态和访问权限的数据结构
返回值:成功返回0;失败返回-1

cmd:控制命令,常用值如下:

  • IPC_RMID:标记共享内存段为 “待删除” 状态(实际删除发生在所有进程断开连接后)。
  • IPC_STAT:将共享内存的状态信息复制到 buf中。
  • IPC_SET:使用中的buf值更新共享内存的权限和所有者信息。
  • IPC_INFO:获取系统范围内共享内存的限制和状态(需 Linux 特定参数)。

注意:
共享内存的生命周期是随内核的!

用户不主动关闭,共享内存会一直存在

除非内核重启(用户释放)

ipcs -m

指令用于显示系统中当前存在的共享内存段的详细信息。通过运行这个指令,可以查看系统中的共享内存段的标识符、大小、权限等信息。这对于诊断和监视系统中共享内存的使用情况非常有用。

4.实例代码:

makefile

.PHONY:all
all:processa processbprocessa:processa.ccg++ -o $@ $^ -g -std=c++11
processb:processb.ccg++ -o $@ $^ -g -std=c++11.PHONY:clean
clean:rm -f processa processb

comm.hpp

#ifndef __COMM_HPP__
#define __COMM_HPP__#include <iostream>
#include<string>
#include<cstdlib>
#include<cstring>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<sys/stat.h>#include "log.hpp"using namespace std;Log log;
//共享内存的大小一般建议是4096的整数倍
//4097,实际上操作系统给你的是4096*2的大小
const int size = 4096;
const string pathname="/home/xchild";
const int proj_id = 0x6666;key_t GetKey()
{key_t k = ftok(pathname.c_str(), proj_id);if(k < 0){log(Fatal,"ftok error: %s",strerror(errno));exit(1);}log(Info, "ftok success, key is : 0x%x",k);return k;
}int GetShareMemHelper(int flag)
{key_t k = GetKey();int shmid = shmget(k, size, flag);if(shmid < 0){log(Fatal,"create share memory error: %s",strerror(errno));exit(2);}log(Info,"create share memory success, shmid: %d",shmid);return shmid;
}int CreateShm()
{return GetShareMemHelper(IPC_CREAT);
}int GetShm()
{return GetShareMemHelper(IPC_CREAT);
}#define FIFO_FILE "./myfifo"
#define MODE 0664enum{FIFO_CREATE_ERR = 1,FIFO_DELETE_ERR,FIFO_OPEN_ERR
};class Init
{public:Init(){//创建管道int n = mkfifo(FIFO_FILE, MODE);if(n == -1){perror("mkfifo");exit(FIFO_CREATE_ERR);}}~Init(){int m = unlink(FIFO_FILE);if(m == -1){perror("unlink");exit(FIFO_DELETE_ERR);}}
};#endif

processa.cc

#include"comm.hpp"extern Log log;int main()
{Init init;int shmid = CreateShm();char *shmaddr = (char*)shmat(shmid,nullptr,0);//ipc code 在这里!!//一旦有人把数据写入到共享内存,其实我们立马能看到了//不需要经过系统调用,直接就能看到数据了int fd = open(FIFO_FILE, O_RDONLY);//等待写入方打开之后,自己才会打开文件,向后执行,open阻塞了if(fd < 0){log(Fatal,"error string: %s, error code: %d", strerror(errno),errno);exit(FIFO_OPEN_ERR);}struct shmid_ds shmds;while(true){char c;ssize_t s = read(fd, &c, 1);if(s == 0)break;else if(s < 0)break;cout << "client say@ " <<shmaddr <<endl;//直接访问共享内存sleep(1);shmctl(shmid,IPC_STAT,&shmds);cout<<"shm size: "<<shmds.shm_segsz<<endl;cout<<"shm nattch: "<<shmds.shm_nattch<<endl;printf("shm key: 0x%x\n", shmds.shm_perm.__key);cout<<"shm mode: "<<shmds.shm_perm.mode<<endl;}shmdt(shmaddr);shmctl(shmid, IPC_RMID,nullptr);close(fd);return 0;
}

processb.cc

#include "comm.hpp"int main()
{int shmid = GetShm();char *shmaddr = (char*)shmat(shmid,nullptr,0);int fd = open(FIFO_FILE,O_WRONLY);//等待写入方打开之后,自己才会打开文件,向后执行,open阻塞了if(fd < 0){log(Fatal,"error string: %s, error code: %d",strerror(errno),errno);exit(FIFO_OPEN_ERR);}//一旦有了共享内存,挂接到自己的地址空间中,你直接把他当作你的内存空间来用即可//不需要调用系统调用//ipc codewhile(true){cout<<"Please Enter@ ";fgets(shmaddr,4096,stdin);write(fd,"c",1);//通知对方}shmdt(shmaddr);close(fd);return 0;
}

log.hpp

#pragma once#include <iostream>
#include <time.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>#define SIZE 1024#define Info 0
#define Debug 1
#define Warning 2
#define Error 3
#define Fatal 4#define Screen 1
#define Onefile 2
#define Classfile 3#define LogFile "log.txt"class Log
{
public:Log(){printMethod = Screen;path = "./log/";}void Enable(int method){printMethod = method;}std::string levelToString(int level){switch (level){case Info:return "Info";case Debug:return "Debug";case Warning:return "Waring";case Error:return "Error";case Fatal:return "Fatal";default:return "None";}}void printLog(int level, const std::string &logtxt){switch (printMethod){case Screen:std::cout << logtxt << std::endl;break;case Onefile:printOneFile(LogFile, logtxt);break;case Classfile:printClassFile(level, logtxt);break;}}void printOneFile(const std::string &logname, const std::string &logtxt){std::string _logname = path + logname;int fd = open(_logname.c_str(), O_WRONLY | O_CREAT | O_APPEND, 0666);if (fd < 0)return;write(fd, logtxt.c_str(), logtxt.size());close(fd);}void printClassFile(int level, const std::string &logtxt){std::string filename = LogFile;filename += ".";filename += levelToString(level);printOneFile(filename, logtxt);}~Log(){}void operator()(int level, const char *format, ...){time_t t = time(nullptr);struct tm *ctime = localtime(&t);char leftbuffer[SIZE];snprintf(leftbuffer, sizeof(leftbuffer), "[%s][%d-%d-%d %d:%d:%d]", levelToString(level).c_str(),ctime->tm_year + 1900, ctime->tm_mon + 1, ctime->tm_mday,ctime->tm_hour, ctime->tm_min, ctime->tm_sec);va_list s;va_start(s, format);char rightbuffer[SIZE];vsnprintf(rightbuffer, sizeof(rightbuffer), format, s);va_end(s);// 格式:默认部分+自定义部分char logtxt[SIZE * 2];snprintf(logtxt, sizeof(logtxt), "%s %s\n", leftbuffer, rightbuffer);printLog(level, logtxt);}private:int printMethod;std::string path;
};

相关文章:

Linux操作系统--进程间通信(system V共享内存)

目录 1.system V共享内存 2.共享内存数据结构 3.共享内存函数 4.实例代码&#xff1a; 1.system V共享内存 共享内存区是最快的IPC(进程间通信)形式。一旦这样的内存映射到共享它的进程地址空间&#xff0c;这些进程间数据传递不再涉及到内核&#xff0c;换句话说是进程不再…...

力扣HOT100之二叉树:102. 二叉树的层序遍历

这道题太简单了&#xff0c;相当于基础的模板题&#xff0c;但凡涉及到层序遍历一定会用到队列来实现&#xff0c;其他的倒没啥好说的&#xff0c;用两层while循环来层序遍历&#xff0c;外层while循环用于控制访问二叉树的每一层&#xff0c;而内层while循环则负责收割每一层的…...

分布式锁: Redisson 实现分布式锁的原理与技术细节

在分布式系统中&#xff0c;分布式锁是协调多个节点对共享资源访问的核心机制之一。Redis 作为高性能内存数据库&#xff0c;常被用于实现分布式锁&#xff0c;而 Redisson 是 Java 生态中最成熟、功能最丰富的 Redis 客户端之一&#xff0c;其内置的分布式锁实现被广泛应用于生…...

day22-数据结构之 栈队列

一、栈 1.1 栈的基本概念 栈是限定仅在表尾进行插入和删除操作的线性表 栈的特性&#xff1a;先进后出、后进先出 栈顶:允许操作的一端栈底:不允许操作的一端 栈的使用分为入栈&#xff0c;出栈栈分为顺序栈和链式栈 1.2 栈的基本操作 链栈示意图&#xff1a;最好采取头插和头…...

Oracle 批量操作脚本解析:动态执行与分批次删除

一、脚本功能概述 本文分享两段 Oracle PL/SQL 脚本&#xff0c;分别实现动态 SQL 执行和大表分批次删除功能&#xff0c;适用于数据清洗、批量操作优化等场景。通过实际案例演示语法逻辑与使用场景。 二、脚本一&#xff1a;动态 SQL 执行与数据清理 1. 核心逻辑 从临时表t…...

我用 CodeBuddy 开发了一个颜色命名搜索器 —— ColorNameHub 的诞生记

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 在一次整理设计稿配色时&#xff0c;我突然萌生了一个想法&#xff1a;“如果能输入一个颜色代码&#xff0c;就…...

强化学习算法实战:一个例子实现sarsa、dqn、ddqn、qac、a2c、trpo、ppo

简介 在学习强化学习算法&#xff1a;sarsa、dqn、ddqn、qac、a2c、trpo、ppo时&#xff0c;由于有大量数据公式的推导&#xff0c;觉得十分晦涩&#xff0c;且听过就忘记了。 但是当把算法应用于实战时&#xff0c;代码的实现要比数据推导要直观很多。 接下来通过不同的算法实…...

零基础玩转Apache Superset可视化部署

根据官方Quick Start Guide&#xff0c;你可以按照以下步骤进行部署&#xff1a; 1. 确认环境2. 获取代码3. 获取官方最新代码4. 启动服务5. 访问Superset Web界面6. 接入数据源 前提条件&#xff1a; dockerdocker compose 1. 确认环境 安装Docker和Docker Compose 确保你…...

单片机-STM32部分:18、WiFi模组

飞书文档https://x509p6c8to.feishu.cn/wiki/WFmqwImDViDUezkF7ercZuNDnve 一、WiFi模组应用 当设备需要连接网络&#xff0c;实现远程控制&#xff0c;状态监控时&#xff0c;就需要添加通信模组&#xff0c;常见的通信模组WiFi模组、2G模组、4G模组等&#xff1a; 我们的板卡…...

TLS 1.3黑魔法:从协议破解到极致性能调优

一、TLS协议逆向工程实验 1.1 密码学套件破解剧场 实验准备&#xff1a; 靶机&#xff1a;启用TLS 1.2的Nginx服务器 工具集&#xff1a;Wireshark OpenSSL s_client 定制Python脚本 实战攻击复现&#xff1a; # 强制使用弱加密套件连接 openssl s_client -connect exa…...

职业院校物联网安装调试员(工业数智技术)实训解决方案

一、物联网安装调试员 &#xff08;1&#xff09;职业定义&#xff1a; 利用检测仪器和专用工具&#xff0c;安装、配置、调试物联网产品与设备的人员。其工作任务就是要搭建数据互联的信息网络&#xff0c;并通过电子标签将真实的物体上网连接&#xff0c;并通过对各类设备的…...

mongodb用systemctl启动code=killed, signal=ABRT

参照在 Ubuntu 上安装 MongoDB Community Edition - 数据库手册 v8.0 - MongoDB Docs 安装后&#xff0c;sudo systemctl start mongod启动失败。 sudo systemctl status mongod 结果&#xff1a; mongod.service - MongoDB Database ServerLoaded: loaded (/lib/systemd/sys…...

基于51单片机和8X8点阵屏、矩阵按键的匹对消除类小游戏

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、8X8点阵屏2、矩阵按键3、定时器04、定时器1 四、主函数总结 系列文章目录 前言 用的是普中A2开发板&#xff0c;用到板上的8X8LED点阵屏和矩阵按键。 【单片机】STC89C52RC 【频率】12T11.0592MHz 效果查看/操…...

智能呼叫系统中的NLP意图理解:核心技术解析与实战

引言&#xff1a;当AI拿起电话时 在智能客服、电话营销等场景中&#xff0c;智能呼叫系统正以每年23%的增长率重塑人机交互方式。而支撑这一变革的核心技术&#xff0c;正是自然语言处理&#xff08;NLP&#xff09;中的意图理解模块。本文将深入解析意图理解的技术原理&#…...

信号灯和旋钮在接地电阻柜内的作用主要包括以下几个方面

信号灯的作用‌&#xff1a; ‌指示状态‌&#xff1a;信号灯用于指示接地电阻柜的工作状态&#xff0c;如正常运行、故障报警等。通过不同颜色的灯光&#xff08;如红色表示故障&#xff0c;绿色表示正常&#xff09;来提醒操作人员柜子的当前状态&#xff0c;确保及时处理潜…...

MongoDB 应用实战

1. java 原生客户端 引入maven 1 <dependencies> 2 <dependency> 3 <groupId>org.mongodb</groupId> 4 <artifactId>mongodb‐driver‐sync</artifactId> 5 <version>4.1.1</version> 6 </dependency> 7 </depende…...

Java EE初阶——wait 和 notify

1. 线程饥饿 线程饥饿是指一个或多个线程因长期无法获取所需资源&#xff08;如锁&#xff0c;CPU时间等&#xff09;而持续处于等待状态&#xff0c;导致其任务无法推进的现象。 典型场景 优先级抢占&#xff1a; 在支持线程优先级的系统中&#xff0c;高优先级线程可能持续…...

SpringBoot--Bean管理详解

Bean管理 Bean扫描 回顾spring&#xff1a; 在XML配置文件中&#xff0c;可以借助 <context:component-scan base-package "com.lyc"> 或者注解 ComponentScan(basePackages"com.lyc") 再springboot项目中&#xff0c;既没有标签&#xff0c;也…...

python爬虫实战训练

前言&#xff1a;哇&#xff0c;今天终于能访问豆瓣了&#xff0c;前几天爬太多次了&#xff0c;网页都不让我访问了&#xff08;要登录&#xff09;。 先来个小练习试试手吧&#xff01; 爬取豆瓣第一页&#xff08;多页同上篇文章&#xff09;所有电影的排名、电影名称、星…...

探索大型语言模型(LLM)的开源学习路径:mlabonne/llm-course 深度解析

引言:为什么LLM学习需要系统化课程? 近年来,大型语言模型(Large Language Models, LLMs)彻底改变了自然语言处理领域。从GPT系列到Llama、Mistral等开源模型,掌握LLM的开发和应用能力已成为技术人员的核心竞争力。然而,LLM技术栈涵盖从理论基础到工程实践的复杂内容,如…...

IDEA怎么汉化idea中文改回英文版

第一步:点击左上角的File&#xff0c;然后选择Setting 第二步&#xff1a;Setting页面选择 Appearance & Behavior&#xff0c;然后展开System Settings&#xff0c;然后选择 Language and Region&#xff0c;进行修改 我操作的是2024年的版本 File->Settings -> Ap…...

Flutter目录结构介绍、入口、Widget、Center组件、Text组件、MaterialApp组件、Scaffold组件

目录 1. 创建Flutter项目 1.1使用Android Studio创建Flutter项目 1.2 使用命令行创建Flutter项目 2. Flutter项目介绍 2.1所有代码都在lib目录下编写 2.1 pubspec.yaml 依赖库/图片的引用 ​编辑 3. 运行项目 4. 编写mian.dart文件 4.1 使用MaterialApp 和 Scaffold两个组件…...

C++23 中的 ranges::fold_left:范围折叠算法

文章目录 1. **ranges::fold_left 的基本概念**2. **使用示例**示例 1&#xff1a;计算整数范围的和示例 2&#xff1a;计算字符串范围的连接示例 3&#xff1a;使用自定义函数 3. **与其他折叠算法的比较**4. **为什么需要 ranges::fold_left**5. **总结** 随着 C23 的到来&am…...

Vue2项目created不执行

Vue2项目created不执行 设置唯一值 name在 created 调用方法在 watch 中监听路由完整代码示例 设置唯一值 name 在 Vue 组件中&#xff0c;name 属性用于标识组件。确保每个组件的 name 属性是唯一的&#xff0c;这有助于在调试和开发过程中更好地识别组件。 export default …...

mysql的not exists走索引吗

在MySQL中&#xff0c;​NOT EXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引。以下是关键点总结&#xff1a; ​索引的作用​&#xff1a; 当子查询的关联字段&#xff08;例如B.a_id&#xff09;存在索引&#xff08;如普通B-tree索引&#xff09;时&…...

红黑树实现

1.红黑树的概念 红黑树是一棵二叉搜索树&#xff0c;他的每个节点增加一个存储位来表示节点的颜色&#xff0c;可以是红丝或者黑色。通过对任何一条从根到叶子的路径上各个节点的颜色进行约束&#xff0c;红黑树确保没有一条路径会比其他路径长出两倍&#xff0c;因而是接近平…...

将已打包好的aar文件,上传到 Coding 的 Maven 仓库

将已打包好的aar文件&#xff0c;上传到 Coding 的 Maven 仓库。 在android stuio项目的build.gradle 进行上传。 编写代码 plugins {id maven-publish }// 配置要上传的本地 AAR 文件 def aarFile file(D:\\mylibrary-1.0.0.aar)publishing {publications {mavenAar(MavenP…...

海康相机连接测试-极简版

文章目录 1、下载客户端 1、下载客户端 海康机器人官网下载软件 软件下载地址 先下载客户端测试连接 按照你的相机的类型选择客户端 安装完毕后&#xff0c;确保USB线插的是3.0的端口 软件会自动识别相机型号 在上方有播放按钮&#xff0c;可以采集图像信息显示...

深入探索:Core Web Vitals 进阶优化与新兴指标

一、INP&#xff08;Interaction to Next Paint&#xff09;深度解析 INP 与 FID 的核心差异 • 响应范围&#xff1a;FID仅测量首次输入延迟&#xff0c;而INP跟踪页面生命周期中所有关键交互 • 测量维度&#xff1a;INP综合考虑输入延迟、处理时间和下一帧渲染时间 • 评…...

AI与产品架构设计系列(2):Agent系统的应用架构与落地实

什么是AI Agent&#xff1f;其在架构中的独特定位 AI Agent&#xff08;人工智能代理&#xff09;是一种模拟人类智能行为的自主系统&#xff0c;通常以大型语言模型&#xff08;LLM&#xff09;作为核心引擎。简单来说&#xff0c;Agent能够像人一样感知环境信息、规划行动方…...

OpenAI与微软洽谈新融资及IPO,Instagram因TikTok流失四成用户

OpenAI与微软洽谈新融资及IPO 据悉&#xff0c;OpenAI 正与微软洽谈新融资及筹备 IPO&#xff0c;关键问题是微软在 OpenAI 重组后的股权比例。微软已投资超 130 亿美元&#xff0c;双方修订 2019 年合同&#xff0c;微软拟弃部分股权换新技术访问权。OpenAI 上周放弃了有争议转…...

架构篇、第五章_05Jenkins的部署与构建

Linux_架构篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;Jenkins的部署与构建 版本号: 1.0,0 作者: 老王要学习 日期: 2025.05.15 适用环境: Centos7 文档说明 本文档围绕 Jenkins 的部署与构建展开&a…...

`ParameterizedType` 和 `TypeVariable` 的区别

在 Java 的泛型系统中&#xff0c;ParameterizedType 和 TypeVariable 是两个不同的类型表示&#xff0c;它们都属于 java.lang.reflect.Type 接口的子接口。两者都在反射&#xff08;Reflection&#xff09;中用于描述泛型信息&#xff0c;但用途和含义不同。 &#x1f31f; 一…...

HTML 中的 input 标签详解

HTML 中的 input 标签详解 一、基础概念 1. 定义与作用 HTML 中的 <input> 标签是表单元素的核心组件&#xff0c;用于创建各种用户输入字段。作为一个空标签&#xff08;没有闭合标签&#xff09;&#xff0c;它通过 type 属性来决定呈现何种输入控件&#xff0c;是实…...

从 Vue3 回望 Vue2:性能优化内建化——从黑盒优化到可控编译

文章目录 从 Vue3 回望 Vue2&#xff1a;性能优化内建化——从黑盒优化到可控编译1. 引言2. Vue2 的性能优化机制解析3. Vue3 的编译期优化能力拆解3.1 静态提升&#xff08;Static Hoisting&#xff09;3.2 Patch Flag 精确标记3.3 Block Tree &#xff08;块级更新边界&#…...

HOW - React NextJS 的同构机制

文章目录 一、什么是 Next.js 的同构&#xff1f;二、核心目录结构三、关键函数&#xff1a;如何实现不同渲染方式&#xff1f;1. getServerSideProps —— 实现 SSR&#xff08;每次请求动态获取数据&#xff09;2. getStaticProps getStaticPaths —— 实现 SSG&#xff08;…...

电动汽车直流快充充电桩AEV200-DC240M4的详细介绍

电动汽车直流快充充电桩AEV200-DC240M4产品简介 AEV系列为全新一代分体式电动汽车直流恒功率快速充电机。系统内置 30/40kW 恒功率充电模块&#xff0c;最高输出电压1000V&#xff0c;满足各类车辆充电需求。模块采用隔离风道灌胶设 计 &#xff0c;可靠性高 &#xff0c;可应…...

YOLOv7训练时4个类别只出2个类别

正常是4个类别&#xff1a; 但是YOLOv7训练完后预测总是只有两个类别&#xff1a; 而且都是LFM和SFM 我一开始检查了下特征图大小&#xff0c;如果输入是640*640的话&#xff0c;三个尺度特征图是80*80,40*40,20*20&#xff1b;如果输入是416*416的话&#xff0c;三个尺度特征…...

数据赋能(224)——数据与业务协同——数据动态调整原则

概述 数据动态调整原则不仅能帮助组织迅速响应业务需求和技术环境的变化&#xff0c;还能确保数据应用始终与最新的数据处理技术、算法和工具保持同步。通过实施数据动态调整&#xff0c;企业能够更准确地捕捉业务趋势&#xff0c;优化数据质量&#xff0c;以及提高资源利用效…...

Vulfocus靶场-文件上传-3

WSO2 文件上传 &#xff08;CVE-2022-29464&#xff09; WSO2是一家成立于 2005 年的开源技术提供商。它提供了一个企业平台&#xff0c;用于在本地和整个 Internet 上 集成应用程序编程接口(API)、应用程序和 Web 服务。 某些 WSO2 产品允许无限制的文件上传和远程代码执行。…...

(for 循环) VS (LINQ) 性能比拼 ——c#

在大多数情况下&#xff0c;for 循环的原始性能会优于 LINQ&#xff0c;尤其是在处理简单遍历、数据筛选或属性提取等场景时。这是由两者的实现机制和抽象层次决定的。以下是具体分析&#xff1a; 一、for 循环与 LINQ 的性能差异原因 1. 抽象层次与执行机制 for 循环&#…...

自学嵌入式 day19-数据结构 链表

二、线性表的链式存储 1.特点&#xff1a; &#xff08;1&#xff09;线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素&#xff0c;存储单元可以是连续的&#xff0c;也可以不连续。可以被存储在任意内存未被占用的位置上。 &#xff08;2&#xff09;所以…...

一发入魂:极简解决 SwiftUI 复杂视图未能正确刷新的问题(中)

概述 各位似秃非秃小码农们都知道,在 SwiftUI 中视图是状态的函数,这意味着状态的改变会导致界面被刷新。 但是,对于有些复杂布局的 SwiftUI 视图来说,它们的界面并不能直接映射到对应的状态上去。这就会造成一个问题:状态的改变并没有及时的引起 UI 的变化。 如上图所示…...

UI自动化测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、about自动化测试 定义&#xff1a;把人为驱动的测试转化为机器执行的一种过程&#xff0c;重点在于持续集成这个概念&#xff1b; 优势&#xff1a;节约人力…...

数学复习笔记 14

前言 和家里人交流了一下&#xff0c;他们还是希望我全力以赴初试&#xff0c;我确实也得放开了干&#xff0c;不要束手束脚的。好好加油。感觉公共课都没有啥压力&#xff0c;主要是专业课要好好加油&#xff0c;真不能过不了线&#xff0c;要是过不了线&#xff0c;啥都白搭…...

单元化架构

目录 ​​​​​​​​编辑 单元化 逻辑单元 单元化 多地多机房部署&#xff0c;是互联网系统的必然发展方向&#xff0c;一个系统要走到这一步&#xff0c;也就必然要解决上面提到的问题&#xff1a;流量调配、数据拆分、延时等。业界有很多技术方案可以用来解决这些问题&…...

硬件厂商的MIB文档详解 | 如何查询OID? | MIB Browser实战指南-优雅草卓伊凡

硬件厂商的MIB文档详解 | 如何查询OID? | MIB Browser实战指南-优雅草卓伊凡 一、硬件厂商的MIB文档是什么&#xff1f; 1. MIB的本质&#xff1a;设备的”数据字典” MIB&#xff08;Management Information Base&#xff09; 是SNMP协议的核心数据库&#xff0c;定义了设备…...

遥感图像露天矿区检测数据集VOC+YOLO格式1542张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1542 标注数量(xml文件个数)&#xff1a;1542 标注数量(txt文件个数)&#xff1a;1542 …...

【python基础知识】Day 27 函数专题2:装饰器

知识点&#xff1a; 装饰器的思想&#xff1a;进一步复用函数的装饰器写法注意内部函数的返回值 装饰器教程 作业&#xff1a; 编写一个装饰器 logger&#xff0c;在函数执行前后打印日志信息&#xff08;如函数名、参数、返回值&#xff09; def logger(func):def wrapper(*ar…...

游戏站的几种形式

游戏站点的主要形式&#xff1a;单品游戏站、游戏盒子站与单类型游戏盒子站 随着互联网的普及和游戏产业的快速发展&#xff0c;游戏站点作为玩家获取游戏资源和信息的重要平台&#xff0c;呈现出多种形式。本文将分析三种常见的游戏站点形式&#xff1a;单品游戏站、游戏盒子站…...