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

Liunx系统 : 进程间通信【IPC-Shm共享内存】

文章目录

  • System V
    • 共享内存
      • 创建共享内存
        • shmget
      • 控制共享内存
        • shmctl
    • shm特性

System V

System V是Liunx中的重要的进程间通信机制,它包括(shm共享内存,(msg消息队列和(sem信号量。本篇博客主要介绍其中最常用的一种方式–共享内存。


共享内存

顾名思义,共享内存是一块进程之间可以共享的内存区域,由于进程之间都是相互独立的,那么这块区域自然而然不是又某个进程开辟的,而应该是由操作系统亲自开辟。


在这里插入图片描述
如上图,共享内存会被进程的页表直接映射到自己的进程地址空间共享区,从而通过地址空间与页表直接访问到物理内存(可能有多层),进而对内存操作,这就是多个进程共享一块内存的基本原理。


创建共享内存

shmget

shmget 函数是 shm 中用于创建或获取共享内存段的函数。需要头文件<sys/ipc.h><sys/shm.h>函数原型如下:

int shmget(key_t key,size_t size,int shmflg)

返回值:

shmget返回一个整型,这个整型叫做shmid,用于标识唯一的shm

1.key : 标识要创建或获取的共享内存段,是System V方式的唯一标识。

注意和shmid区分,shmid是用来标识唯一的共享内存(shm)。

2.size : 指定要创建的共享内存段的大小,单位为字节

注意共享内存以4kb为基本单位开辟内存,因此开辟内存的时候,这个参数最好设置为4096的倍数,哪怕你只是申请了一个字节的内存,实际上还是会开辟4kb大小的空间的。

3 . shmflg : 用于指定共享内存段访问的权限和其他选项。

这是一个用于控制共享内存的开辟方式,以及各个属性的选项,本质上是一个位图。

  • IPC_CREAST : 如果指定的key不存在,则创建一个新的共享内存段,如果已经存在,则直接获取原先的共享内存。
  • IPC_EXCL:如果指定的key已经存在,则创建失败。

要注意IPC_EXCL只能配合IPC_CREAT一起使用,不能单独使用。

  • 还可以按照权限值的8进制位或到第三个参数之中。
int main()
{int shmid = shmget(1, 4096, IPC_CREAT | IPC_EXCL | 0666);return 0;
}

在这里插入图片描述

如果只想看共享内存的方式,则ipcs -m:
在这里插入图片描述

一开始存在一个shmid = 0的共享内存,之后通过指令的方式删除掉了这个共享方式,除了这种方式,我们还可以通过系统接口来删除共享内存,也就是下面要介绍的shmctl接口。


控制共享内存

shmctl

shmctl 用于控制共享内存的各种属性。

  1. 获取共享内存段的状态信息
  2. 修改共享内存段的属性
  3. 删除共享内存段

shmctl包含在头文件<sys/ipc.h><sys/shm.h>中,函数原型如下:

int shmctl(int shmid, int cmd, struct shmid_ds *buf);
  • 函数返回值

shmctl 函数的返回值用于指示操作是否成功:

  • 成功时:返回 0,表示操作已完成且未发生错误。
  • 失败时:返回 -1,并设置 errno 变量以指示具体的错误原因。常见的错误包括权限不足、无效的共享内存标识符等。

shmctl 函数有三个主要参数,它们共同决定了函数的行为:

  1. shmid:这是要操作的共享内存段的标识符。通过 shmget 函数可以获取该标识符,它是后续所有操作的基础,确保函数作用于正确的共享内存段。

  2. cmd:指定要执行的操作类型,它可以是以下值之一:

    • IPC_STAT:用于获取共享内存段的状态信息。此操作会将共享内存段的相关属性填充到由 buf 指向的 shmid_ds 结构体中,供程序查询和分析。
    • IPC_SET:用于设置共享内存段的某些属性。通过 buf 参数传递新的属性值,但需注意只有超级用户或拥有适当权限的进程才能执行此操作。
    • IPC_RMID:用于删除共享内存段。执行此操作后,共享内存段将被标记为可销毁,系统会在合适的时候将其从内核中移除。
  3. buf:这是一个指向 shmid_ds 结构体的指针。当 cmd 参数为 IPC_STAT 时,该结构体用于接收共享内存段的当前属性;当 cmd 参数为 IPC_SET 时,该结构体则包含需要设置的新属性值。

  • 相关结构体 shmid_ds

在使用 shmctl 函数时,shmid_ds 结构体是至关重要的,它包含了共享内存段的详细信息:

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;    /* 创建者的 PID */pid_t           shm_lpid;    /* 最后调用 shmat/shmdt 的 PID */shmatt_t        shm_nattch;  /* 当前附加次数 */...
};

  • shm_perm:该字段是一个 ipc_perm 结构体,包含了共享内存段的所有者、组、权限等信息,用于控制进程对共享内存段的访问权限。
  • shm_segsz:表示共享内存段的大小,以字节为单位。在创建共享内存段时设置,后续操作中可通过 IPC_STAT 获取该值,或在有适当权限时通过 IPC_SET 修改。
  • 时间相关字段(shm_atime、shm_dtime、shm_ctime):分别记录了共享内存段最后被附加、分离以及更改的时间,这些信息对于监控共享内存段的使用情况非常有用。
  • 进程 ID 相关字段(shm_cpid、shm_lpid)shm_cpid 是创建共享内存段的进程的 PID,而 shm_lpid 是最后调用 shmatshmdt 函数的进程的 PID,有助于追踪共享内存段的使用历史。
  • shm_nattch:表示当前共享内存段被附加的次数。当进程调用 shmat 附加共享内存段时,该值会增加;当进程调用 shmdt 分离共享内存段时,该值会减少。当该值为 0 时,表示没有进程正在使用该共享内存段。

shmctl第二个参数cmdIPC_STAT,此时就可以获取一个共享内存的基本信息。

示例 :

int main()
{int id = shmget(1, 4096, IPC_CREAT | IPC_EXCL | 0666);struct shmid_ds shm;shmctl(id, IPC_STAT, &shm);cout << "atime:" << shm.shm_atime << endl;cout << "ctime:" << shm.shm_ctime << endl;cout << "cpid:" << shm.shm_cpid << endl;return 0;
}

在这里插入图片描述

第二个参数为IPC_SET时候可以设置共享内存的某些属性。

int main()
{int id = shmget(1, 4096, IPC_CREAT | IPC_EXCL | 0666);struct shmid_ds shm;shmctl(id, IPC_STAT, &shm);cout << "atime:" << shm.shm_atime << endl;//	140731859906331shm.shm_atime = 1 ;//修改shm信息shmctl(id, IPC_SET, &shm);//重新获取shm信息shmctl(id, IPC_STAT, &shm);cout << "atime:" << shm.shm_atime << endl;// 1return 0;
}

删除共享内存(通过接口的方式)


int main()
{shmctl(0, IPC_RMID, nullptr);return 0;
}

在这里插入图片描述

一开始存在一个shmid = 0 的共享内存,经过test之后,这个共享内存就被删除了。


上面我们详细讨论了如何来开辟一个共享内存,还没有真正使用这段共享内存来进行通信。

接下来,假设现在有AB两个进程,他们通过共享内存的方式进行通信,其中A负责发送消息,B负责接收消息。

A进程的代码数据如下:

int main()
{key_t key = ftok("./test.cpp", 1);int shmid = shmget(key, 4096, IPC_CREAT | IPC_EXCL | 0666);char* ptr = (char*)shmat(shmid, nullptr, 0);for(int ch = 'A'; ch <= 'Z'; ch++){ptr[ch - 'A'] = ch;sleep(1);}shmctl(shmid, IPC_RMID, nullptr);return 0;
}

B进程的代码数据如下:

int main()
{key_t key = ftok("./test.cpp", 1);int shmid = shmget(key, 4096, IPC_CREAT);char* ptr = (char*)shmat(shmid, nullptr, 0);while(true){cout << ptr << endl;sleep(5);}return 0;
}

在这里插入图片描述

可以看到A向共享内存中写入数据,就被B进程读到了


shm特性

共享内存有以下一些主要特性:

  1. 内存共享:多个进程可以同时访问和修改同一块共享内存区域。这种共享内存机制可以让进程之间高效地交换数据,而无需通过系统调用或者其他进程间通信机制。

  2. 快速访问:相比于其他进程间通信机制,如管道、消息队列等,共享内存的访问速度更快,因为数据直接存储在内存中,不需要进行数据的拷贝和上下文切换。

  3. 灵活性:共享内存可以在进程之间自由分配和管理,大小和位置都可以灵活设置。这种灵活性使得共享内存非常适合用于复杂的进程间通信场景。

  4. 同步问题:多个进程可以并发访问和修改共享内存,因此需要使用信号量、互斥锁等同步机制来协调对共享内存的访问,避免数据竞争和不一致性问题。

  5. 内存分配:共享内存是由内核管理的,进程无法直接分配和释放共享内存,必须通过系统调用如 shmget()shmctl() 来完成。


system V 的后两种通信方式 消息队列 msg信号量 sem 都非常不常用了,不深入研究。

相关文章:

Liunx系统 : 进程间通信【IPC-Shm共享内存】

文章目录 System V共享内存创建共享内存shmget 控制共享内存shmctl shm特性 System V System V是Liunx中的重要的进程间通信机制&#xff0c;它包括&#xff08;shm&#xff09;共享内存&#xff0c;&#xff08;msg&#xff09;消息队列和&#xff08;sem&#xff09;信号量。…...

c语言笔记 数组指针

数组指针是指针类型的一种&#xff0c;一般数组指针跟二维数组&#xff0c;一维数组结合比较多&#xff0c;下面我们通过图片来探讨一下数组指针的使用以及结合起来的联系。 1.数组指针与一维数组 int a[3]; //一维数组 int aa[2][3];//二维数组 数组元素类型 int [3] int (*p…...

SpringBoot + vue 管理系统

SpringBoot vue 管理系统 文章目录 SpringBoot vue 管理系统 1、成品效果展示2、项目准备3、项目开发 3.1、部门管理 3.1.1、前端核心代码3.1.2、后端代码实现 3.2、员工管理 3.2.1、前端核心代码3.2.2、后端代码实现 3.3、班级管理 3.3.1、前端核心代码3.3.2、后端代码实现 …...

Python语法核心架构与核心知识点:从理论到实践

一、Python的核心设计哲学 Python以“简洁优雅”为核心理念&#xff0c;遵循以下原则&#xff1a; # Zen of Python&#xff08;输入 import this 可查看&#xff09; >>> import this The Zen of Python, by Tim Peters ... Simple is better than complex. Readab…...

OpenHarmony子系统开发 - 编译构建Kconfig可视化配置指导

OpenHarmony子系统开发 - 编译构建Kconfig可视化配置指导 概述 功能简介 该功能基于Kconfiglib与Kconfig实现&#xff0c;方便用户个性化配置OpenHarmony产品子系统部件。 基于Kconfig实现的可视化配置功能具有以下优点&#xff1a; 能直观且全面地展示软件的部件选项。可…...

管中窥豹数字预失真(DPD)

管中窥豹数字预失真&#xff08;DPD&#xff09; 数字预失真在通信领域发挥了巨大的作用&#xff0c;对提高功放效率、改善误码率起了不可忽略的作用&#xff0c;广泛运用与通信、雷达等各种领域。但是对于普通用户&#xff0c;它显得及其高深神秘。今天就用这个短文&#xff…...

spring-boot-starter和spring-boot-starter-web的关联

maven的作用是方便jar包的管理&#xff0c;所以每一个依赖都是对应着相应的一个或者一些jar包&#xff0c;从网上看到很多对spring-boot-starter的描述就是“这是Spring Boot的核心启动器&#xff0c;包含了自动配置、日志和YAML。”没看太明白&#xff0c;所参与的项目上也一直…...

梯度计算中常用的矩阵微积分公式

标量对向量求导的常用数学公式 设标量函数 y f ( x ) y f(\boldsymbol{x}) yf(x)&#xff0c;其中 x ( x 1 , x 2 , ⋯ , x n ) T \boldsymbol{x} (x_1, x_2, \cdots, x_n)^{\rm T} x(x1​,x2​,⋯,xn​)T是一个 n n n维列向量。标量 y y y对向量 x \boldsymbol{x} x的导数…...

vim 编写/etc/docker/daemon.json文件时,E212: 无法打开并写入文件

目录 问题描述 解决方法 1、创建/etc/docker目录 2、打开/etc/docker目录 3、创建daemon.json文件 4、vim 编辑daemon.json文件 问题描述 当我们输入代码&#xff1a;vim /etc/docker/daemon.json时&#xff0c;报E212: 无法打开并写入文件错误&#xff0c;如下图 vim /e…...

http 模块的概念及作用详细介绍

目录 1. http 模块概述 2. http 模块的作用 3. http 服务器代码示例 运行代码 4. http 客户端代码示例 运行代码 5. 总结 1. http 模块概述 http 模块是 Node.js 内置的核心模块之一&#xff0c;它用于创建 HTTP 服务器和客户端&#xff0c;支持处理 HTTP 请求和响应。…...

重生之我在学Vue--第5天 Vue 3 路由管理(Vue Router)

重生之我在学Vue–第5天 Vue 3 路由管理&#xff08;Vue Router&#xff09; 文章目录 重生之我在学Vue--第5天 Vue 3 路由管理&#xff08;Vue Router&#xff09;前言一、路由配置与导航1.1 什么是 Vue Router&#xff1f;1.2 安装 Vue Router1.3 基本路由配置步骤代码示例 1…...

常见排序算法深度评测:从原理到10万级数据实战

常见排序算法深度评测&#xff1a;从原理到10万级数据实战 摘要 本文系统解析冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序和基数排序8种经典算法&#xff0c;通过C语言实现10万随机数排序并统计耗时。测试显示&#xff1a;快速排序综合性能最优&…...

搭建BOA服务器

BOA服务器是嵌入式常用的服务器类型&#xff0c;嵌入式程序作为后端时候如果想配合网页进行显示&#xff0c;利用BOA服务器搭建网络界面是不错的选择 首先下载boa官方安装包 Boa Webserver 下载后传输到Ubuntu随便文件夹&#xff0c;解压 tar -xvf boa-0.94.13.tar.gz 进入…...

JSON.parse(JSON.stringify())深拷贝不会复制函数

深拷贝 是指创建一个新对象&#xff0c;并递归地复制原对象中所有层级的属性和值&#xff0c;从而确保新对象与原对象完全独立 深拷贝的实现方法 &#xff1a; 1. 使用 JSON.parse(JSON.stringify()) 函数会被忽略复制&#xff0c;比如&#xff0c;下面的对象的forma…...

debug_unpack_ios failed: Exception: Failed to codesign 解决方案(亲测有效)

debug_unpack_ios failed: Exception: Failed to codesign 解决方案&#xff08;亲测有效&#xff09; 背景原因解决方案tipsresult 背景 执行flutter doctor全通过后run项目依然报错 原因 1、检查flutter Mac的flutter项目在哪个文件夹内 2、检查flutter Sdk在哪个文件夹内 …...

Docker篇

1.docker环境搭建&#xff1a; 1.1软件仓库的配置rhel9&#xff1a; #cd/etc/yum.repos.d #vim docker.repo [docker] namedocker-ce baseurlhttps://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable gpgcheck0 1.2安装docker并且启动服务 yum install -y dock…...

【Linux】基本命令

目录 &#x1f525;一、基础命令 1.sudo su&#xff08;superuser do&#xff09; 2.pwd&#xff08;print working directory&#xff09; 3.ls&#xff08;list&#xff09; 4.cd&#xff08;change directory&#xff09; 5.mkdir&#xff08;make directory&#xff…...

win10电脑鼠标速度突然变的很慢?

电脑鼠标突然变很慢&#xff0c;杀毒检测后没问题&#xff0c;鼠标设置也没变&#xff0c;最后发现可能是误触鼠标的“DPI”调节键。 DPI调节键在鼠标滚轮下方&#xff0c;再次点击即可恢复正常鼠标速度。 如果有和-的按键&#xff0c;速度变快&#xff0c;-速度变慢。 图源&…...

前端(vue)学习笔记(CLASS 3):生命周期工程化开发入门

1、生命周期 Vue生命周期&#xff1a;一个Vue实例从创建到销毁的整个过程 生命周期四个阶段&#xff1a;创建、挂载、更新、销毁 1、创建阶段&#xff1a;响应式数据 2、挂载阶段&#xff1a;渲染模板 3、更新阶段&#xff1a;数据修改、更新视图&#xff08;执行多次&…...

Python写一个查星座的小程序,适合初学者练手——字典和if语句练习

一、界面预览 二、完整代码 # 导入必要的库 import tkinter as tk from tkinter import ttk # 导入ttk模块用于更现代的控件 from PIL import Image, ImageTk # 用于处理图片 import os # 用于文件路径操作class ZodiacApp:def __init__(self, root):self.root rootself.r…...

云上特权凭证攻防启示录:从根账号AK泄露到安全体系升级的深度实践

事件全景:一场持续17分钟的云上攻防战 2025年3月9日15:39,阿里云ActionTrail日志突现异常波纹——根账号acs:ram::123456789:root(已脱敏)从立陶宛IP(164.92.91.227)发起高危操作。攻击者利用泄露的AccessKey(AK)在17分钟内完成侦察→提权→持久化攻击链,完整操作序列…...

blazemeter工具使用--用于自动生成jmeter脚本并进行性能测试

1、安装blazemeter&#xff08;网上有很多详情的教程&#xff09; 2、开始录制&#xff1a;设置号你的文件名称后开始录制 3、录制完成后保存为jmeter(jmx)文件 4、在jmeter中打开文件 5、添加一个后置处理器&#xff1a;查看结果树&#xff0c;后运行看看能否成功&#xf…...

TypeScript系列07-类型声明文件

在现代前端开发中&#xff0c;TypeScript已成为提升代码质量和开发体验的利器。对于React和React Native项目&#xff0c;合理利用类型声明文件不仅能提供更好的智能提示和类型检查&#xff0c;还能显著减少运行时错误。本文将深入探讨类型声明文件的编写与使用。 1. 声明文件…...

【社交+陪玩服务】全场景陪玩系统源码 小程序+H5双端 社群互动+即时点单+搭建教程

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 找搭子系统源码&#xff0c;圈子源码、社交源码、陪玩源码&#xff0c;亲测 100% 可用&#xff0c;跟市场上卖 1w的那款一模一样&#xff0c;功能非常齐全&#xff0c;企业级别运营的…...

【Java并发】【synchronized】适合初学者体质入门的synchronized

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f4da;欢迎订阅专栏…...

经销商管理系统选型解析:8款产品详评

本文主要介绍了以下8款经销商管理系统&#xff1a;1.纷享销客&#xff1b; 2.用友T6经销商管理系统&#xff1b; 3.金蝶经销商管理系统&#xff1b; 4.鼎捷经销商管理系统&#xff1b; 5.浪潮经销商管理系统&#xff1b; 6.销售易&#xff1b; 7.SAP Business One Distributor …...

基于STM32的逻辑分析仪

目录 制约性能因素协议命令下位机回复CMD_ID的回复CMD_METADATA命令的回复上报的采样数 设置使用开源软件PulseView设置操作1&#xff0e;设置采样数2&#xff0e;设置采样频率3.使能或禁止通道4.设置通道的触发条件 实现准备汇编指令精确测量时间 程序C语言初实现采集数据上报…...

mapbox高阶,结合threejs(threebox)添加管道

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️threebox Tube静态对象二、🍀使用thr…...

使用PySpark进行大数据处理与机器学习实战指南

1. 技术介绍 1.1 PySpark概述 PySpark是Apache Spark的Python API&#xff0c;它结合了Python的易用性和Spark的分布式计算能力&#xff0c;能够高效处理PB级数据集。Spark基于内存计算的特性使其比传统Hadoop MapReduce快10-100倍&#xff0c;支持流处理、SQL查询、机器学习…...

注意力机制-学习

1. 自注意力机制 句子&#xff1a;"The animal didnt cross the street because it was too tired." 在这个句子中&#xff0c;“it”指的是“animal”. 在自注意力机制中&#xff0c;当我们处理到“it”这个词时&#xff0c;模型会计算“it”与句子中其他所有词的…...

华纳云:香港服务器出现带宽堵塞一般是什么原因?

香港服务器带宽堵塞的原因通常可以归结为以下几个方面&#xff1a; 1. 机房带宽资源有限 (1)香港本地国际带宽成本高 香港的国际出口带宽昂贵&#xff0c;机房通常提供的带宽较小(如默认1Mbps-5Mbps)&#xff0c;如果多个用户争抢有限的带宽&#xff0c;就会出现网络拥堵、丢包…...

我们在开发时,什么时候用到虚函数和纯虚函数?

在曾经学习面向对象的概念上&#xff0c;对虚函数和纯虚函数的区别&#xff0c;我们都会止于这样的理解层面&#xff1a;虚函数是用于被子类可继承可重写的函数&#xff0c;而纯虚函数是子类继承后就必须重写的函数。但是在开发工作上&#xff0c;却有很多开发者是没法彻底参透…...

Python:lambda结合if判断,内置函数与拆包

lambda的应用&#xff1a; #a,b是形参&#xff0c;比较大小 complambda a,b:"a<b" if a<b else "a>b" print(comp(8,5)) 特点&#xff1a;lambda只能实现简单的逻辑&#xff0c;如果逻辑复杂且代码量较大&#xff0c;不建议使用lambda降低代码的…...

【Java学习】包装类

面向对象系列九 包装类变量 一、装箱 1.实例化包装对象 2.静态缓存池 3.写法 二、拆箱 包装类变量 每个基本数据类型都有对应的基本类型的包装类变量&#xff0c;将基本数据类型通过对应的包装类对象载入着进入到类与对象面向对象体系 一、装箱 Integer.valueOf(int) —…...

从新手到专家:嵌入式代码空间优化技巧

目录 一、基本概念 内存开销 优化目标 二、存储管理 数据类型选择 变量作用域 结构体对齐 三、代码结构 循环优化 函数调用 分支语句 查表法的动态扩展 查表法与算法结合 指针替代数组(续) 指针与动态内存结合 指针与函数指针结合 常量优化(续) 常量传播与…...

本地部署Navidrome个人云音乐平台随时随地畅听本地音乐文件

文章目录 前言1. 安装Docker2. 创建并启动Navidrome容器3. 公网远程访问本地Navidrome3.1 内网穿透工具安装3.2 创建远程连接公网地址3.3 使用固定公网地址远程访问 前言 今天我要给大家安利一个超酷的私有化音乐神器——Navidrome&#xff01;它不仅让你随时随地畅享本地音乐…...

AI自动化编程初探

先说vscodeclinemodelscope方案&#xff0c;后面体验trae或者cursor再写写其它的。vscode和trae方案目前来说是免费的&#xff0c;cursor要用claud需要付费&#xff0c;而且不便宜&#xff0c;当然效果可能是最好的。 vscode方案&#xff0c;我的经验是最好在ubuntu上&#xff…...

KUKA机器人:智能制造的先锋力量

在科技日新月异的今天&#xff0c;自动化和智能化已成为推动制造业转型升级的重要引擎。作为全球领先的智能、资源节约型自动化解决方案供应商&#xff0c;KUKA机器人在这一浪潮中扮演着举足轻重的角色。本文将带您深入了解KUKA机器人的发展现状&#xff0c;探索其在智能制造领…...

2021 年 9 月青少年软编等考 C 语言六级真题解析

目录 T1. 合法出栈序列思路分析T2. 奇怪的括号思路分析T3. 区间合并思路分析T4. 双端队列思路分析T1. 合法出栈序列 题目链接:SOJ D1110 给定一个由不同小写字母构成的长度不超过 8 8 8 的字符串 x x x,现在要将该字符串的字符依次压入栈中,然后再全部弹出。要求左边的字…...

java快速输入

带解析 package Month3; import java.util.*; import java.io.*; public class Demo100843 {static class Reader{BufferedReader bf new BufferedReader(new InputStreamReader(System.in));StringTokenizer st new StringTokenizer("");String next() throws IO…...

C/C++蓝桥杯算法真题打卡(Day3)

一、P8598 [蓝桥杯 2013 省 AB] 错误票据 - 洛谷 算法代码&#xff1a; #include<bits/stdc.h> using namespace std;int main() {int N;cin >> N; // 读取数据行数unordered_map<int, int> idCount; // 用于统计每个ID出现的次数vector<int> ids; …...

AntV_G6实现UI树

UI 树的实现 背景 目前需要实现一个 UI 树&#xff0c;用于展示设备树&#xff0c;以及设备树中设备的属性。与树状列表不同&#xff0c;UI 树需要有特定的交互方式&#xff0c;支持边以及当前节点的点击事件。 实现效果【复制到.html文件夹就看见了】 总体效果 点击节点效果…...

【0016】Python数据类型-不可变集合详解

如果你觉得我的文章写的不错&#xff0c;请关注我哟&#xff0c;请点赞、评论&#xff0c;收藏此文章&#xff0c;谢谢&#xff01; 本文内容体系结构如下&#xff1a; 在Python中&#xff0c;除了我们常见的可变集合&#xff08;Set&#xff09;外&#xff0c;还有一种不可…...

学习资料电子版 免费下载的网盘网站(非常全!)

我分享一个私人收藏的电子书免费下载的网盘网站&#xff08;学习资料为主&#xff09;&#xff1a; link3.cc/sbook123 所有资料都保存在网盘了&#xff0c;直接转存即可&#xff0c;非常的便利&#xff01; 包括了少儿&#xff0c;小学&#xff0c;初中&#xff0c;中职&am…...

ROS2学习笔记2

前言 本篇文章属于ROS2humble的学习笔记&#xff0c;来源于B站鱼香ROSup主。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 《ROS 2机器人开发从入门到实践》课程介绍_哔哩哔哩_bilibili …...

为什么大模型网站使用 SSE 而不是 WebSocket?

在大模型网站&#xff08;如 ChatGPT、Claude、Gemini 等&#xff09;中&#xff0c;前端通常使用 EventSource&#xff08;Server-Sent Events, SSE&#xff09; 来与后端对接&#xff0c;而不是 WebSocket。这是因为 SSE 更适合类似流式文本生成的场景。下面我们详细对比 SSE…...

利用阿里云Atlas地区选择器与Plotly.js实现数据可视化与交互

在数据科学与可视化领域&#xff0c;交互式图表和地图应用越来越成为数据分析和展示的重要手段。本文将介绍如何结合阿里云Atlas地区选择器与Plotly.js&#xff0c;创建动态交互式的数据可视化应用。 一、阿里云Atlas地区选择器简介 阿里云Atlas是阿里云的一款数据可视化产品…...

尚硅谷TS快速入门笔记(个人笔记用)

TypeScript 快速上手 &#x1faa9; 禹神&#xff1a;三小时快速上手TypeScript&#xff0c;TS速通教程_哔哩哔哩_bilibili ⼀、TypeScript 简介 TypeScript 由微软开发,是基于 JavaScript 的⼀个扩展语⾔。 TypeScript 包含了 JavaScript 的所有内容,即: TypeScript 是 Jav…...

python: DDD+ORM using oracle 21c

sql script: create table GEOVINDU.School --創建表 ( SchoolId char(5) NOT NULL, -- SchoolName nvarchar2(500) NOT NULL, SchoolTelNo varchar(8) NULL, PRIMARY KEY (SchoolId) --#主鍵 );create table GEOVINDU.Teacher ( TeacherId char(5) NOT NULL , TeacherFirstNa…...

KidneyTalk-open系统,RAG在医疗场景的真实落地:用于解决肾脏疾病的医疗问答问题

如何在保护隐私的前提下,本地部署大型语言模型(LLMs),以支持肾脏疾病的医学决策支持。难点包括:云端LLMs的数据泄露风险、本地部署的复杂性、通用LLMs在医学知识整合方面的不足、检索增强系统在医学文档处理和临床可用性方面的挣扎。Med-PaLM 2和MedFound在医学问答和临床…...