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

Linux系统编程 | IPC对象---信号量

        在前面两篇博客文章中,对Linux系统编程部分IPC三大对象中的消息队列共享内存的知识体系做了一个大致的梳理,在本篇文章中,将对三大IPC对象中的最后一个信号量做一个总结。如果有需要的博客朋友,可以参考我的Linux系统编程专栏参考交流学习。

系统编程_奔跑的蜗牛!的博客-CSDN博客https://blog.csdn.net/weixin_49337111/category_12952742.html


1、IPC信号量

(1)、基本概念

        信号量SEM全称Semaphore,中文也翻译为信号灯。信号量跟消息队列共享内存有极大的不同,SEM不是用来传输数据的,而是作为“旗语”,用来协调各进程或者线程工作的。信号量本质上是一个数字,用来表征一种资源的数量,当多个进程或者线程争夺这些稀缺资源的时候,信号量用来保证他们合理地、秩序地使用这些资源,而不会陷入逻辑谬误之中。

        信号量也是属于IPC对象,所以使用信号量之前必须先申请key值。信号量不是用于进程之间的数据通信,但是作用于进程之间的通信,起辅助作用。

(2)、红绿灯

        在一个繁忙的十字路口中,路口的通过权就是稀缺资源,并且是排他的,南北向的车辆用了,东西向的车辆就不能使用,就是通过十字路口的权限,为了避免撞车,一个方向通行时另外方向的车必须停下来等待,直到红绿灯变换为止。这就是最基本的资源协同。

(3)、PV操作

        对于信号量而言,最重要的作用就是用来表征对应资源的数量,所谓的P/V操作就是对资源数量进行 -n/+n 操作,既然只是个加减法,那么为什么不使用普通的整型数据呢?原因是:

        ①、整型数据的加减操作不具有原子性,即操作可能被中断

        ②、普通加减法无法提供阻塞特性,而申请资源不可得时应进入阻塞

        对于原子性再做个简单的解释,即这种资源数量的加减法不能有中间过程,不管是成功还是失败都必须一次性完成。加减法看似简单,但在硬件层面上并非一个原子性操作,而是包含了多个寄存器操作步骤,因此不能作为P/V操作的手段。

        临界资源:多个进程或线程有可能同时访问的资源(共享的资源)(变量、链表、文件等等)。

        临界区:访问这些临界资源的代码称为临界代码,这些代码区域称为临界区

        P操作:程序进入临界区之前必须要对资源进行申请,这个动作被称为P操作,这就像你要把车开进停车场之前,先要向保安申请一张停车卡一样,P操作就是申请资源,如果申请成功,资源数将会减少。如果申请失败,要不在门口等,要不走人。(P --> 申请资源 --> 资源量减少)

        V操作:程序离开临界区之后必须要释放相应的资源,这个动作被称为V操作,这就像你把车开出停车场之后,要将停车卡归还给保安一样,V操作就是释放资源,释放资源就是让资源数增加。(V --> 释放资源 --> 资源量增加)

2、信号量API接口

(1)、ftok

//函数原型
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);//函数功能
​​生成一个唯一的 key 值​​,用于标识 IPC 资源//函数参数
pathname:一个已经存在的文件路径,用于计算 key 值
proj_id:​​项目 ID,用于区分不同的 IPC 资源//函数返回值
成功返回key值
失败返回-1,并设置errno

(2)、semget

//函数原型
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);//函数功能:
用于获取一个信号量集的标识符//函数参数:
key:SEM对象键值
nsems:信号量组内的信号量元素个数
semflg:创建选项IPC_CREAT:如果key对应的信号量不存在,则创建之IPC_EXCL:如果该key对应的信号量已存在,则报错mode:信号量的访问权限(八进制,如0644)//函数返回值成功时,semget 返回一个信号量集的标识符;失败时,它返回 -1 并设置 errno 以指示错误类型。

(3)、semctl

//函数原型
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semctl(int semid, int semnum, int cmd, ...);//函数功能:
用于对信号量集执行多种控制操作。它提供了一种方式来设置或获取信号量的值、删除信号量集、获取信号量集的状态等。//函数参数
semid:信号量ID
semnum:需要操作的成员的下标   空间:0  数据:1
cmd:要执行的控制命令。SETVAL  -> 用于设置信号量的起始值IPC_RMID -> 删除信号量的ID
...:空间/数据的起始值//函数返回值如果调用失败,semctl 返回 -1,并设置 errno 表示错误原因。

