共享内存【Linux操作系统】
文章目录
- 共享内存
- 共享内存的原理
- 共享内存相关函数和系统调用--systemV
- 系统调用:shmget
- 系统调用:shmctl
- 系统调用:shmat
- 系统调用:shmdt
- 系统调用:ftok
- 共享内存相关函数和系统调用--POSIX
- shm_open-- 创建或打开共享内存对象
- ftruncate - 设置共享内存大小
- mmap - 内存映射
- munmap - 解除内存映射
- shm_unlink - 删除共享内存对象
- close-关闭文件描述符
- 完整使用流程
- 创建/写入进程
- 读取进程
- 常见错误处理
- 深刻理解共享内存
- 用户设置的key冲突了怎么办?
- 共享内存的生命周期
- 共享内存的key和shmid的区别
- 操作系统对物理内存进行任何操作时,都是以固定大小(一般是4kb)为基本单位进行操作的
- 共享内存的特点
- 共享内存是最快的进程间通信的形式了
- 使用共享内存需要我们自己进行同步互斥
共享内存
共享内存的原理
就是使用系统调用开辟一块物理内存,这块物理内存就是共享内存
然后把它的起始地址通过进程的页表,与要通信的进程的共享区建立映射关系
最后,一个进程向自己的共享区中的共享内存读,一个进程向自己的共享区中的共享内存写,就可以实现进程间通信了
以后不再使用共享内存时,就直接把进程页表里面的映射关系去掉,也就是去关联
再把struct vm_area_struct
链表里面的节点释放
至于共享内存,它的生命周期随内核
,即如果用户不使用系统调用释放它,直到操作系统关机之前它会一直存在
共享内存可以同时在物理内存中存在很多份
而且某一个共享内存正在被那些进程使用,某个共享内存什么时候释放等等问题
操作系统都要知道
所以操作系统也要对所有的共享内存进行管理
所以要对共享内存,先描述再组织
所以
共享内存=共享内存的内核数据结构+共享内存对应的物理内存块
共享内存相关函数和系统调用–systemV
系统调用:shmget
头文件:sys/ipc.h
和sys/shm.h
返回值:
①成功就返回一个共享内存标识符[shmid
]
②失败返回-1
参数:
①key_t key:唯一标识共享内存
②size_t size:共享内存的大小
③int shmflag:int类型的位图标志位
-
.
IPC_CREAT
:单独使用的话如果对应的共享内存不存在,就创建。存在就返回shmid
该选项主要给获取共享内存的进程使用 -
IPC_EXCL
:不能单独使用
但是
IPC_CREAT | IPC_EXCL
:
如果对应的共享内存不存在,就创建并在页表建立映射关系
存在就报错
该选项主要给创建共享内存的进程使用
3.共享内存的权限,也是rwx,用4个8进制位表示(例:0666)
共享内存创建的时候必须指定权限!!!
不然直接报错,根本用不了
作用:创建一块共享内存
系统调用:shmctl
头文件:sys/shm.h和sys/ipc.h
返回值:
①成功,返回共享内存的key
②失败,返回-1
参数表:
①int shmid:共享内存描述符
②int cmd:位图标志位
IPC_RMID:释放共享内存
③struct shmid_ds*bf:输出型参数,可以把共享内存的相关属性带出来
作用:
根据cmd标志位的不同,对共享内存进行不同操作
系统调用:shmat
头文件:sys/shm.h和sys/types.h
返回值:void*
①成功,返回共享内存的起始地址(类似malloc的返回值)
②失败,返回(viod*)-1
参数表:
①int shmid:共享内存描述符
②const void*shmaddr:用户指定的虚拟起始地址[不过我们一般不用,所有一般是nullptr
]
③int shmflag:位图标志位,表示共享内存的读写等权限(我们一般也不管,因为共享内存基本是用来通信的,所以设置成0就行
)
作用:
把指定的共享内存挂接到进程地址空间中
系统调用:shmdt
头文件:sys/shm.h和sys/types.h
返回值:int
①成功,
②失败,返回-1
参数表:
const void *shmaddr:共享内存的虚拟起始地址(也就是shmat的返回值)
作用:
把共享内存从当前进程的共享区中去掉,也就是去除页表映射
系统调用:ftok
头文件:sys/types.h和sys/ipc.h
返回值:
①成功,返回共享内存的key
②失败,返回-1
参数表:
①cosnt char*name:带路径的项目文件名
②int id:项目id
参数①和参数②都是用户自己随便设置
作用:使用参数1和参数2并结合一定算法,求出一个key返回
共享内存相关函数和系统调用–POSIX
相较于传统的 System V 共享内存,POSIX 共享内存接口更简洁且符合现代编程习惯
而且,POSIX 共享内存是基于文件描述符的
shm_open-- 创建或打开共享内存对象
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>int shm_open(const char *name, int oflag, mode_t mode);
- 作用:创建或打开一个共享内存对象(类似文件操作)
- 参数:
name
:共享内存对象名称,必须以/
开头(如/my_shm
)oflag
:标志位
如O_CREAT | O_RDWR
:如果对应的共享内存不存在,就创建。存在就返回shmid
O_RDONLY
:获取共享内存mode
:权限位(如0666
)
- 返回值:成功返回文件描述符(fd),失败返回
-1
- 示例:
int fd = shm_open("/my_shm", O_CREAT | O_RDWR, 0666); 创建共享内存
ftruncate - 设置共享内存大小
#include <unistd.h>int ftruncate(int fd, off_t length);
- 作用:调整共享内存对象的大小(必须调用,否则无法映射)
- 参数:
fd
:shm_open
返回的文件描述符length
:共享内存大小(字节)
mmap - 内存映射
#include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
- 作用:将共享内存映射到进程的虚拟地址空间
- 参数:
addr
:映射起始地址(通常设为NULL
,由内核选择)length
:映射长度(应与ftruncate
设置的一致)prot
:保护模式(如PROT_READ | PROT_WRITE
)flags
:映射标志(MAP_SHARED
用于共享内存)fd
:shm_open
返回的文件描述符offset
:偏移量(通常为0
)
- 返回值:成功返回映射后的内存地址,失败返回
MAP_FAILED
- 示例:
char *ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
munmap - 解除内存映射
#include <sys/mman.h>int munmap(void *addr, size_t length);
- 作用:解除内存映射,释放进程内的虚拟内存关联
- 参数:
addr
:mmap
返回的地址length
:映射长度
shm_unlink - 删除共享内存对象
#include <sys/mman.h>int shm_unlink(const char *name);
- 作用:删除共享内存对象(类似
unlink
文件) - 参数:
name
:共享内存对象名称(与shm_open
一致)
- 示例:
shm_unlink("/my_shm");
close-关闭文件描述符
#include <unistd.h>int close(int fd);
- 作用:关闭
shm_open
返回的文件描述符(解除进程与共享内存的关联)。 - 示例:
close(fd);
完整使用流程
创建/写入进程
#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main() {// 1. 创建共享内存对象int fd = shm_open("/my_shm", O_CREAT | O_RDWR, 0666);if (fd == -1) { perror("shm_open"); return 1; }// 2. 设置共享内存大小if (ftruncate(fd, 4096) { perror("ftruncate"); return 1; }// 3. 映射到进程地址空间char *ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);if (ptr == MAP_FAILED) { perror("mmap"); return 1; }// 4. 写入数据strcpy(ptr, "Hello from Process A!");// 5. 解除映射(可选,进程退出时自动解除)munmap(ptr, 4096);close(fd);return 0;
}
读取进程
#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>int main() {// 1. 打开共享内存对象int fd = shm_open("/my_shm", O_RDONLY, 0);if (fd == -1) { perror("shm_open"); return 1; }// 2. 映射到进程地址空间char *ptr = mmap(NULL, 4096, PROT_READ, MAP_SHARED, fd, 0);if (ptr == MAP_FAILED) { perror("mmap"); return 1; }// 3. 读取数据printf("Received: %s\n", ptr);// 4. 清理资源munmap(ptr, 4096);close(fd);shm_unlink("/my_shm"); // 由最后一个使用进程删除return 0;
}
常见错误处理
错误场景 | 处理方法 |
---|---|
shm_open 失败 | 检查名称格式(是否以 / 开头)、权限是否足够 |
ftruncate 失败 | 确保文件描述符有效且有写入权限 |
mmap 失败 | 检查 length 是否与 ftruncate 设置一致 |
深刻理解共享内存
共享内存和命名管道一样,需要一个进程使用系统调用先行创建
共享内存也有和文件一样有拥有者所属组rwx权限,而且也是使用3个8进制表示
共享内存如果不指定权限,创建之后默认权限为000,即啥都干不了
systemV共享内存的key是由用户自己提供的
为什么要用户提供key,而不是内核自己维护?
因为物理内存中的共享内存不止一块
假设物理内存中一共3块共享内存,分别为共享内存1,2,3
进程A又创建了一块共享内存,是共享内存4
但是进程B想和进程A通信,进程B调用shmget的时候,得先知道进程A创建的共享内存是哪一块呀!是共享内存1,2还是3?
所以只能通过共享头文件把key告诉进程B
由操作系统自己维护的话,进程B调用shmget的时候,操作系统怎么知道该给进程B那块共享内存?
更何况要与它通信的进程可能都还没创建出来
为什用户提供的key,两个要通信的进程都能看到呢?
因为用户是通过:
①创建一个共享头文件,在两个进程编译之前,就在头文件里面定义了项目路径和项目id
②要通信的进程只需要在编译链接的时候都包含头文件,就可以看到相同的项目路径和项目id,运行的时候传给ftok就可以获得同一个key了
用户设置的key冲突了怎么办?
如果与已经存在的共享内存的key冲突了
就只能由程序员自己手动修改源代码
但是
用户设置的key一般也不是随便设置的
而是通过ftok函数生成,所以冲突的概率其实很低
如果使用ftok函数生成的key还冲突了,就只能由用户手动修改共享头文件中保存的项目id或者项目路径了
共享内存的生命周期
共享内存的生命周期随内核,即如果用户不使用系统调用释放它,直到操作系统关机之前它会一直存在
所以进程使用系统调用创建了共享内存,就必须再使用系统调用释放共享内存
不然就会内存泄露
共享内存的key和shmid的区别
①shmid:是只给用户[用户的进程]操作共享内存提供的唯一标识符
②key:是只给操作系统内核操作共享内存的唯一标识符
操作系统对物理内存进行任何操作时,都是以固定大小(一般是4kb)为基本单位进行操作的
如果用户申请的物理内存不是4kb的整数倍(比如用户申请了5kb),那么操作系统依然会以4kb的整数倍给用户(即给用户8kb的物理内存)但是会以类似权限的方式,让用户看不到,用不了那多出来的空间(即用户确实只能使用8-3=5kb的空间
)
因为操作系统不想背锅,用户让操作系统干嘛操作系统就干嘛
共享内存的特点
共享内存是最快的进程间通信的形式了
-
因为一旦共享内存区形成,进程使用共享内存就和使用自己进程地址空间的堆区内存一样了
不再涉及操作系统内核,也就是进程通信时,不需要使用系统调用 -
因为拷贝次数少
管道通信时,从外设来的数据要拷贝到进程的地址空间中
要使用write把用户进程地址空间(栈区/堆区等)中的数据拷贝到内核文件缓冲区
再使用read拷贝到进程B的进程地址空间中,再拷贝到外设
需要4次拷贝
而共享内存通信
只需要把外设来的数据拷贝到共享区中的共享内存,进程B就直接可以通过页表看见这个数据了,不需要再拷贝了
最后再拷贝到外设
只需要2次拷贝
使用共享内存需要我们自己进行同步互斥
通过共享内存的原理我们可以知道
共享内存是真正地让两个进程共用同一份资源(内存块),并且它没有对共享内存做任何类似管道的保护机制
要对共享内存中的共享资源进行保护,就会有数据不一致问题
得由用户(进程)自己手动保护[利用信号量,条件变量]
相关文章:
共享内存【Linux操作系统】
文章目录 共享内存共享内存的原理共享内存相关函数和系统调用--systemV系统调用:shmget系统调用:shmctl系统调用:shmat系统调用:shmdt系统调用:ftok 共享内存相关函数和系统调用--POSIXshm_open-- 创建或打开共享内存对…...
Android核心系统服务:AMS、WMS、PMS 与 system_server 进程解析
1. 引言 在 Android 系统中,ActivityManagerService (AMS)、WindowManagerService (WMS) 和 PackageManagerService (PMS) 是三个最核心的系统服务,它们分别管理着应用的生命周期、窗口显示和应用包管理。 但你是否知道,这些服务并不是独立…...
arduino平台读取鼠标光电传感器
鼠标坏掉了,大抵是修不好了。(全剧终—) 但是爱动手的小明不会浪费这个鼠标,确认外观没有明显烧毁痕迹后,尝试从电路板上利用光电传感器进行位移的测量,光电传感器(型号:FCT3065&am…...
EXO分布式部署deepseek r1
EXO 是一个支持分布式 AI 计算的框架,可以用于在多个设备(包括 Mac Studio)上运行大语言模型(LLM)。以下是联调 Mac Studio 512GB 的步骤: 安装 EXO • 从 EXO GitHub 仓库 下载源码或使用 git clone 获取…...
机器学习 KNN算法
KNN算法 1. sklearn机器学习概述2. KNN算法-分类1 样本距离判断2 KNN 算法原理3 KNN缺点4 API5 sklearn 实现KNN示例6 模型保存与加载葡萄酒(load_wine)数据集KNN算法(1)wine.feature_names:(2)wine.target_names(3)KNN算法实现 1. sklearn机器学习概述 获取数据、数据处理、特…...
强化学习赋能医疗大模型:构建闭环检索-反馈-优化系统提升推理能力
引言 人工智能技术在医疗领域的应用正经历前所未有的发展,特别是在大型语言模型(LLMs)技术的推动下,医疗大模型(Medical Large Models)展现出巨大的潜力。这些模型不仅能够理解复杂的医学术语和概念,还能通过自然语言与用户交互,为医疗专业人士和患者提供有价值的信息和建…...
深入解析Spring Boot与JUnit 5的集成测试实践
深入解析Spring Boot与JUnit 5的集成测试实践 引言 在现代软件开发中,测试是确保代码质量和功能正确性的关键环节。Spring Boot作为目前最流行的Java Web框架之一,提供了强大的支持来简化测试流程。而JUnit 5作为最新的JUnit版本,引入了许多…...
哈希的原理、实现
目录 引言 一、哈希概念 二、哈希函数 三、哈希冲突解决方法 四、unordered系列关联式容器(以unordered_map为例) 五、哈希的应用 完整代码 六、总结 引言 在计算机科学领域,哈希是一种非常重要的数据结构和算法思想,广…...
端口443在git bash向github推送时的步骤
端口443在git bash向github推送时的步骤 你的环境可能因防火墙限制无法使用默认的 SSH 端口(22),因此需要改用 SSH over HTTPS(端口 443) 进行 Git 推送。 github与git bash绑定问题详见博主先前写过的参考博文&#…...
Ankr:Web3基础设施的革新者
在Web3技术蓬勃发展的今天,去中心化基础设施的重要性日益凸显。Ankr作为这一领域的佼佼者,凭借其强大的分布式云计算能力和创新的技术解决方案,正在成为推动Web3发展的关键力量。本文将深入探讨Ankr的技术亮点、应用场景以及其在区块链生态中…...
配置git从公网能访问-基于frp
git从公网能访问 一个小小的疏忽带来了一下午上午的工作量起因与上下文与结论主要收获1。公网主机的防火墙需要至少三条3。gitlab的http端口和ssh端口,需要分为两个3。不要用nginx来解析二级域名 测试指令最终的成功的指令是: 用到的指令ssh1. 生成 SSH …...
HarmonyOS:重构万物互联时代的操作系统范式
HarmonyOS:重构万物互联时代的操作系统范式 引言:操作系统的新纪元 在数字化转型的深水区,操作系统作为数字世界的基石正在经历前所未有的变革。当全球科技巨头还在移动终端操作系统领域激烈角逐时,华为推出的HarmonyOS以分布式…...
告别“知识孤岛”:RAG赋能网络安全运营
一、背景 在网络安全运营工作中,我们积累了大量的内部知识内容,涵盖了威胁情报、事件响应流程、安全策略、合规性要求等多个方面。然而,这些知识虽然数量庞大、内容丰富,却因形式多样、结构分散,难以让每一位成员真正…...
A级、B级弱电机房数据中心建设运营汇报方案
该方案围绕A 级、B 级弱电机房数据中心建设与运营展开,依据《数据中心设计规范》等标准,施工范围涵盖 10 类机房及配套设施,采用专业化施工团队与物资调配体系,强调标签规范、线缆隐藏等细节管理。运营阶段建立三方协同运维模式,针对三级故障制定30 分钟至 1 小时响应机制…...
C 语言学习笔记(数组)
C 语言基础:第 08天笔记 内容提要 数组 排序算法:冒泡排序二维数组字符数组 数组 冒泡排序 排序思想(向前冒泡): 一次排好一个数,针对n个数,最差情况需要n - 1次就可以排好每次排序假定第一…...
jvm安全点(二)openjdk17 c++源码垃圾回收安全点信号函数处理线程阻塞
1. 信号处理与桩代码(Stub) 当线程访问安全点轮询页(Polling Page)时: 触发 SIGSEGV 信号:访问只读的轮询页会引发 SIGSEGV 异常。信号处理函数:pd_hotspot_signal_handl…...
uni-app 开发HarmonyOS的鸿蒙影视项目分享:从实战案例到开源后台
最近,HBuilderX 新版本发布,带来了令人兴奋的消息——uni-app 现在支持 Harmony Next 平台的 App 开发。这对于开发者来说无疑是一个巨大的福音,意味着使用熟悉的 Vue 3 语法和开发框架,就可以为鸿蒙生态贡献自己的力量。 前言 作…...
【赵渝强老师】在PostgreSQL中访问Oracle
在PostgreSQL数据库中,oracle_fdw是PostgreSQL数据库支持的外部扩展。通过使用oracle_fdw扩展可以读取到Oracle数据库中的数据。它是一种非常方便且常见的PostgreSQL与Oracle的同步数据的方法。使用oracle_fdw扩展需要依赖Oracle的Instance Client环境。 视频讲解如…...
板凳-------Mysql cookbook学习 (二)
生成一个包含cookbook数据库中的表备份的名为backup.sql的dump文件。 sql C:\Users\lenovo>mysqldump -u root -p --default-character-setutf8mb4 cookbook > D:\sql\Mysql_learning\backup.sql mysqldump 不是内部或外部命令,也不是可运行的程序 或批处理文…...
sudo apt update是什么意思呢?
非常好的问题! ✅ sudo apt update 是什么意思? 它的作用是: 更新你的 Ubuntu 系统中软件列表的信息(但不安装软件) 就像你每天先去超市了解今天上架了哪些新商品(只是“查看”而不是“买”)&a…...
.NET Core 中 Swagger 配置详解:常用配置与实战技巧
随着微服务架构和 RESTful API 的广泛应用,API 文档的管理和自动化生成成为了开发中的重要部分。Swagger(现为 OpenAPI)是一款功能强大的工具,它可以自动生成 API 文档,并提供交互式 UI,帮助开发者、测试人…...
spring cache使用指南
Spring cache Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。 Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现。 例如:EHCache,Caffeine,Redi…...
9.DMA
目录 DMA —为 CPU 减负 DMA 的简介和使用场景 DMA 的例子讲解 STM32 的 DMA 框图和主要特性 编辑 DMA 的通道的对应通道外设 – DMA 和哪些外设使用 编辑编辑ADC_DR 寄存器地址的计算 常见的数据滤波方法 ADCDMA 的编程 DMA —为 CPU 减负 DMA 的简介和使用场…...
Python自学笔记3 常见运算符
常用运算符 加减法 python的自动数据类型转换 整形转为浮点型 实数转为复数 数字类型不能和浮点数类型相加减 乘除法 数据转换基本同加减法, 但字符串可以和整数相加减,作用是字符串的自我复制 反斜杠 成员运算符 判断一个元素是不是一个序列的成员…...
【C/C++】C++中constexpr与const的深度对比
文章目录 C中constexpr与const的深度对比1. 编译期确定性2. 更严格的优化保证3. 适用范围更广4. 类型安全与错误检查5. 现代 C 的演进方向何时使用 const?constexpr应用场景1. 配置常量与全局参数2. 数据验证与业务规则检查3. 数学计算与业务逻辑优化4. 模板元编程与…...
劳特巴赫trace32负载率测试
按照下图步骤点击即可...
牛客OJ在线编程常见输入输出练习--Java版
目录 一、链接 二、题目 一、链接 牛客输入输出链接:牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网 二、题目 1.只有输出 public class Main {public static void main(String[] args) {System.out.println("H…...
STM32 | FreeRTOS 递归信号量
递归信号量 一、概述 互斥量的使用比较单一,因为它是信号量的一种,并且它是以锁的形式存在。在初始化的时候,互斥量处于开锁的状态,而被任务持有的时候则立刻转为闭锁的状态。 递归类型的互斥量可以被拥有者重复获取。拥有互斥量…...
STM32 | 软件定时器
01 一、概述 软件定时器是用程序模拟出来的定时器,可以由一个硬件定时器模拟出成千上万个软件定时器,这样程序在需要使用较多定时器的时候就不会受限于硬件资源的不足,这是软件定时器的一个优点,即数量不受限制。但由于软件定…...
2025年EB SCI2区TOP,多策略改进黑翅鸢算法MBKA+空调系统RC参数辨识与负载聚合分析,深度解析+性能实测
目录 1.摘要2.黑翅鸢优化算法BKA原理3.改进策略4.结果展示5.参考文献6.代码获取7.读者交流 1.摘要 随着空调负载在电力系统中所占比例的不断上升,其作为需求响应资源的潜力日益凸显。然而,由于建筑环境和用户行为的变化,空调负载具有异质性和…...
互联网大厂Java面试:从Spring到微服务的全面探讨
文章简述 本文模拟了一个互联网大厂Java求职者的面试场景,涵盖了Java核心语言与平台、构建工具、Web框架、微服务与云原生等多个技术栈。通过面试问答的形式,展示了在真实业务场景下如何应用这些技术点,帮助初学者理解和学习。 场景介绍 在…...
Python爬虫之路(14)--playwright浏览器自动化
playwright 前言 你有没有在用 Selenium 抓网页的时候,体验过那种「明明点了按钮,它却装死不动」的痛苦?或者那种「刚加载完页面,它又刷新了」的抓狂?别担心,你不是一个人——那是 Selenium 在和现代前…...
Elasticsearch Fetch阶段面试题
Elasticsearch Fetch阶段面试题 🚀 目录 基础原理性能优化错误排查场景设计底层机制总结基础原理 🔍 面试题1:基础原理 题目: 请描述Elasticsearch分布式搜索中Query阶段和Fetch阶段的工作流程,为什么需要将搜索过程拆分为这两个阶段? 👉 点击查看答案 查询流程…...
RAGFlow Arbitrary Account Takeover Vulnerability
文章目录 RAGFlowVulnerability Description[1]Vulnerability Steps[2]Vulnerability Steps[3]Vulnerability Steps RAGFlow RAGFlow is an open-source RAG (Retrieval-Augmented Generation) engine developed by Infiniflow, focused on deep document understanding and d…...
框架之下再看HTTP请求对接后端method
在当今的软件开发领域,各类框架涌现,极大地提升了开发效率。以 Java 开发为例,Spring 框架不断演进,Spring Boot 更是简化到只需引入 Maven 包,添加诸如SpringBootApplication、RestController等注解,就能轻…...
机器学习中的过拟合及示例
文章目录 机器学习中的过拟合及示例1. 过拟合的定义2. 过拟合的常见例子例1:图像分类中的过拟合例2:回归任务中的过拟合例3:自然语言处理(NLP)中的过拟合 3. Python代码示例:过拟合的直观演示示例1…...
机器学习-人与机器生数据的区分模型测试 -数据筛选
内容继续机器学习-人与机器生数据的区分模型测试 使用随机森林的弱学习树来筛选相对稳定的特征数据 # 随机森林筛选特征 X data.drop([city, target], axis1) # 去除修改前的城市名称列和目标变量列 y data[target] X_train, X_test, y_train, y_test train_test_split(X…...
第9讲、深入理解Scaled Dot-Product Attention
Scaled Dot-Product Attention是Transformer架构的核心组件,也是现代深度学习中最重要的注意力机制之一。本文将从原理、实现和应用三个方面深入剖析这一机制。 1. 基本原理 Scaled Dot-Product Attention的本质是一种加权求和机制,通过计算查询(Query…...
无监督学习在医疗AI领域的前沿:多模态整合、疾病亚型发现与异常检测
引言 人工智能技术在医疗领域的应用正经历着从辅助决策向深度赋能的转变。无监督学习作为人工智能的核心范式之一,因其无需大量标注数据、能够自动发现数据内在规律的特性,在医疗AI领域展现出独特优势。尤其在2025年,无监督学习技术在医疗AI应用中呈现出多模态整合、疾病亚…...
PostgreSQL内幕剖析——结构与架构
大家好,这里是失踪人口bang__bang_,从今天开始持续更新PostgreSQL内幕相关内容,让我们一起了解学习吧✊! 目录 1️⃣ DB集群、数据库、表 🍙 数据库集群的逻辑结构 🍙 数据库集群的物理结构 &am…...
架构师论文《论模型驱动架构软件开发方法及其应用》
摘要 在当前的软件开发领域,模型驱动架构(MDA)作为一种重要的开发方法,强调通过抽象化模型指导系统设计与实现,能够有效提升开发效率并降低复杂性。本文结合笔者参与的某医疗信息管理系统的开发实践,探讨MD…...
当硅基存在成为人性延伸的注脚:论情感科技重构社会联结的可能性
在东京大学机器人实验室的档案室里,保存着一份泛黄的二战时期设计图——1943年日本陆军省秘密研发的“慰安妇替代品”草图。这个诞生于战争阴霾的金属躯体,与2025年上海进博会上展出的MetaBox AI伴侣形成时空对话:当人类将情感需求投射于硅基…...
最小二乘法拟合直线,用线性回归法、梯度下降法实现
参考笔记: 最小二乘法拟合直线,多个方法实现-CSDN博客 一文让你彻底搞懂最小二乘法(超详细推导)-CSDN博客 目录 1.问题引入 2.线性回归法 2.1 模型假设 2.2 定义误差函数 2.3 求偏导并解方程 2.4 案例实例 2.4.1 手工计算…...
机器学习 day04
文章目录 前言一、线性回归的基本概念二、损失函数三、最小二乘法 前言 通过今天的学习,我掌握了机器学习中的线性回归的相关基本概念,包括损失函数的概念,最小二乘法的理论与算法实现。 一、线性回归的基本概念 要理解什么是线性回归&…...
数据分析_Python
1 分析内容 1.1 数据的整体概述 提供数据集的基本信息,包括数据量、时间跨度、地理范围和主要字段. import pandas as pd# 创建示例数据 data {姓名: [张三, 李四, 王五, 赵六, 钱七, 孙八, 周九, 吴十],年龄: [25, 30, 35, 40, 45, 50, 55, 60],性别: [男, 男, 女, 女, 男,…...
精益数据分析(63/126):移情阶段的深度潜入——从用户生活到产品渗透的全链路解析
精益数据分析(63/126):移情阶段的深度潜入——从用户生活到产品渗透的全链路解析 在创业的移情阶段,成功的关键不仅在于发现用户的表面需求,更在于深入潜入用户的日常生活,理解其行为背后的真实动机与场景…...
【MySQL】第五弹——表的CRUD进阶(三)聚合查询(上)
文章目录 🌅聚合函数🌊1.COUNT();统计所有行🌊2. SUM(列名); 求和🌊3. AVG() 求平均🌊4. MAX(),MIIN() 🌅分组查询🌊GROUP BY 子句🌊HAVING 🌅联合查询🌊联合…...
英语学习5.16
recede 【动词】 👉 关键词:后退、减弱、退去 ✅ 释义: 后退,远离 指物体逐渐远离、移开或变得不明显,常用于描述水面、声音、军队、头发线等的“退却”或“后移”。 如:The floodwaters receded.&#x…...
创建react工程并集成tailwindcss
1. 创建工程 npm create vite admin --template react 2.集成tailwndcss 打开官网跟着操作一下就行。 Installing Tailwind CSS with Vite - Tailwind CSS...
2025 年九江市第二十三届中职学校技能大赛 (网络安全)赛项竞赛样题
2025 年九江市第二十三届中职学校技能大赛 (网络安全)赛项竞赛样题 (二)A 模块基础设施设置/安全加固(200 分)A-1 任务一登录安全加固(Windows,Linux)A-2 任务二 Nginx 安全策略&…...