进程间通信--管道【Linux操作系统】
文章目录
- 进程间通信(IPC)
- 进程间通信的目的
- 1. 数据交换
- 2. 资源共享
- 3. 进程协同
- 4. 系统解耦
- 5. 分布式计算
- IPC 的典型方式对比
- 总结
- 进程间通信的前提
- 匿名管道
- 匿名管道的原理
- 创建匿名管道的过程
- 如果不关闭不需要的读写端会怎样?
- 为什么父进程要同时以只读方式和只写方式同时打开内存文件呢?
- 匿名管道相关系统调用
- pipe
- 命名管道
- 命名管道的原理
- 命名管道搭建过程
- 两个进程如何知道命名管道的路径呢?
- 那么两个进程通信要通信时,命名管道由谁创建呢?
- 命名管道相关系统调用
- 所以命名管道搭建过程如下
- 管道的现象和特性(匿名和命名管道都有)
- 管道的现象
- 管道的特性
进程间通信(IPC)
进程间通信的目的
进程间通信的目的是让运行在操作系统中的多个进程能够交换数据、协调行为、共享资源,从而实现复杂的系统功能。
1. 数据交换
- 目的:不同进程之间传递结构化或非结构化数据
- 场景:
- 管道:父进程将数据通过管道传递给子进程
- 消息队列:异步发送日志信息或任务指令(如分布式系统中的任务调度)
- 套接字:跨网络传输数据(如客户端与服务器通信)
2. 资源共享
- 目的:多个进程共同访问同一资源,避免重复分配或冲突
- 场景:
- 共享内存:高速读写同一块内存(如数据库缓存、实时图像处理)
- 内存映射文件:多个进程加载同一文件到内存(如日志分析工具并行处理日志)
3. 进程协同
- 目的:协调多个进程的执行顺序或互斥访问资源
- 场景:
- 信号量:控制对共享资源的访问(如多进程写入同一文件时的互斥锁)
4. 系统解耦
- 目的:分离不同功能模块,提升系统可维护性和扩展性
- 场景:
- 微服务架构:通过消息队列(如 RabbitMQ)解耦服务间的调用
- 插件化设计:主进程通过 IPC 与插件进程通信
5. 分布式计算
- 目的:跨物理机器或虚拟节点协作完成任务
- 场景:
- MPI(Message Passing Interface):高性能计算集群中进程间通信
- RPC(Remote Procedure Call):远程调用其他机器的服务(如分布式数据库查询)
IPC 的典型方式对比
机制 | 用途 | 特点 | 示例场景 |
---|---|---|---|
管道 | 单向数据流 | 简单、父子进程专用 | Shell 命令组合 (`cmd1 |
共享内存 | 高速数据共享 | 零拷贝、需同步机制 | 实时音视频处理 |
消息队列 | 异步通信 | 结构化消息、内核持久化 | 任务调度系统 |
信号量 | 同步与互斥 | 原子操作、控制资源访问 | 多进程写入同一文件 |
套接字 | 跨网络通信 | 灵活、支持复杂协议 | Web 服务器与客户端通信 |
信号 | 简单事件通知 | 异步、无数据负载 | 强制终止进程 (kill -9 ) |
总结
进程间通信的本质是打破进程隔离性,实现:
- 数据流动:传递信息,支持协作
- 资源共享:避免冗余,提升效率
- 行为协调:同步操作,防止竞态条件
选择合适的 IPC 机制需权衡 性能需求、开发复杂度、系统架构,例如:
- 本地高性能:优先共享内存 + 信号量
- 跨网络扩展:选择套接字或 RPC
- 简单通知:使用信号或管道
进程间通信的前提
因为进程具有独立性,所以进程的信息具有独立性
所以进程之间想直接通信是不可能
的
进程之间通信的前提是有不同的进程能看到同一份资源的平台
这份资源肯定不能由进程提供,因为进程具有独立性,所以进程提供的一切信息都是独立的
所以进程间通信的核心思想就是:
由操作系统提供一个公共平台,不同进程向这个平台写入/读取信息
匿名管道
匿名管道的原理
struct files_struct子进程自己也要拥有独立的一份
为什么?
-
因为struct files_struct的作用是,管理进程打开的文件,
属于进程的范畴
,子进程是一个独立的进程,所以它应该有 -
进程具有独立性
,子进程如果再打开/关闭了文件,肯定不能影响父进程,所以子进程自己得有一份
在内存中,一个文件的内容和属性不会被重复加载
即一个被打开的文件只会出现一份inode,一份内核级缓冲区
所有打开这个文件的进程,共用一个inode和文件内核级缓冲区
所以子进程和父进程共用同一个inode和文件内核级缓冲区
两个进程打开同一个文件时,文件的struct flie不是共享的
为什么?
-
不同进程虽然打开了同一个文件,但是打开方式可能不同
struct file中有一个标志位,表示打开的方式 -
读写位置不同
进程虽然打开的是同一个文件,但大部分情况下对它的读写位置是不同的
struct file中有一个记录文件读写指针位置
所以子进程自己拥有独立的struct file
为什么同一个文件的struct file不是共享的,而inode是共享的?
因为inode
记录的是文件要存储在磁盘中的属性
(文件的权限,大小等),是静态的
,共享的
而struct file
记录的是文件打开后,进程动态操作文件时
,文件的动态地属性信息(文件读写指针的位置等属性信息)
所以
此时子进程和父进程就可以通过各自的struct file对同一个文件内核级缓冲区
进行读写了,并且还可以使用文件读写指针进行精确的读写
这也就达成了进程间通信的前提,不同的进程看到同一份资源
此时父子进程不就可以借助文件内核级缓冲区进行通新了吗?
我们如果想把文件级内核缓冲区作为进程间通信的平台,那它里面的数据肯定不能再刷新到磁盘了
所以Linux设计了一种纯内存级
的文件,并设置了对应的系统调用
也就是它里面的数据只保存的内存中,不会保存到磁盘中
这个纯内存级别的文件,就叫管道
创建匿名管道的过程
-
父进程以
只读方式和只写方式
,使用特殊系统调用打开同一个纯内存级别的文件 但是操作系统会创建两个struct file
指向一个文件的内核级缓冲区 -
父进程创建子进程,
子进程继承父进程的文件描述符表
,也就让子进程也以只读方式和只写方式打开了那个内存级文件 -
父子进程分别关闭一个不需要的读(写)端,做出一个“单向的管道”
因为
规定管道只能单向通信
(只能从a进程向b进程传输数据,不能反过来,除非再创建一个从b到a的管道)
然后父(子)进程就可以使用系统调用write(read)加文件描述符,把数据写入到文件内核级缓冲区,进行通信了
如果不关闭不需要的读写端会怎样?
①虽然依旧可以通信,但是会有风险,可能会误操作(把读操作搞成写操作等),破坏管道结构
②不关闭不需要的读写端,会占用文件描述符,是一种资源浪费
也就是文件描述符泄露
为什么父进程要同时以只读方式和只写方式同时打开内存文件呢?
①如果只是以r方式打开内存文件,那么子进程继承到的struct file里面的flag就也只能是r,就没人能写了
只以w的方式打开同理
②如果父进程以rw的方式打开一个struct file,父子就都能读写了,会权限放大,违反管道的通信规则(只能单向通信)
匿名管道相关系统调用
pipe
头文件:unistd.h
返回值:int类型
①成功返回0
②失败返回-1
参数表:int pipefd[2]
输出型参数,会把以读写方式打开内存文件的文件描述符带出来
pipefd[0]:读端的文件描述符
pipefd[1]:写端的文件描述符
(记巧:可以把1看作笔,笔是用来写[w]的
)
作用:打开(创建)一个匿名管道(内存文件)
命名管道
例
命名管道的文件类型是p
(类似目录的文件类型是d)
命名管道的文件本质就是一个标识符
是让多个进程可以通过命名管道文件找到同一个内核级文件缓冲区
命名管道的原理
为什么叫命名管道?
因为命名管道对应的文件虽然是存储在内存中的一个文件,它有自己的路径,文件名和inode
所以任何一个命名管道在内存中都具有唯一性
所以可以让不同进程,通过同一条路径找到同一个命名管道,借此进行通信
命名管道虽然有文件名和inode
但是磁盘中只有它的属性(其实就是inode)没有内容
因为
①命名管道也和匿名管道一样,内核级文件缓冲区中的内容不会刷新到磁盘
②要使用命名管道的文件名,inode,路径才能让进程找到命名管道
所以命名管道的原理很简单:
不同进程通过同一路径找到命名管道,然后一个以读方式打开,一个以写方式打开,然后看到同一个内核文件缓冲区了,就可以使用read和write通过文件内核级缓冲区进行通信
两个进程如何知道命名管道的路径呢?
创建一个共享的头文件,在里面定义全局变量,表示命名管道的路径,命名管道的起始权限等等共享信息
并让两个进程都包含这个头文件
命名管道搭建过程
两个进程如何知道命名管道的路径呢?
创建一个共享的头文件,在里面定义全局变量,表示命名管道的路径,命名管道的起始权限等等共享信息
并让两个进程都包含这个头文件
那么两个进程通信要通信时,命名管道由谁创建呢?
其实都可以
像命名管道这样的公共资源,一般是让一个指定的进程使用系统调用先行创建
怎么先行创建?
可以封装一个类,在这个类的构造里面使用mkfifo创建命名管道
如果需要还可以在它的析构里面使用unlink把命名管道删除
然后在那个指定进程的全局定义一个这个类的对象,这样进程启动之后,就会第一时间创建对象,就会调用它的构造
然后先启动这个进程创建命名管道,再启动其他进程
命名管道相关系统调用
函数:mkfifo
头文件:sys/types.h和sys/stat.h
返回值:int类型
①成功返回0
②失败返回-1
参数表:
①path:带路径的文件名
②mode:命名管道的最初默认权限[所以还会受umask影响](用4个8进制位表示权限)
作用:在指定目录下创建一个命名管道
系统调用:unlink
头文件:unistd.h
返回值:int类型
①成功返回0
②失败返回-1
参数表:
path:带路径的文件名
作用:删除一个指定路径的文件(包括命名管道)
所以命名管道搭建过程如下
- 创建一个共享的头文件,在里面定义全局变量,表示命名管道的路径,命名管道的起始权限等等共享信息 并让两个进程都包含这个头文件
- 指定一个进程使用通过路径+mkfifo创建命名管道,并且先让这个进程运行
- 两个进程都通过路径找到命名管道,再使用open分别以读方式和写方式打开命名管道
- 两个进程通过系统调用read和write进行通信
管道的现象和特性(匿名和命名管道都有)
进程间通信的前提是:
让不同的进程看到同一份资源
所以这一份资源是多个进程共享的
是共享的而且还是资源,那不加以管控的话,肯定的会出问题
比如
①进程a要写给进程b的资源,进程c看见了就直接拿走了
②进程a写了一半,进程b就等不及地把数据读走了
等等数据不一致问题
所以要正确使用共享资源的话,就必须对共享资源进行保护[被保护的共享资源,称为临界资源]
管道自己就会把共享资源保护起来,保障进程通信的安全
管道的现象
当管道为空并且管道正常时,read(读端)会阻塞
- 为什么?
因为管道本质是一块物理内存,管道为空还去读,读到的要吗是乱码(还没初始化)要吗就是已经被读取过但还没被覆盖掉的过期信息 - 如何做到?
因为管道是操作系统创建的,并且read也是系统调用,所以操作系统管理着它们两个的信息
操作系统当然也就可以知道管道是否为空,是否正常
为空的时候,就把要read的进程链接到管道的struct file中的等待队列中,就阻塞住了
等到管道有数据,再把进程放回运行队列,读取数据
- 为什么?
当管道写满了并且管道正常时,write(写端)会阻塞
管道中的数据是有最大上限的,不同平台上限可能不同,但是都有上限
所以管道写满了的话,就不能再写了,不然要吗越界访问,要吗覆盖原来的数据,都是不行的
当管道写端关闭并且管道读端正常时,如果此时管道为空的话,读端再读也只会读取到文件结束标志表示管道断开,并且会直接返回,不会阻塞
如果发生这种情况,因为管道中可能还有数据没读完,所以暂时还可以read读取它
但是read系统调用的返回值为0时,数据就一定读取完了
而此时
写端关闭了,管道中不可能再有数据了
使用if判断,当read返回值为0时就表示管道断开了,手动关闭读端,结束通信
当管道读端关闭并且管道写端正常时,操作系统会自动杀掉向管道write的进程
因为读端关闭之后,没有人能再从管道读,所以再向管道写就一定是白忙活,浪费时间
操作系统不会做任何浪费时间/空间的工作
所以操作系统一旦检查到这个情况,就直接使用kill的13号信号SIGPIPE,把进程杀掉了
管道的特性
面向字节流
即
从管道读数据的进程,只关心自己要读多少字节,不关心写端写了多少次
向管道写数据的进程,只关心自己要写多少字节,不关心读端要读多少次
这样的好处是:解藕
写端只管自己写,读端只管从管道读
不是写端一次写多少,读端就得一次读多少
用于拥有血缘关系的进程之间的通信
(匿名管道的特性)
因为匿名管道的原理就是,通过子进程会继承父进程资源的特性实现的
所以有血缘关系的进程(父子进程,兄弟进程,爷孙进程等)理论上都能通过匿名管道通信
只要利用继承特性,让它们看到同一个内核文件缓冲区就行
管道的生命周期随进程
因为打开的文件的生命周期随进程,而管道本质是内存文件
所以当所有打开管道的进程都没了或者管道的所有读写端都关闭了管道就会被释放
一个管道只能单向通信
,这是规定
所以要双向通信,就可以在两个进程之间接两个管道
管道自带同步互斥等保护共享资源的机制
单次写入/读取的数据的字节,小于PIPE_BUF(宏),那么这个写入操作就具有不可被拆分的原子性
PIPE_BUF是一个宏变量,一般是4096
也就是如果单次write写入到字节数小于PIPE_BUF,那么它就是安全的
不可能出现write写到一半,就被其他进程读走了
相关文章:
进程间通信--管道【Linux操作系统】
文章目录 进程间通信(IPC)进程间通信的目的1. 数据交换2. 资源共享3. 进程协同4. 系统解耦5. 分布式计算IPC 的典型方式对比总结 进程间通信的前提 匿名管道匿名管道的原理创建匿名管道的过程如果不关闭不需要的读写端会怎样?为什么父进程要同…...
模型实时自主训练系统设计
模型实时自主训练系统设计 一、系统架构 #mermaid-svg-MLuTBuo7ehvStoqS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-MLuTBuo7ehvStoqS .error-icon{fill:#552222;}#mermaid-svg-MLuTBuo7ehvStoqS .error-text{f…...
5.1 神经网络: 层和块
1 层(Layer) 1.1 定义 层是深度学习模型中的基本构建单元,它由一组神经元组成,负责对输入数据进行特定的数学运算和变换,以提取数据的某种特征或表示。每一层可以看作是一个函数,它接收输入数据ÿ…...
鸿蒙系统使用ArkTS开发语言支持身份证阅读器、社保卡读卡器等调用二次开发SDK
har库导入: { "license": "", "devDependencies": {}, "author": "", "name": "entry", "description": "Please describe the basic information.", &qu…...
【Bootstrap V4系列】学习入门教程之 组件-输入组(Input group)
Bootstrap V4系列 学习入门教程之 组件-输入组(Input group) 输入组(Input group)Basic example一、Wrapping 包装二、Sizing 尺寸三、Multiple inputs 多输入四、Multiple addons 多个插件五、Button addons 按钮插件六、Buttons with dropdowns 带下拉按钮七、Custom for…...
图像处理篇--- HTTP|RTSP|MJPEG视频流格式
文章目录 前言一、MJPEG (Motion JPEG)基本概念技术特点编码方式传输协议数据格式 优势实现简单低延迟兼容性好容错性强 劣势带宽效率低不支持音频缺乏标准控制 典型应用 二、RTSP (Real Time Streaming Protocol)基本概念技术特点协议栈工作流程传输模式 优势专业流媒体支持高…...
`RotationTransition` 是 Flutter 中的一个动画组件,用于实现旋转动画效果
RotationTransition 是 Flutter 中的一个动画组件,用于实现旋转动画效果。它允许你对子组件进行动态的旋转变换,从而实现平滑的动画效果。RotationTransition 通常与 AnimationController 和 Tween 一起使用,以控制动画的开始、结束和过渡效果…...
养生:开启健康生活的密钥
在快节奏的现代生活中,养生已成为追求健康的重要方式。从饮食、运动到生活习惯,每一个细节都关乎身体的健康。以下为你介绍科学养生的实用方法,助你打造健康生活。 饮食养生:均衡营养,滋养身体 合理的饮食是养生的基…...
大模型微调算法原理:从通用到专用的桥梁
前言 本文聚焦大模型落地中的核心矛盾——理论快速发展与实际应用需求之间的脱节,并系统探讨微调技术作为解决这一矛盾的关键手段。尽管大模型展现出强大的通用能力,但其在垂直领域的直接应用仍面临适配性不足、计算成本高等挑战。微调通过在预训练模型基础上进行针对性优化,…...
引言:Client Hello 为何是 HTTPS 安全的核心?
当用户在浏览器中输入 https:// 时,看似简单的操作背后,隐藏着一场加密通信的“暗战”。Client Hello 作为 TLS 握手的首个消息,不仅决定了后续通信的加密强度,还可能成为攻击者的突破口。据统计,超过 35% 的网站因 TL…...
深度学习中的目标检测:从 PR 曲线到 AP
深度学习中的目标检测:从 PR 曲线到 AP 在目标检测任务中,评估模型的性能是非常重要的。通过使用不同的评估指标和标准,我们可以量化模型的准确性与效果。今天我们将重点讨论 PR 曲线(Precision-Recall Curve)、平均精…...
测试左移系列-产品经理实战-实战认知1
课程:B站大学 记录产品经理实战项目系统性学习,从产品思维,用户画像,用户体验,增长数据驱动等不同方向理解产品,从0到1去理解产品从需求到落地的全过程,测试左移方向(靠近需求、设计…...
数据集-目标检测系列- 烟雾 检测数据集 smoke >> DataBall
数据集-目标检测系列- 消防 浓烟 检测数据集 smoke>> DataBall 数据集-目标检测系列- 烟雾 检测数据集 smoke >> DataBall * 相关项目 1)数据集可视化项目:gitcode: https://gitcode.com/DataBall/DataBall-detections-10…...
概率论与数理统计基础学习大纲
📅 课程规划 阶段一:基础入门(第1-3周) 目标:掌握概率基础和基本分布 核心知识点: 概率论的基本概念:随机事件、样本空间、概率公理条件概率与全概率公式:贝叶斯公式、事件独立性随机变量与分布:离散型和连续型随机变量常见分布: 离散:二项分布、泊松分布连续:…...
5大B2B数字营销社群营销标杆案例TOB企业数字化营销内容营销AI营销培训讲师培训师专家顾问唐兴通分享
全球B2B数字营销领域的企业社区(或BBS)标杆案例 在全球TOB(企业对企业)和B2B数字营销实践中,构建企业社区或在线论坛(BBS的现代演变)已成为增强客户关系、驱动产品采用、获取市场洞察和 genera…...
OC语言学习——Foundation框架(上)
一、字符串 NSString代表字符序列不可变的字符串,而NSMutable代表字符序列可变的字符串。 1.1 NSString字符串及功能 通过NSString,我们可以: 1、创建字符串。2、读取文件或网络URL来初始化字符串,或者将字符串写入文件或URL。3…...
【Linux】基础 IO(一)
📝前言: 这篇文章我们来讲讲Linux——基础IO主要包括: 文件基本概念回顾 C文件的操作介绍系统关于文件的基本操作 🎬个人简介:努力学习ing 📋个人专栏:Linux 🎀CSDN主页 愚润求学 …...
ODA服务器计算节点本地硬盘状态异常的处理
近期,在系统巡检过程中发现一个客户的ODA服务器本地硬盘节点出现告警,ODAX8 X9等,本地硬盘是使用的240GB M.2接口的SSD盘(卡式)的,这个没有外置的指示灯可以从服务器前面板查看,打开服务器机箱盖…...
图像处理篇---opencv实现坐姿检测
文章目录 前言一、方法概述使用OpenCV和MediaPipe关键点检测角度计算姿态评估 二、完整代码实现三、代码说明PostureDetector类find_pose()get_landmarks()cakculate_angle()evaluate_posture() 坐姿评估标准(可进行参数调整):可视化功能&…...
微调ModernBERT为大型语言模型打造高效“过滤器”
ModernBERT(2024 年 12 月)是最近发布的小型语言模型,由 Answer.AI、LightOn 和 HuggingFace 共同开发。它利用了现代优化技术,如用于 8,192 token 上下文窗口的 RoPE 和 GeGLU layers,在保持效率的同时提升性能。jina…...
【C++指南】STL容器的安全革命:如何封装Vector杜绝越界访问与迭代器失效?
🌟 各位看官好,我是egoist2023! 🌍 种一棵树最好是十年前,其次是现在! 🚀 使用STL的三个境界:能用,明理,能扩展 👍 如果觉得这篇文章有帮助&#…...
Linux在web下http加密和配置虚拟主机及动态页面发布
web服务器的数据加密 1.简介:由于http协议以明文方式发送,不提供任何方式的数据加密,也不适合传输一些重要的信息,如银行卡号、密码等,解决该缺陷设计了安全套接字层超文本传输协议https; 2.https的握手流…...
8.2.CICD自动化
目录 一、持续集成(CI)核心实践 代码质量管理 • 静态代码分析:SonarQube规则定制(安全漏洞、代码异味检测) • 单元测试覆盖率:Jacoco报告生成与阈值控制(覆盖率≥80%) • 代码风格…...
解密数据结构之位图和布隆过滤器
位图和布隆过滤器 前言:笔者在前面分享过哈希的知识,但是笔者在哈希那篇博客中并没有给出哈希的应用场景,今天笔者分享的知识是关于哈希的应用,也就是大名鼎鼎的位图和布隆过滤器。1.位图的定义位图解决 2.位图实现1.先使用命名空间封装&…...
《从零构建大模型》PDF下载(中文版、英文版)
内容简介 本书是关于如何从零开始构建大模型的指南,由畅销书作家塞巴斯蒂安• 拉施卡撰写,通过清晰的文字、图表和实例,逐步指导读者创建自己的大模型。在本书中,读者将学习如何规划和编写大模型的各个组成部分、为大模型训练准备…...
Linux的web服务器的部署和优化
http中访问请求中I/O结构 在HTTP协议中,I/O(输入/输出)结构主要涉及客户端与服务器之间的请求和响应交互。以下是HTTP请求和响应的基本结构及其关键组成部分: HTTP请求结构 HTTP请求由请求行、请求头和请求体三部分组成 请求行…...
vue2 上传pdf,拖拽盖章,下载图片
效果图片: 不多废话上代码: <template><div class"pdf-stamp" onbeforecopyreturn false onselectdocument.selection.empty() ondragstartreturn false onselectstart return false ><div class"scroll-box" scro…...
MindSpore框架学习项目-ResNet药物分类-模型训练
目录 3.模型训练 3.1模型训练 3.1.1 定义优化器和损失函数 定义优化器和损失函数代码解析 3.1.2定义训练、推理函数 定义训练、推理函数代码解释 3.2模型保存 模型保存代码说明 3.3绘制acc和loss的曲线 参考内容: 昇思MindSpore | 全场景AI框架 | 昇思Mind…...
Jsp技术入门指南【十二】自定义标签
Jsp技术入门指南【十二】自定义标签 前言一、什么是标签二、标签的类型有哪些?1. 空标签2. 带有属性的标签3. 带主体的标签 三、自定义标签的部件3.1 自定义标签的四步骤3.2 标签处理程序3.3 自定义标签的开发及使用步骤第一步:创建标签助手类第二步&…...
数据库故障排查指南:从连接问题和性能优化
数据库作为现代应用程序的核心组件,其稳定性和性能直接影响整个系统的运行。然而,数据库在运行过程中常常会遇到各种故障,如连接失败、性能下降、数据不一致等问题。本文将从实际问题出发,结合代码示例和工具使用,系统…...
材料创新与工艺升级——猎板PCB引领高频阻抗板制造革命
在5G通信、AI服务器和自动驾驶的推动下,高频电路对信号完整性的要求日益严苛。猎板PCB作为国内高端PCB制造的标杆企业,通过材料创新与工艺革新,实现了阻抗控制的突破性进展,为行业树立了新标杆。 1. 高频材料的突破 传统FR-4基材…...
GitHub 趋势日报 (2025年05月09日)
本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1voideditor/void⭐ 1879⭐ 15214TypeScript2ruanyf/weekly科技爱好者周刊&…...
SaaS场快订平台项目说明【持续更新】
一、项目介绍 SaaS场快订平台是一个高效、便捷的体育场馆在线预订平台。本项目采用SaaS方式开发,用户不需要安装软件,直接通过互联网访问在线程序即可使用。本项目主要构建了一个体育馆预订系统,项目的功能主要包括:用户注册与登…...
PyTorch API 7 - TorchScript、hub、矩阵、打包、profile
文章目录 torch.hub发布模型如何实现入口点?重要通知 从Hub加载模型运行加载的模型:下载的模型保存在哪里?缓存逻辑已知限制: TorchScript创建 TorchScript 代码混合使用追踪与脚本化TorchScript 语言内置函数与模块PyTorch 函数与…...
OpenVLA:开源的视觉-语言-动作模型
1. 简介 让我们先来介绍一下什么是OpenVLA,在这里: https://openvla.github.io/ 可以看到他们的论文、数据、模型。 OpenVLA 是一个拥有 70亿参数的开源 **视觉-语言-动作(VLA)**模型。它是在 Open X-Embodiment 数据集 中的 97万…...
android HashMap和List该如何选择
目录 一,ArrayList 1.1 数组 1.2 扩容 1.3 查询 1.4 插入,删除 1.5 小结 二,LinkedList 2.1 链表 2.2 查找 2.3 插入 2.4 小结 三,HashMap 扩容 四,SparseArray 五,ArrayMap 一,ArrayList 1.…...
Visual Studio 2022 远程调试
Visual Studio 2022 远程调试全过程 这篇文章尽可能地精细记录如何使用 Visual Studio 2022 完成 Windows 系统上的远程调试。适用场景包括本地编译,远程运行,两台机器分工合作调试。 一、设备网络通信环境 1.1 确保两台设备通信 本地设备: 安装 Visu…...
Linux:线程同步与互斥
目录 线程互斥 锁 初始化 销毁 加锁 解锁 线程同步 条件变量 初始化 销毁 等待条件满足 唤醒等待 pthread_cond_signal pthread_cond_broadcast 生产者消费者模型 3种关系 2种角色 1个交易场所 POSIX信号量 初始化 销毁 等待 发布 线程互斥 互斥相关…...
Kotlin Android LeakCanary内存泄漏检测实战
在Kotlin Android应用中使用LeakCanary检测内存泄漏的步骤如下: 1. 添加依赖 在模块的build.gradle文件中添加LeakCanary依赖: dependencies {debugImplementation com.squareup.leakcanary:leakcanary-android:2.12 // 使用最新版本 }2. 自动初始化&…...
MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?
在 MySQL 中,COUNT(*)、COUNT(1) 和 COUNT(字段名) 的核心区别在于 统计逻辑 和 性能表现,具体如下: 1. 统计逻辑差异 函数形式统计规则COUNT(*)统计表中所有行的数量,忽略字段值是否为 NULL(包括主键、非主键、NULL …...
CAD属性图框值与Excel联动(CAD块属性导出Excel、excel更新CAD块属性)——CAD c#二次开发
CAD插件实现块属性值与excel的互动,效果如下: 加载dll插件(CAD 命令行输入netload ,运行xx即可导出Excel,运行xx1即可根据excel更新dwg块属性值。) 部分代码如下 // 4. 开启事务更新CAD数据using (Transact…...
青少年编程与数学 02-019 Rust 编程基础 05课题、复合数据类型
青少年编程与数学 02-019 Rust 编程基础 05课题、复合数据类型 一、元组(Tuple)(一)元组的定义(二)创建元组示例 (三)解构元组示例 (四)使用点号语法访问元组…...
51单片机入门教程——AT24C02数据存储
前言 本教程基于B站江协科技课程进行个人学习整理,专为拥有C语言基础的零基础入门51单片机新手设计。既帮助解决因时间差导致的设备迭代调试难题,也助力新手快速掌握51单片机核心知识,实现从C语言理论到单片机实践应用的高效过渡 。 目录 …...
cdn 是什么?
内容分发网络,Content Delivery Network 介绍 CDN(Content Delivery Network)是一种将内容分发到靠近用户的边缘服务器,以加速访问速度、减少延迟、降低源站压力的网络系统。 CDN 把网站的静态资源(如 HTML、JS、CSS、…...
ENSP三层交换机实验原理及过程
华为eNSP(Enterprise Network Simulation Platform)是一款网络仿真工具,用于模拟华为网络设备的配置和操作。在三层交换机实验中,主要涉及三层交换机的路由功能、VLAN间通信、静态路由、动态路由协议(如OSPF、RIP&…...
RK3568-OpenHarmony(1) : OpenHarmony 5.1的编译
概述: 本文主要描述了,如何在ubuntu-20.04操作系统上,编译RK3568平台的OpenHarmony 5.1版本。 搭建编译环境 a. 安装软件包 sudo apt-get install git-lfs ruby genext2fs build-essential git curl libncurses5-dev libncursesw5-dev openjdk-11-jd…...
动态路由EIGRP的配置
动态路由EIGRP的配置 动态路由EIGRP:增强内部网关协议 为何收敛快、不成环? 路由计算的无环路和路由的收敛速度是路由计算的重要指标。EIGRP协议由于使用了DUAL算法,使得EIGRP协议在路由计算中不可能有环路路由产生,同时路由计…...
Paging 3.0 + Kotlin 分页加载指南
Paging 3.0 是 Android Jetpack 组件中用于高效分页加载数据的现代化方案,结合 Kotlin 协程和 Flow 特性,能够显著简化分页逻辑的实现。以下是完整的实现指南和最佳实践: 一、Paging 3.0 核心优势 内置加载状态管理:自动跟踪加载…...
湖南(源点咨询)市场调研 商业综合体定位调研分享(下篇)
接着中篇,我们就要重点分析一下该地区消费者的特点: 综合来看,本地区还是以中等收入工薪阶层的新市民家庭为主,以亲子关系为家庭核心,居住条件改善、生活向好,渴望公共配套的提升丰富生活质感,…...
vue 中的ref
vue 中的ref vue 中的ref 1. ref ** 的基本作用** 在 Vue 中,ref 是用来获取 DOM 元素或者组件实例的一种方式。对于 <el-form> 组件,通过 ref 可以获取到该表单组件的实例,进而调用表单组件提供的各种方法和访问其属性。 …...