(4)、semop与semtimedop

//函数原型
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>int semop(int semid, struct sembuf *sops, size_t nsops);
int semtimedop(int semid, struct sembuf *sops, size_t nsops,const struct timespec *timeout);
//函数功能:
用于执行信号量操作的系统调用,允许进程对信号量执行等待(P操作,也称为down或wait)和信号(V操作,也称为up或signal)操作,以实现进程间的同步。    //函数参数:
semid: 信号量集的标识符。
sops: 指向一个或多个 sembuf 结构体数组的指针,每个结构体描述了一个要执行的操作。
nsops: sops 数组中的元素数量。       
timeout:指向一个 timespec 结构体,定义了操作的时间限制。//函数区别:
semtimedop 允许你指定一个超时时间,这对于不想无限期等待某个信号量可用的情况非常有用。
如果在指定的时间内没有获取到信号量,semtimedop将返回-1 并设置errno为EAGAIN。
这使得semtimedop比semop更加灵活,特别是在需要考虑性能和响应时间的应用场景中。

3、程序应用举例

        运用信号量的知识,将共享内存之间数据读写进行完善。

(1)、共享内存+信号量实现写数据通信

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>int main(int argc, char **argv)
{printf("共享内存+信号量写数据进程\n");//1、获取key值key_t key = ftok(".", 10);//2、根据key值 获取共享内存的ID号int shmid = shmget(key, 1024, IPC_CREAT|0666);//3、根据ID号 将共享内存映射至本进程虚拟内存空间的某个区域char*shm_p = shmat(shmid, NULL, 0);if(shm_p == (void*)-1){perror("shmat error");return -1;}//4、获取信号量的key值key_t key1 = ftok(".", 20);//5、根据key值申请信号量ID号int semid = semget(key1, 2, IPC_CREAT|0666);//6、初始化信号量起始值semctl(semid, 0, SETVAL, 1);//设置空间的起始值为1 //有空间semctl(semid, 1, SETVAL, 0);//设置数据的起始值为0 //无数据//空间结构体struct sembuf space;space.sem_num = 0;//空间space.sem_op = -1;//P操作space.sem_flg = 0;//普通属性//数据结构体struct sembuf data;data.sem_num = 1;//数据data.sem_op = 1;//V操作data.sem_flg = 0;//普通属性//此时映射出来的shm_p 就是两个进程的共享内存while(1){//空间:1  数据:0//开车进去之前,空间 -1 --P操作semop(semid, &space, 1);//请问空间能不能P操作?//能   -> 有车位  -> 函数返回//不能 -> 没车位  -> 函数阻塞//开车进去//从键盘上获取数据,存储到共享内存shm_pscanf("%s", shm_p);//开车进去之后,数据+1 --V操作semop(semid, &data, 1); //数据自动+1//退出条件,这里要注意 应该使用strncmp 指定字节数if(strncmp(shm_p, "exit", 4) == 0)break;}//4、当不再使用时,解除映射关系shmdt(shm_p);//5、当没有进程再需要使用这块共享内存时,删除它shmctl(shmid,  IPC_RMID, NULL);semctl(semid,0,IPC_RMID);return 0;
}

(2)、共享内存+信号量实现读数据通信

