写时拷贝技术
目录
写时拷贝
核心思想
基本原理
基本过程
一个例子深入理解
补充知识--引用计数
小总结
写时拷贝实现
宏观理解(进程、线程角度)
资源共享
只读访问
写操作触发拷贝
独立修改
微观理解(fork系统调用角度)
进程创建(fork)时的内存映射
补充知识--虚拟内存与物理内存
写操作触发拷贝
内存管理优化
小总结
虚拟内存管理中的写时拷贝
内存映射文件
页面交换和调度
对象拷贝
容器共享
写时拷贝优点
总结
在操作系统中,写时拷贝(Copy-On-Write,COW)是一种优化内存使用的策略,它延迟了数据的复制操作,直到实际需要写入数据时才进行复制。常用于需要大量数据拷贝的场景,以提高程序效率和降低资源消耗。
写时拷贝
核心思想
在多个调用者请求相同资源时,它们会共同获取相同的指针指向相同的资源。直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本给该调用者,而其他调用者所见到的资源仍然保持不变。这个过程对其他调用者是透明的。
基本原理
基本过程
内存管理单元(MMU)是实现写时拷贝的关键。当两个或多个进程共享同一块内存区域时,MMU 会记录该区域的引用计数,并将其标记为只读。
只要没有进程对共享内存区域进行写入操作,就可以一直共享这块内存,避免了不必要的数据拷贝,从而节省内存空间和数据复制的时间成本。
一旦有进程试图对共享内存区域进行写入操作,MMU 会发现该区域被标记为只读,从而触发一个页面错误异常(page fault)。
操作系统内核会捕获这个异常,并根据写时拷贝策略进行处理。内核会为进行写入操作的进程分配新的物理内存页,并将原有共享内存页的内容复制到新的内存页中。这样,进行写入操作的进程就可以在新的内存页上安全地进行修改,而不会影响其他共享该内存区域的进程。
一个例子深入理解
fork创建子进程后,父子进程在内存层面是如何运转的呢???
当父进程调用fork()创建子进程时,内核会将父进程的所有内存页都标记为只读(即共享页面),并增加每个页面的引用计数。在这个过程中,父子进程共享同一份内存页面,可以大幅减少内存占用。
一旦其中一个进程(父进程或子进程)尝试写入某个内存页,就会触发一个保护故障(缺页异常),此时会陷入内核,内核将拦截这个写入操作,检查该页面的引用数:如果引用数大于 1,则会创建该页面的副本,并将引用数减 1,同时恢复这个页面的可写权限,然后重新执行这个写操作;如果页面的引用数只有 1,也就是说该页面只被当前进程引用,那么内核就可以跳过分配新页面的步骤,直接修改该页面,将其标记为可写。
在一般情况下,当子进程通过写时复制机制创建了自己的内存页面副本后,这个副本会一直与父进程的页面保持不一致,直到该子进程退出或被杀死。
补充知识--引用计数
引用计数
在开辟的空间中多维护四个字节来存储引用计数。
两种方法:
①:多开辟四个字节(pCount)的空间,用来记录有多少个指针指向这片空间。
②:在开辟空间的头部预留四个字节的空间来记录有多少个指针指向这片空间。
当我们多开辟一份空间时,让引用计数+1,如果有释放空间,那就让计数-1,但是此时不是真正的释放,是假释放,等到引用计数变为 0 时,才会真正的释放空间。如果有修改或写的操作,那么也让原空间的引用计数-1,并且真正开辟新的空间。
小总结
写实拷贝本质就是等到修改数据时才真正分配内存空间。这是对程序性能的优化,可以延迟甚至是避免内存拷贝,目的就是避免不必要的内存拷贝。
写时拷贝实现
宏观理解(进程、线程角度)
流程:资源共享->只读访问->写操作触发拷贝->独立修改
资源共享
当多个进程或线程需要访问相同的数据时,操作系统会将数据的内存页标记为只读,并让这些进程或线程共享同一块内存。
只读访问
在没有进程或线程修改数据的情况下,只有一份数据存储在内存中,所有共享者都只能进行只读访问。
写操作触发拷贝
当某个进程或线程尝试修改这块共享数据时,会触发一个页面错误(Page Fault),因为内存页被标记为只读。操作系统捕捉到这个错误后,会为该进程或线程分配一块新的内存,并将原始数据拷贝到这块新内存中。
独立修改
经过拷贝操作后,修改数据的进程或线程拥有了数据的独立副本,可以自由地对其进行修改,而不会影响到其他共享者。
拷贝过程如图所示:
微观理解(fork系统调用角度)
进程创建(fork)时的内存映射
虚拟内存映射:在 Linux 中,fork 系统调用创建子进程时,内核为子进程创建与父进程相同的虚拟内存映射。虚拟内存是进程对内存的一种逻辑视图,每个进程都有自己独立的虚拟地址空间。父子进程的虚拟地址空间布局相似,但并不直接对应到相同的物理内存。
页表设置:内核为子进程构建页表,这些页表最初指向与父进程相同的物理内存页面。页表是一种数据结构,用于将虚拟地址映射到物理地址。此时,父子进程共享这些物理内存页面,但这些页面被标记为只读(read - only)。
补充知识--虚拟内存与物理内存
写操作触发拷贝
写保护异常:当父子进程中的任何一个试图对共享的只读物理内存页面进行写操作时,CPU 会检测到写保护异常(因为页面被标记为只读),将控制权交给操作系统内核。
内核处理:内核捕获到写保护异常后,识别出该页面是由于写时拷贝机制而被共享的。内核会为执行写操作的进程分配一个新的物理内存页面。这个新页面是原共享页面的副本。
更新页表:内核更新执行写操作进程的页表,使其指向新分配的物理内存页面,并将该页面标记为可读写(read - write)。这样,该进程就可以在新的页面上进行写操作,而不会影响其他进程(如父子进程中的另一方)对原共享页面的访问。
内存管理优化
减少内存占用:通过写时拷贝技术,在 fork后多个进程可以共享大量的物理内存页面,只有在真正需要修改数据时才会为进程分配额外的物理内存。这大大减少了内存占用,提高了内存利用率。
提高性能:由于减少了 fork时的内存复制操作,fork的执行效率得到提高。同时,写时拷贝技术也减少了内存碎片的产生,因为只有在必要时才分配新的物理内存页面,而不是在进程创建时就分配大量内存。
小总结
1、在Linux系统中,调用fork()系统调用创建子进程时,并不会把父进程所有占用的内存页复制一份,而是与父进程共享相同的内存页,但当子进程或父进程对内存页进行修改时才会进行复制。(换而言是只有进程空间的某页内存的内容发生修改时,才会将父进程的该页内存复制一份给子进程)
2、fork之后,子进程的页表也指向父进程所指向的物理内存页面,并标记为只读!!!
这些共享页标记为写时拷贝,这意味着如果任何一个进程写入共享页面,那么就创建共享页面的副本。
原理如图所示:
虚拟内存管理中的写时拷贝
内存映射文件
当多个进程需要访问同一个文件时,可以通过内存映射技术将文件映射到进程的地址空间,这些进程在没有修改文件的情况下共享相同的内存区域。例如,当进程A和进程B都映射同一个文件到它们的地址空间时,它们共享同一物理内存页面。如果进程A修改该文件的某个页面,操作系统会触发页错误,将该页面拷贝给进程A,而进程B继续使用原始的共享内存页。
页面交换和调度
在虚拟内存管理中,COW可以用于优化页面的交换和调度。当多个进程共享相同的页面时,操作系统可以推迟复制,直到有进程修改页面为止。比如当进程需要访问的页面不在物理内存中时,操作系统会触发缺页中断,此时如果该页面是共享的且未被修改过,操作系统可以从磁盘交换区/文件系统中重新加载该页面,而不会触发复制操作。
对象拷贝
当需要拷贝一个较大的对象时,如果直接进行深拷贝,可能会导致性能下降和内存占用增加。使用写时拷贝策略,可以在对象拷贝时,只是简单地将指针指向相同的内存区域,并增加引用计数。只有当对对象进行修改时,才会触发拷贝操作,真正分配新的内存并复制数据。
容器共享
多个容器(如 vector)可能共享同一块数据内存。在未进行写入操作之前,它们只是共享同一数据,不产生实际的拷贝。一旦对数据进行修改,则会触发拷贝,确保每个容器拥有自己的数据副本。
写时拷贝优点
节省内存 :在不需要对共享数据进行修改的情况下,多个进程或对象可以共享同一内存区域,大大减少了内存的使用量。
提高效率 :避免了在不需要修改数据时的不必要的数据拷贝操作,提高了程序的运行效率,尤其在涉及大量数据拷贝的场景中,效果更为明显。
总结
实际上写时拷贝技术十分应用广泛,Linux下fork()系统调用,string数据结构,智能指针shared_ptr都使用写时拷贝技术解决拷贝问题。
写时拷贝拷贝机制如图所示
相关文章:
写时拷贝技术
目录 写时拷贝 核心思想 基本原理 基本过程 一个例子深入理解 补充知识--引用计数 小总结 写时拷贝实现 宏观理解(进程、线程角度) 资源共享 只读访问 写操作触发拷贝 独立修改 微观理解(fork系统调用角度) 进程创…...
HarmonyOS NEXT开发进阶(十二):build-profile.json5 文件解析
文章目录 一、前言二、Hvigor脚本文件三、任务与任务依赖图四、多模块管理4.1 静态配置模块 五、分模块编译六、配置多目标产物七、配置APP多目标构建产物八、定义 product 中包含的 target九、拓展阅读 一、前言 编译构建工具DevEco Hvigor(以下简称Hvigor&#x…...
ubuntu系统下添加pycharm到快捷启动栏方法
一、背景 之前在ubuntu系统下使用pycharm时,总是要进入/home/dlut/pycharm-community-2022.1/bin文件夹下,然后终端执行命令下面的命令才可修改代码: ./pycharm.sh为了以后方便,这里给出添加pycharm到快捷启动栏的方法 二、添加…...
简述计算机网络中的七层模型和四层模型
在计算机网络中,网络协议栈的设计通常采用分层结构来处理不同的通信任务。常见的分层结构有OSI七层模型和TCP/IP四层模型。虽然它们的层次数量不同,但本质上都在解决如何有效地进行计算机间通信。本文将分别介绍这两种结构的功能和各层的协议。 一、OSI七…...
golang开发支持onlyoffice的token功能
一直都没去弄token这块,想着反正docker run的时候将jwt置为false即可。 看了好多文章,感觉可以试试,但是所有文件几乎都没说思路。 根据我的理解和成功的调试,思路是: 我们先定义2个概念,一个是文档下载…...
【Linux】:封装线程
朋友们、伙计们,我们又见面了,本期来给大家带来封装线程相关的知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数据结…...
OpenCV多分辨率模板匹配与容错优化实战指南
第一章:问题背景与挑战 1.1 传统模板匹配的局限性 模板匹配(Template Matching)是计算机视觉中基础且广泛使用的技术,其核心思想是通过滑动窗口在目标图像中寻找与模板最相似的位置。然而,传统方法(如Ope…...
「为爱发电」的硬核打开方式,涂鸦智能用AIoT引领智慧能源变革
全球能源危机与气候变化的双重压力下,人类正面临着一场前所未有的考验。据国际能源署预测,到2050年,若要实现碳中和目标,清洁能源需贡献全球电力结构的90%以上。在这场关乎人类未来的能源革命中,不仅需要技术创新&…...
uniapp-x 子组件样式覆盖
不支持scoped 默认不支持scoped,所以写也没用 那如果我想修改子孙节点的样式是不是很方便,不需要v-deep了? 的确如此 自带页面样式隔离 在 uni-app x 中,不支持 css scoped,样式的作用范围遵循以下规则:…...
word处理控件Aspose.Words教程:使用 Python 删除 Word 中的空白页
Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。 Aspose API支持流行文件格式处理,并…...
MIDI,AI 3D场景生成技术
MIDI(Multi-Instance Diffusion for Single Image to 3D Scene Generation)是先进的3D场景生成技术,能在短时间内将单张图像转化为高保真度的3D场景。通过智能分割输入图像,识别出场景中的独立元素,再基于多实例扩散模…...
ICLR2025 | SLMRec: 重新思考大语言模型在推荐系统中的价值
note 问题背景:序列推荐(SR)任务旨在预测用户可能的下一个交互项目。近年来,大型语言模型(LLMs)在SR系统中表现出色,但它们巨大的规模使得在实际平台中应用变得低效和不切实际。 研究动机&…...
走路碎步营养补充贴士
走路碎步,这种步伐不稳的现象,在日常生活中并不罕见,特别是对于一些老年人或身体较为虚弱的人来说,更是一种常见的行走状态。然而,这种现象可能不仅仅是肌肉或骨骼的问题,它还可能是身体在向我们发出营养缺…...
【bug日记】 编译错误
在我使用vscode的时候,我想用一个头文件和两个cpp文件,头文件是用来声明一个类的,一个cpp是用来类的成员函数,一个cpp是主函数 但是我写完编译发现会弹出找不到这个类成员函数这个cpp文件,爆出这样的错误 提示我找不到…...
计算机视觉cv2入门之边缘检测
检测原理 边缘检测是指检测图像中的一些像素点,它们周围的像素点的灰度发生了急剧的变化,因此可以将这些像素点作为一个集合,用于标注图像中不同物体的边界。 边缘是图像上灰度级变化很快的点的集合。这些点的梯度往往很大。因此我们可以使用一阶导数和二…...
python脚本实现服务器内存和cpu使用监控,并记录日志,可以设置阈值和采样频率
Python 脚本,实现以下功能: 按日期自动生成日志文件(例如 cpu_mem_20231001.csv)当 CPU 或内存超过阈值时触发记录独立记录报警事件(保存到 alert.log)支持自定义阈值和监控间隔 脚本代码 import psutil …...
解决PC串流至IPad Pro时由于分辨率不一致导致的黑边问题和鼠标滚轮反转问题
问题背景 今天在做 电脑串流ipad pro 的时候发现了2个问题: 1.ipadpro 接上鼠标后,滚轮上下反转,这个是苹果自己的模拟造成的问题,在设置里选择“触控板与鼠标”。 关闭“自然滚动”,就可以让鼠标滚轮正向滚动。 2. ipadpro 分…...
星越L_三角指示牌及危险警示灯使用
目录 1.打开危险警告灯 2.取出反光背心穿上 3.取出指示牌 4.放置三角指示牌。 1.打开危险警示灯 2.取出反光背心穿上 3.取出指示牌...
使用WireShark解密https流量
概述 https协议是在http协议的基础上,使用TLS协议对http数据进行了加密,使得网络通信更加安全。一般情况下,使用WireShark抓取的https流量,数据都是加密的,无法直接查看。但是可以通过以下两种方法,解密抓…...
MySQL复习(检查本地MySQL是否安装、DataGrip数据库可视化工具使用、增删改查基础语法、唯一索引、SQL简单函数)
目录 一、快速检查本地MySQL是否安装。(详细教程) (1)MySQL本地系统环境变量配置。(简单说明) (2)cmd命令行——判断MySQL是否安装成功! 二、DataGrip数据库操作可视化工具。 (1)基本介绍。 &am…...
数学建模 第一节
目录 前言 一 优化模型的类型 二 线性规划1 线性规划2 三 0-1规划 总结 前言 数学建模主要是将问题转化为模型,然后再以编程的形式输出出来 算法都知道,数学建模也需要用到算法,但是不是主要以编程形式展示,而是…...
《Python实战进阶》No24: PyAutoGUI 实现桌面自动化
No24: PyAutoGUI 实现桌面自动化 摘要 PyAutoGUI 是一个跨平台的桌面自动化工具,能够模拟鼠标点击、键盘输入、屏幕截图与图像识别,适用于重复性桌面任务(如表单填写、游戏操作、批量文件处理)。本集通过代码截图输出日志的实战形…...
实验篇| CentOS 7 下 Keepalived + Nginx 实现双机高可用
为什么要做双机高可用? 想象一下:你的网站突然宕机,用户无法访问,订单流失、口碑暴跌…💸 双机热备就是解决这个痛点的终极方案!两台服务器互为备份,724小时无缝切换,保障业务…...
音视频入门基础:RTP专题(19)——FFmpeg源码中,获取RTP的音频信息的实现(下)
本文接着《音视频入门基础:RTP专题(18)——FFmpeg源码中,获取RTP的音频信息的实现(上)》,继续讲解FFmpeg获取SDP描述的RTP流的音频信息到底是从哪个地方获取的。本文的一级标题从“四”开始。 四…...
JAVA面试_进阶部分_dubbo负载均衡策略
前言:zookeeper作为dubbo的注册中心,有一个很重要的点,我们的程序是分布式应用,服务部署在几个节点(服务器)上,当消费者调用服务时,zk返回给dubbo的是一个节点列表,但是d…...
《我的Python觉醒之路》之转型Python(十三)——控制流
#今天风景不错,明天继续学习 请关注我之前的笔记啊...
QT6.8.2在线安装记录
命令行带安装源启动,但仍不能连接到服务器,开着VPN才通过 .\qt-online-installer-windows-x64-4.8.1.exe --mirror https://mirrors.ustc.edu.cn/qtproject 开始安装前断开VPN,其实启动安装器时的镜像源修改参数是起作用的,因为下…...
70.HarmonyOS NEXT PicturePreview组件深度剖析:从架构设计到核心代码实现
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! HarmonyOS NEXT PicturePreview组件深度剖析:从架构设计到核心代码实现 文章目录 HarmonyOS NEXT PicturePreview组件深度剖析…...
如何从受 Cloudflare 保护的网站提取数据:技术与挑战
引言 Web抓取是数据科学和市场研究的重要工具,但当面对受Cloudflare等先进保护系统守护的网站时,这项任务变得异常具有挑战性。Cloudflare的机器人检测系统需要精心设计的网页抓取解决方案才能成功提取数据。本文将介绍Cloudflare的防护机制以及如何使用…...
【DeepSeek应用】DeepSeek模型本地化部署方案及Python实现
DeepSeek实在是太火了,虽然经过扩容和调整,但反应依旧不稳定,甚至小圆圈转半天最后却提示“服务器繁忙,请稍后再试。” 故此,本文通过讲解在本地部署 DeepSeek并配合python代码实现,让你零成本搭建自己的AI助理,无惧任务提交失败的压力。 一、环境准备 1. 安装依赖库 …...
WPF程序使用AutoUpdate实现自动更新
AutoUpdate.NET使用 一、AutoUpdater.NET 简介 AutoUpdater.NET 是一个开源库,支持从各种源(如GitHub、FTP、HTTP服务器等)下载并安装更新。它提供了灵活的配置选项,允许开发者根据需求定制更新检查逻辑和用户体验。 二、安装 …...
A SURVEY ON POST-TRAINING OF LARGE LANGUAGE MODELS——大型语言模型的训练后优化综述——第2部分
3、微调(上一部分内容) 4、LLMs的对齐 大型语言模型(LLMs)中的对齐涉及引导模型输出以符合人类预期和偏好,特别是在安全关键或用户面对的应用程序中。本章讨论了实现对齐的三个主要范式: 带有反馈的人工…...
【2025】Electron Git Desktop 实战一(上)(架构及首页设计开发)
源代码仓库: Github仓库【electron_git】 Commit : bb40040 Github Desktop 页面分析 本节目标: 1、实现类似Github Desktop的「空仓库」提示页 2、添加本地仓库逻辑编写从 Github Desktop 我们看到 他的 主要页面分为三个区域 Head头部区域…...
996引擎-问题处理:缺失特效分割文件 ModelAtlasSplitConfigs
通常我们买的资源都是带会 ModelAtlasSplitConfigs.txt 或 sceneAtlasSplitConfigs.txt 的 但有时确实找不到的话,是可以用996工具生成的:...
2024年12月CCF-GESP编程能力等级认证C++编程三级真题解析
三级真题的难度: CCF-GESP编程能力等级认证的C++三级真题难度通常被认为是中等水平,适合具备一定编程基础的考生。以下是关于三级真题难度的一些具体信息: 1. 考试内容 C++三级考试主要涵盖以下几个方面的知识: 基本语法:包括数据类型、变量、运算符等基础知…...
Java面试八股—Redis篇
一、Redis的使用场景 (一)缓存 1.Redis使用场景缓存 场景:缓存热点数据(如用户信息、商品详情),减少数据库访问压力,提升响应速度。 2.缓存穿透 正常的访问是:根据ID查询文章&…...
机器人ROS学习:Ubuntu22.04安装ROS2和Moveit2实现运动规划
通过本篇文章学习,你可以收获以下内容: 学会在 Ubuntu22.04 上安装 Moveit2学会下载编译运行 Moveit2 样例程序学会使用样例程序进行运动规划等 版本平台 系统版本:ubuntu22.04ROS2 版本:humbleMoveit 版本:moveit2…...
树结构和数组之间的转化
1、树结构转为数组 treeToArray(treeData, returnValue []) { let newValue [...returnValue] treeData.map(item > { if (item.children) { const { children, ...treeObj } { ...item } newValue.push(treeObj) newValue this.treeToArray(children, newValue) } else…...
2024华东师范大学计算机复试上机真题
2024华东师范大学计算机复试机试真题 2023华东师范大学计算机复试机试真题 2022华东师范大学计算机复试机试真题 2024华东师范大学计算机复试上机真题 2023华东师范大学计算机复试上机真题 2022华东师范大学计算机复试上机真题 在线评测:传动门:pgcode…...
Blender-MCP服务源码3-插件开发
Blender-MCP服务源码3-插件开发 Blender-MCP服务源码解读-如何进行Blender插件开发 1-核心知识点 1)使用Blender开发框架学习如何进行Blender调试2)学习目标1-移除所有的Blender业务-了解如何MCP到底做了什么?3)学习目标2-模拟MC…...
C++复试笔记(三)
1.友元函数和友元类 1.1友元函数 友元函数的经典实例是重载 "<<" 和 ">>" ,去重载operator<<,然后发现没办法将operator<<重载成成员函数。因为cout的 输出流对象和隐含的this指针在抢占第一个参数的位置。this指针默…...
【数学基础】概率与统计#1概率论与信息论初步
本系列内容介绍: 主要参考资料: 《深度学习》[美]伊恩古德菲洛 等 著 《机器人数学基础》吴福朝 张铃 著 文章为自学笔记,默认读者有一定的大学数学基础,仅供参考。 目录 随机变量概率分布离散型随机变量和概率质量函数连续型变量…...
掌握这些 UI 交互设计原则,提升产品易用性
在当今数字化时代,用户对于产品的体验要求越来越高,UI 交互设计成为决定产品成败的关键因素之一。一个易用的产品能够让用户轻松、高效地完成各种操作,而实现这一目标的核心在于遵循一系列科学合理的 UI 交互设计原则。本文将详细阐述简洁性、…...
工程化与框架系列(32)--前端测试实践指南
前端测试实践指南 🧪 引言 前端测试是保证应用质量的重要环节。本文将深入探讨前端测试的各个方面,包括单元测试、集成测试、端到端测试等,并提供实用的测试工具和最佳实践。 测试概述 前端测试主要包括以下类型: 单元测试&a…...
Python----计算机视觉处理(opencv:像素,RGB颜色,图像的存储,opencv安装,代码展示)
一、计算机眼中的图像 像素 像素是图像的基本单元,每个像素存储着图像的颜色、亮度和其他特征。一系列像素组合到一起就形成 了完整的图像,在计算机中,图像以像素的形式存在并采用二进制格式进行存储。根据图像的颜色不 同,每个像…...
表单 schema 配置化
一、前沿 基于 Ant Design Vue 组件库实现了表单的配置化生成,通过 schema 配置化的方式实现表单的动态渲染、数据绑定和更新等功能,而提交按钮及获取数据逻辑由使用方自行提供。通过 schema 对象来定义表单的结构和属性,modelData 对象存储…...
Java数据结构第二十三期:Map与Set的高效应用之道(二)
专栏:Java数据结构秘籍 个人主页:手握风云 目录 一、哈希表 1.1. 概念 1.2. 冲突 1.3. 避免冲突 1.4. 解决冲突 1.5. 实现 二、OJ练习 2.1. 只出现一次的数字 2.2. 随机链表的复制 2.3. 宝石与石头 一、哈希表 1.1. 概念 顺序结构以及平衡树中…...
unity生命周期
unity的生命周期 都是有序的1. 实例化与初始化阶段Awake()OnEnable() 2. 开始与更新阶段Start()FixedUpdate()Update()LateUpdate() 3. 渲染阶段OnPreCull()OnBecameVisible() 和 OnBecameInvisible()OnWillRenderObject()OnRenderObject()OnPostRender() 4. 销毁阶段OnDisable…...
对比学习(Contrastive Learning)
1. 概念 对比学习(Contrastive Learning)是一种自监督学习(Self-Supervised Learning)方法,其核心思想是通过相似样本靠近,不同样本远离的方式学习数据的潜在表示。它广泛用于无标签数据的特征提取&#x…...
C语言输入与输出:从零掌握数据的“对话”
手把手教你理解C语言中输入(Input)与输出(Output)的核心操作。 一、输入与输出是什么? C语言通过标准库函数实现程序与用户(或设备)的“对话”: 输出:程序将数据展示给…...