#include<stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>int main()
{printf("共享内存+信号量读数据进程\n");//1、获取key值key_t key = ftok(".",10);//2、根据key值 获取共享内存的ID号int shmid = shmget(key,1024,IPC_CREAT|0666);//3、根据ID号 将共享内存映射至本进程虚拟内存空间的某个区域char*shm_p = shmat(shmid,NULL,0);if(shm_p == (void*)-1){perror("shmat error");return -1;}//4、获取信号量的key值key_t key1 = ftok(".",20);//5、根据key值申请信号量ID号int semid = semget(key1,2,IPC_CREAT|0666);//6、初始化信号量起始值semctl(semid,0,SETVAL,1);//设置空间的起始值为1semctl(semid,1,SETVAL,0);//设置数据的起始值为0//空间结构体struct sembuf space;space.sem_num = 0;space.sem_op = 1; //V操作space.sem_flg = 0;//数据结构体struct sembuf data;data.sem_num = 1;data.sem_op = -1;//P操作data.sem_flg = 0;//此时映射出来的shm_p 就是两个进程的共享内存while(1){//空间:0  数据:1//把车开出来之前,请问数据能不能-1?semop(semid, &data, 1);//能  -> 里面有车  -> 函数返回//不能 -> 里面没车 -> 函数阻塞//从车库里面把车开出来//从共享内存中读取数据printf("recv:%s\n",shm_p);//sleep(1);//把车开出来之后,空间+1semop(semid, &space, 1);//空间:1  数据:0//退出条件,这里要注意 应该使用strncmp 指定字节数if(strncmp(shm_p,"exit",4) == 0)break;}return 0;
}

        如下所示为运行结果,信号量的运用,解决优化了之前单一共享内存出现的一直打印数据的问题。

相关文章:

Linux系统编程 | IPC对象---信号量

在前面两篇博客文章中&#xff0c;对Linux系统编程部分IPC三大对象中的消息队列和共享内存的知识体系做了一个大致的梳理&#xff0c;在本篇文章中&#xff0c;将对三大IPC对象中的最后一个信号量做一个总结。如果有需要的博客朋友&#xff0c;可以参考我的Linux系统编程专栏参…...

当数据自己会说话:聚类与分类算法全景解析

从金融风控到医疗诊断&#xff0c;两种机器学习技术如何重塑决策逻辑 在人工智能与数据驱动的时代&#xff0c;聚类和分类作为机器学习的两大核心技术&#xff0c;已成为从海量数据中提取价值的必备工具。它们看似相似——都是将数据划分到不同的组中——但内在逻辑和应用场景却…...

哈佛结构(Harvard Architecture)与冯·诺依曼架构(Von Neumann Architecture)

一、基础概念与历史溯源 哈佛结构 起源&#xff1a;1940年代由哈佛大学开发的Mark I计算机首次采用&#xff0c;专为弹道计算优化。核心特征&#xff1a; 物理分离的存储器&#xff1a;程序指令存储在ROM/Flash&#xff0c;数据存储在RAM&#xff0c;两者独立编址。独立总线系统…...

Python内存使用分析工具深度解析与实践指南(下篇)

文章目录 引言6. guppy3 / Heapy功能安装程序示例适用场景注意事项 7. objgraph功能安装程序示例适用场景注意事项 8. memory_profiler功能安装程序示例适用场景注意事项 9. profile&#xff08;标准库&#xff09;功能程序示例适用场景注意事项 总结对比表 引言 在Python编程…...

经典控制理论:线性化笔记

一、弹簧阻尼系统 求B点的位置X0&#xff0c;与弹簧形变后的位置X1的关系 ---- 解&#xff1a; 二、直流电动机模型 求输出转速与输入电压的关系 解&#xff1a;...

【StarRocks系列】查询优化

步骤参考官网 分析查询 | StarRocks StarRocks-Profile分析及优化指南 StarRocks-Profile分析及优化指南 - 经验教程 - StarRocks中文社区论坛...

【STM32】STM32的中断系统寄存器NVIC、EXTI

文章目录 中断概述中断的概念为什么需要中断STM32的中断 STM32的中断体系架构NVICNVIC的介绍中断优先级优先级寄存器优先级组 EXTI 中断概述 中断的概念 在主程序运行过程中&#xff0c;出现了特定事件&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理这个事…...

LLM-201: OpenHands与LLM交互链路分析

一、核心交互链路架构 #mermaid-svg-ZBqCSQk1PPDkIXNx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ZBqCSQk1PPDkIXNx .error-icon{fill:#552222;}#mermaid-svg-ZBqCSQk1PPDkIXNx .error-text{fill:#552222;strok…...

税务 VR 虚拟体验,带来全新办税感受

在过去&#xff0c;企业办税难题诸多。申报纳税高峰期&#xff0c;办税服务厅人满为患&#xff0c;财务人员需早起取号排队&#xff0c;耗费大量时间。传统办税流程复杂&#xff0c;涉及多环节和部门&#xff0c;资料繁多&#xff0c;若准备不全或有误就得重新准备&#xff0c;…...

【Linux 驱动中断】

Linux 驱动中断 一、GIC 控制器&#xff1a;硬件中断的枢纽二、GPIO 中断&#xff1a;设备交互的常见入口三、Tasklet 与软中断&#xff1a;高效的异步处理机制3.1 Tasklet3.2 软中断 四、工作队列&#xff1a;灵活的任务处理框架4.1 共享工作队列4.2 自定义工作队列4.3 延迟工…...

ali 轻量服务器安装nginx

# Ubuntu sudo apt install nginx-light # 精简版 # CentOS sudo yum install nginx #启动并设置开机自启 sudo systemctl daemon-reload sudo systemctl start nginx sudo systemctl enable nginx #验证安装 nginx -v curl -I 127.0.0.1 #常用命令&#xff1a; # 重新加载配…...

2025年- H83-Lc191--139.单词拆分(动态规划)--Java版

1.题目描述 2.思路 字符串s是一个容器&#xff08;一个背包&#xff09;&#xff0c;wordDict词典是物品&#xff0c;这里面的每个物品我们可以使用多次。 动归五部曲 &#xff08;1&#xff09;字符串的长度为i&#xff0c;dp[i]true。 dp[s.size] dp[0]代表空字符串 &#x…...

【好用但慎用】Windows 系统中将所有 WSL 发行版从 C 盘迁移到 非系统 盘的完整笔记(附 异常处理)

&#x1f680; 将所有 WSL 发行版从 C 盘迁移到 I 盘的完整教程&#xff08;含 Podman / NVIDIA Workbench / Ubuntu 等&#xff09; 【无标题】使用 Chocolatey 安装 WSL 管理工具 LxRunOffline-CSDN博客 免责声明 重要提示 在执行 WSL 迁移操作前&#xff0c;请务必仔细阅读…...

贪心算法思路详解

文章目录 一、贪心算法是什么&#xff1f;二、贪心算法原理三、再谈背包问题四、活动选择问题五、拟阵理论总结 一、贪心算法是什么&#xff1f; 贪心算法与动态规划算法一样是用于求解最优化类问题的算法&#xff0c;其本质上是基于动态规划算法的改进算法&#xff0c;其所求…...

Keil 安装 CMSIS-FreeRTOS 失败解决方案

一、问题现象 在 Keil 中安装 CMSIS-FreeRTOS 时出现以下错误&#xff1a; &#xff08;1&#xff09; 通过内置工具安装&#xff1a; &#xff08;2&#xff09;通过官网安装&#xff1a; 二、核心原因 Keil 版本过低&#xff0c;与 CMSIS-FreeRTOS 包不兼容&#xff1a; …...

Python打卡DAY33

DAY33&#xff1a;MLP神经网络的训练 恩师浙大疏锦行 知识点&#xff1a; PyTorch和cuda的安装查看显卡信息的命令行命令&#xff08;cmd中使用&#xff09;cuda的检查简单神经网络的流程 数据预处理&#xff08;归一化、转换成张量&#xff09;模型的定义 继承nn.Module类定义…...

RJ45 网口实现千兆传输速率(1Gbps)的原理,涉及物理层传输技术、线缆标准、信号调制及网络协议等多方面的协同设计。以下从技术维度展开详细解析:

一、千兆以太网的标准与物理层基础 1. 标准规范 千兆以太网遵循 IEEE 802.3ab&#xff08;针对双绞线&#xff09;和 IEEE 802.3z&#xff08;针对光纤&#xff09;标准&#xff0c;其中 RJ45 接口对应双绞线场景&#xff0c;核心是通过四对双绞线&#xff08;CAT5e/CAT6 线缆…...

leetcode hot 100之:二叉树的层序遍历

层序遍历和前中后序遍历不一样&#xff0c;大家可以想象的是&#xff1a;前中后序遍历可以用递归&#xff0c;因为他是以子树为标准来选择的&#xff1b;那层序怎么办呢&#xff1f;怎么才能一层层地遍历呢&#xff1f; void First(TreeNode* root) {printf("%d",ro…...

深入解析BERT:语言分类任务的革命性引擎

“BERT的出现&#xff0c;如同在自然语言处理领域投下了一颗认知炸弹——它让机器真正学会了’联系上下文’。” ——自然语言处理研究者普遍共识 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;2018年诞生的BERT&#xff08;Bidirectional Encoder Representatio…...

Pycharm中Jupyter Notebook 插件常用快捷键

bg&#xff1a;Jupyter跟LINQPad很像&#xff0c;都是方便写的时候看数据用 快捷键功能Shift Enter执行当前单元格&#xff0c;并跳转到下一个单元格Ctrl Enter执行当前单元格&#xff0c;不跳转&#xff08;留在当前单元格&#xff09;Alt Enter执行当前单元格&#xff0c…...

【Python】Excel表格操作:ISBN转条形码

一、效果 原始文件&#xff1a; 输出文件&#xff1a; 二、代码 import os import logging from openpyxl import load_workbook from openpyxl.drawing.image import Image as ExcelImage from barcode import EAN13 from barcode.writer import ImageWriterlogging.basicCo…...

大数据Hadoop集群搭建

文章目录 大数据Hadoop集群搭建一、VMware准备Linux虚拟机二、VMware虚拟机系统设置1、主机名、IP、SSH免密登录2、JDK环境部署3、防火墙、SELinux、时间同步 三、VMware虚拟机集群上部署HDFS集群1、集群规划2、上传&解压3、Hadoop安装包目录结构4、修改配置文件&#xff0…...

饼图:数据可视化的“切蛋糕”艺术

饼图&#xff0c;作为数据可视化家族中最经典、最易识别的成员之一&#xff0c;其核心功能如同其名——像切分蛋糕一样&#xff0c;直观展示一个整体&#xff08;100%&#xff09;被划分为若干组成部分的比例关系。 往期文章推荐: 20.用Mermaid代码画ER图&#xff1a;AI时代的…...

mysql server层做了什么

服务器处理客户端请求 服务器程序在处理来自客户端的查询请求时&#xff0c;大致需要分为3部分&#xff1a;连接管理、解析与优化、存储引擎。 连接管理 每当有一个客户端进程连接到服务器进程时&#xff0c;服务器进程都会创建一个线程专门处理与这个客户端的交互&#xff…...

3.5.1_1 信道划分介质访问控制(上)

在这个视频中我们要介绍信道划分、介质访问控制&#xff0c;这是两个词&#xff0c;我们先介绍一下什么叫做介质访问控制。 通过之前的学习&#xff0c;我们知道在计算机网络当中&#xff0c;有的信道它在逻辑上属于总线型&#xff0c;我们也可以把这种信道称为广播信道&#x…...

RPC常见问题回答

项目流程和架构设计 1.服务端的功能&#xff1a; 1.提供rpc调用对应的函数 2.完成服务注册 服务发现 上线/下线通知 3.提供主题的操作 (创建/删除/订阅/取消订阅) 消息的发布 2.服务的模块划分 1.网络通信模块 net 底层套用的moude库 2.应用层通信协议模块 1.序列化 反序列化数…...

数据分析和可视化:Py爬虫-XPath解析章节要点总结

重要知识点 XPath 概述&#xff1a;XPath 是一门可以在 XML 文件中查找信息的语言&#xff0c;也可用于 HTML 文件。它功能强大&#xff0c;提供简洁明了的路径表达式和多个函数&#xff0c;用于字符串、数值、时间比较等。1999 年成为 W3C 标准&#xff0c;常用于爬虫中抓取网…...

WIFI原因造成ESP8266不断重启的解决办法

一、报错 报错信息如下&#xff1a; 21:37:21.799 -> ets Jan 8 2013,rst cause:2, boot mode:(3,7) 21:37:21.799 -> 21:37:21.799 -> load 0x4010f000, len 3424, room 16 21:37:21.799 -> tail 0 21:37:21.799 -> chksum 0x2e 21:37:21.799 -> loa…...

OSI网络通信模型详解

OSI 模型就是把这整个过程拆解成了 7 个明确分工的步骤&#xff0c;每一层只负责自己那一摊事儿&#xff0c;这样整个系统才能顺畅运转&#xff0c;出了问题也容易找到“锅”在谁那。 核心比喻&#xff1a;寄快递 &#x1f4e6; 想象你要把一份重要的礼物&#xff08;你的数据…...

第五章 中央处理器

5.1 CPU的功能和基本构造 5.1.1 CPU的基本功能 5.1.2 CPU的基本结构 1.运算器 算术逻辑单元ALU 累加寄存器ACC 程序字状态寄存器PSW 计数器CT 暂存寄存器 通用寄存器组 移位器 通用寄存器供用户自由编程,可以存放数据和地址。而指令寄存器是专门用于存放指令的专用寄存器,…...

大模型学习入门——Day3:注意力机制

本系列笔记的教材&#xff1a;快乐学习大模型-DataWhale团队 注意力机制 注意力机制最先源于计算机视觉领域&#xff0c;其核心思想为当我们关注一张图片&#xff0c;我们往往无需看清楚全部内容而仅将注意力集中在重点部分即可。而在自然语言处理领域&#xff0c;我们往往也…...

C++ 学习笔记精要(二)

第一节 特殊类的设计 1. 一个类: 只能在堆上创建对象 关键点:自己控制析构 1.1 方法一: 使用delete禁掉默认析构函数 #include <iostream> using namespace std;class HeapOnly { public:HeapOnly(){_str new char[10];}~HeapOnly() delete;void Destroy(){delete[…...

博士,超28岁,出局!

近日&#xff0c;长沙市望城区《2025年事业引才博士公开引进公告》引发轩然大波——博士岗位年龄要求28周岁及以下&#xff0c;特别优秀者也仅放宽至30周岁。 图源&#xff1a;网络 这份规定让众多"高龄"博士生直呼不合理&#xff0c;并在社交平台掀起激烈讨论。 图源…...

macOS - 根据序列号查看机型、保障信息

文章目录 最近在看 MacBook 二手机&#xff0c;有个咸鱼卖家放个截图 说不清参数&#xff0c;于是想根据 序列号 查看机型。苹果提供了这样的网页&#xff1a; https://checkcoverage.apple.com/ &#xff08;无需登录&#xff09; 结果 2025-06-20&#xff08;五&#xff09;…...

C/C++ 高频八股文面试题1000题(一)

原作者&#xff1a;Linux教程&#xff0c;原文地址&#xff1a;C/C 高频八股文面试题1000题(一) 在准备技术岗位的求职过程中&#xff0c;C/C始终是绕不开的核心考察点。无论是互联网大厂的笔试面试&#xff0c;还是嵌入式、后台开发、系统编程等方向的岗位&#xff0c;C/C 都…...

C++ map 和 unordered_map 的区别和联系

C map 和 unordered_map 的区别和联系 map 和 unordered_map 都是 C 标准库中关联容器&#xff0c;用于存储键值对。它们的主要区别在于底层实现和性能特性&#xff0c;联系在于它们都提供了键值对的存储和访问功能。 区别&#xff1a; 特性mapunordered_map底层实现红黑树 …...

Sentinel实现原理

Sentinel 是阿里巴巴开源的分布式系统流量控制组件&#xff0c;主要用于服务保护&#xff0c;涵盖流量控制、熔断降级、系统负载保护等功能。 以下是 Sentinel 的实现原理&#xff0c;使用中文简要说明&#xff1a; 1. 总体架构 Sentinel 采用 轻量级 设计&#xff0c;分为 核…...

python打卡day37

疏锦行 知识点回顾&#xff1a; 1. 过拟合的判断&#xff1a;测试集和训练集同步打印指标 2. 模型的保存和加载 a. 仅保存权重 b. 保存权重和模型 c. 保存全部信息checkpoint&#xff0c;还包含训练状态 3. 早停策略 作业&#xff1a;对信贷数据集训练后保存权重&#xf…...

MySQL复杂查询优化实战:从多表关联到子查询的性能突破

文章目录 一、复杂查询性能瓶颈分析与优化框架二、多表关联查询的优化策略与实战1. JOIN顺序优化&#xff1a;基于成本估算的表关联策略2. 复合索引与JOIN条件优化3. 大表JOIN的分片处理 三、子查询优化&#xff1a;从嵌套到JOIN的转换艺术1. 标量子查询转换为JOIN2. EXISTS子查…...

LeetCode 680.验证回文串 II

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 核心思路&#xff1a; 思路详解&#xff1a; 代码&#xff1a; C代码&#xff1a; Java代码&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 680. 验证…...

window显示驱动开发—输出合并器阶段

逻辑管道中的最后一步是通过模具或深度确定可见性&#xff0c;以及写入或混合输出以呈现目标&#xff0c;这可以是多种资源类型之一。 这些操作以及输出资源 (呈现目标) 绑定在输出合并阶段定义。 1. 核心功能与管线定位 输出合并是渲染管线的最终固定功能阶段&#xff0c;负…...

单片机开发日志cv MDK-ARM工具链迁移到MAKE

核心经验&#xff1a; STM32H7 多 RAM 区域&#xff0c;外设相关数据段必须放在 AXI SRAM&#xff08;RAM&#xff09;区&#xff0c;不能放在 DTCMRAM&#xff0c;否则外设无法访问&#xff0c;程序表面正常但外设全失效。迁移工程时&#xff0c;务必检查链接脚本的内存分布&a…...

大模型与搜索引擎的技术博弈及未来智能范式演进

基于认知革命与技术替代的全景综述 一、大模型对搜索引擎的替代性分析&#xff1a;技术范式与市场重构 &#xff08;1&#xff09;技术原理的代际分野 传统搜索引擎遵循 "爬虫抓取 - 索引构建 - 关键词排序" 的三段式架构&#xff0c;其核心是基于 PageRank 算法的…...

Ajax-入门

Ajax: 全称Asynchronous JavaScript And XML&#xff0c;异步的JavaScript和XML。其作用有如下2点&#xff1a; 与服务器进行数据交换&#xff1a;通过Ajax可以给服务器发送请求&#xff0c;并获取服务器响应的数据。 异步交互&#xff1a;可以在不重新加载整个页面的情况下&a…...

FPGA基础 -- Verilog 共享任务(task)和函数(function)

Verilog 中共享任务&#xff08;task&#xff09;和函数&#xff08;function&#xff09; 的详细专业培训&#xff0c;适合具有一定 RTL 编程经验的工程师深入掌握。 一、任务&#xff08;task&#xff09;与函数&#xff08;function&#xff09;的基本区别 特性taskfunctio…...

c++set和pair的使用

set是C中的一种关联容器&#xff0c;具有以下特点&#xff1a; 存储唯一元素&#xff08;不允许重复&#xff09; 元素自动排序&#xff08;默认升序&#xff09; 基于红黑树实现&#xff08;平衡二叉搜索树&#xff09; 插入、删除和查找的时间复杂度为O(log n) 前言 在C…...

数据库中间件ShardingSphere5

一、高性能架构模式 数据库集群&#xff0c;第一种方式“读写分离”&#xff0c;第二种方式“数据库分片”。 1.1 读写分离架构 读写分离原理&#xff1a;将数据库读写操作分散到不同的节点上。 读写分离的基本实现&#xff1a; 主库负责处理事务性的增删改操作&#xff0c…...

window显示驱动开发—使用状态刷新回调函数

用户模式显示驱动程序可以使用 Direct3D 运行时版本 10 State-Refresh回调函数 来实现无状态驱动程序或构建命令缓冲区前导数据。 Direct3D 运行时在调用 CreateDevice (D3D10 ) 函数时&#xff0c;向D3D10DDIARG_CREATEDEVICE结构的 pUMCallbacks 成员指向的D3D10DDI_CORELAY…...

windows11右击恢复为windows10

文章目录 前言一、问题描述二、解决方案 前言 为了解决win11的右击更多选项的问题 一、问题描述 win11的右键更多选项过于繁琐 二、解决方案 在windows11的终端管理员中输入如下代码&#xff1a; reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c…...

基于物联网的智能衣柜系统设计

标题:基于物联网的智能衣柜系统设计 内容:1.摘要 随着物联网技术的飞速发展&#xff0c;智能家居领域迎来了新的变革机遇。本研究的目的在于设计一种基于物联网的智能衣柜系统&#xff0c;以提升用户的衣物管理和使用体验。方法上&#xff0c;通过搭建物联网硬件平台&#xff…...