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

深入Linux系列之进程地址空间

深入Linux系列之进程地址空间

1.引入

那么在之前的学习中,我们知道我们创建一个子进程的话,我们可以在代码层面调用fork函数来创建我们的子进程,那么fork函数的返回值根据我们当前所处进程的上下文是返回不同的值,它在父进程中返回子进程的PID,在子进程中则会返回0,那么我们可以利用返回值然后定义一个变量来接收这个返回值,然后通过if else逻辑达到让我们的父子进程有着不同的执行流的目的,那么想必刚才所说的过程对于你来说已经十分熟悉,对于fork函数如何使用也已经轻车熟路,但是在刚才的过程中,我们唯独会有一个疑问,也就是我们定义的一个变量来接收这个返回值,同一个变量在不同的进程中竟然会出现两个不同的值,那么这就和我们的理解有点冲突,因为一个变量当前赋值且没被修改的情况下不可能具有两个不同的值,就像一个人只能拥有一种性别一样。
在这里插入图片描述

那么我们之前的文章也详细介绍过我们的fork,但是对于这个情况,当时并没有提及,那么我们现在来思考一下为什么会出现这样的现象,那么我们知道我们进程是具有独立性,那么要做到独立性也就意味着我们父子进程的数据不能做到共享,为此做到该数据独立性,那么我们的fork函数会采取写时拷贝的机制,那么我们如果子进程读取我们父进程的数据,那么此时子进程会与父进程共享一个物理内存页面,但是如果我们子进程要对数据进行写入操作的话,那么这时则会触发写时拷贝机制,那么我们操作系统会为其要写入的数据专门拷贝得到一个副本,然后在这个副本中做写入,从而做到独立性,所以根据我们之前对fork函数的学习以及认识,有了这个写时拷贝机制,我们认为此时我们父子进程关于接收这个返回值的变量,那么它一定是有两份副本,一份是父进程,一份是子进程,所以也就解释了它为什么能够具备有两个值。

​ 那么接下来可以用c语言写一段简单的代码来实验,验证我们刚才的推理的成立,代码逻辑也很简单,那么在代码中定义一个int类型全局变量g_val,然后用fork返回值让父子进程有着不同的执行流,然后我们让子进程对g_val进行修改,然后接着父子进程分别打印这个全局变量的值以及对应的地址,如果打印的结果是子进程中的全局变量的值是修改后的结果,并且对应的地址与父进程不同,那么就能够验证我们之前的结论。
在这里插入图片描述
在这里插入图片描述

那么我们根据结果发现,值确实不同,但是地址是相同的,那么值不同证明父子进程确实对于g_val有各自对应的副本,所以子进程的值与父进程的不同,那么能够验证我们刚才所说的结论,那么既然g_val在父子进程中有着各自对应的一份副本,那么地址不可能是相同的,那么既然是相同的,那么只能说明一个原因,那就是这个地址不是实际的物理内存地址,那么这个地址究竟是什么呢,那么这就和本文的主题进程地址空间有关了,那么这个地址就是虚拟地址。

2.进程地址空间

那么在我们之前对于进程的理解上有得添加一个新的内容,也就是进程地址空间。

我们知道我们进程的内核数据是被加载到我们的内存中的,而当我们的进程被调度到CPU当中运行的话,那么我们CPU得从我们内存中获取我们进程的各种内核数据,我们知道我们CPU以及内存以及外部的io设备都是一个独立的工作单元,那么它们要协同工作的话,就得用“线”来连接,那么数据通过该线在各个工作单元中流通,那么其中这里的线我们可以分为数据线与地址线。

那么同理我们的CPU与我们的内存也有数据线以及地址线连接,那么顾名思义,地址线就是用来专门传输地址内容,而数据线是用来传输数据内容的,那么以32为机器为例,那么我们的CPU与我们的内存的地址线有32根,那么每一根地址线根据其高低电频的电信号分别用来表示二进制的0和1,那么我们的CPU就能根据各个地址线的高低电频信号组合得到一个二进制序列,而这个二进制序列就是我们的地址,那么内存的寻址器获取到地址后,会到内存的对应位置得到CPU要获取的数据,然后通过数据线传给CPU当中的寄存器,那么这32根地址线每一根线只能表示两种不同的信息,要么是0或者1,所以我们这32根地址线总共就能表示出2的32次方个不同的地址,那么它的范围是从0000 0000到FFFF FFFF。
在这里插入图片描述

那么我们知道我们这32根地址线只能表示0000 0000到FFFF FFFF范围上的所有地址,那么我们这0000 0000到FFFF FFFF范围上连续的地址便是我们的进程的地址空间,也就意味着,我们进程的各种数据,那么他们的地址只能在这个范围上,不能超出这个范围,因为我们CPU的32根地址线只能表示这么多,那么我们操作系统为了管理这个进程地址空间,采取的方式是我们最熟悉的先描述,再组织,那么它在我们进程所对应的task_struct结构体中,定义了一个指向mm_struct结构体。

而没错这个mm_struct结构体就是用来描述我们的进程地址空间,那么它里面会有两个字段来表示这个进程地址空间的起始位置与结束位置,那么通过这个mm_struct结构体就能在抽象建模出我们的进程地址空间。

而进程地址空间的设计还不至于此,那么我们进程地址空间还专门进行了内存的布局,将其分为了代码段以及数据段,然后再数据段中的不同范围还分为了常量区,堆区,栈区等,那么这些名词在我们的语言的学习上想必都听闻过。

那么至于为什么对我们的进程地址空间进行内存布局,那么我们可以拿生活中的一个例子来理解,就假设你是一个读者,要去图书馆借阅书籍,那么如果我们的图书馆的各种类型的数据是随意摆放,各种类型的书籍都在同一个书架上,那么我们读者要寻找到目标书籍的时间开销是很大的,但是如果图书馆将这些数据按照类型分不同楼层,按首字母分不同书架,那么我们查找以及图书馆管理起来就很方便。

根据这个例子我们便知道要为进程地址空间布局的一个重要原因,那么便是对于数据的查找以及内存管理,那么具体实现则是我们的mm_struct结构体在包含其他各个数据段的结构体指针,那么对应该数据段的结构体指针的就包含起始位置以及结束位置的两个字段或者直接包含各个数据段的起始以及结束的字段,那么通过我们的mm_struct结构体,我们就对内存有着统一的布局和视角来看待。
在这里插入图片描述

而在我们进程地址空间上的各个地址,这些地址也就是所谓的虚拟地址,所谓虚拟,也就是说它并不是我们该数据真实在物理内存当中的地址,那么之所以我们不给我们的数据直接分配物理地址,原因也很简单,那么就是安全,那么如果我们用户直接接触到了物理地址,那么我们可以对数据的篡改以及覆盖的行为是不受阻拦的,那么这个虚拟地址就像是一个屏障,将其与物理地址隔开,那么我们对物理内存的任何操作意味着都要受到约束或者阻拦,这维护了数据以及系统的安全。

那么既然我们只能看到虚拟地址,那么我们内存器要获取数据那么肯定得是要我们的真实的物理地址,那么必然得需要将我们的虚拟地址转换为我们的物理地址,那么就有了我们页表的存在。

那么页表是一个数据结构,那么它建立了虚拟地址到物理地址的一个映射,并且还为每个数据设置了是否具有读写权限的字段信息,那么我们可以通过页表将虚拟地址转化为物理地址。所以在我们创建进程的时候,我们进程的内核数据被加载到内存中,同时我们还会为进程创建对应的task_struct结构体,那么其中就包括了进程地址空间的创建以及页表的创建,那么也就意味着我们每一个进程都有自己的进程地址空间也就是对应的mm_struct结构体和页表,但是我们要注意的是,我们不同的进程的进程地址空间都是相同的,也就意味着我们每一个进程的mm_struct结构体的各个字段都是相同的,那么这也很好理解,因为我们让各个进程都以统一的逻辑来看待内存,但是看不到物理内存,那么我们每个进程对应的进程地址空间都是全部的从0000 0000到FFFF FFFF的4GB的空间,但是对于页表不同进程肯定是不一样的,因为虚拟到物理对应的映射各个进程是不同的,那么在我们创建我们的进程的同时,我们会初始化页表的部分数据的映射,那么之所以是部分,而不是全部数据,则是由于有以下原因:

我们知道我们操作系统会为了缓解进内存的压力会对某些进程采取挂起的手段,也就是将他的内核数据先放回到外部设备比如磁盘当中,那么此时它的内核数据都没加载到内存中,那么自然无法完成对应的映射。

其次,我们知道整个进程地址空间的大小是4GB,那么我们在不同的计算机的构造下,有可能会出现实际物理内存比虚拟内存小的情况,比如有的物理内存是2GB,那么就会导致有的数据没有加载到物理内存,所以无法完成所有数据的映射的初始化。

那么对于有些不在物理内存无法完成初始化的数据,那么页表会专门会有一个字段来标记它是否在物理内存,如果不在,那么则会被标记为缺页,那么对于缺页中断的数据的话,那么我们到时候进程被调度的时候,操作系统一定会为缺页中断的数据重新生成对应的映射。
在这里插入图片描述

所以有了虚拟地址的概念,那么我们对之前的我们语言层面上无法解释的东西,那么我们现在就能够找到源头了,比如我们知道我们c语言我们为什么不能修改字符常量,那么是因为常量区的数据的权限会在页表中标记为只读权限,如果我们要对访问字符常量并且执行写操作,那么它就会对我们该操作进行阻拦。


重新认识fork系统调用

那么有了虚拟地址空间这个概念,那么我们再来重新理解一下我们的fork函数创建子进程的一个原理,那么我们调用fork函数,那么我们会拷贝父进程的task_struct结构体,其中就包括进程地址空间以及页表,这也就是为什么说我们子进程与我们父进程是共享一份物理内存页面的,调用fork函数后,我们操作系统会将父进程的页表中的数据段的内容的权限全部改成只能读不能写,那么如果我们子进程要对数据段的内容进行写入的话,由于权限只读,从而就会触发写时拷贝机制,那么操作系统会在物理内存重新为该数据开辟一份空间,然后接着修改我们子进程所对应的物理内存地址,而虚拟内存地址则不需要修改,从而做到父子进程的数据的独立,有了虚拟地址的概念,便解决了我们开头所说的那个问题。


有了页表这个概念之后,那么我们CPU要读取我们进程在内存中的数据,那么CPU的MMU(内存管理单元)那么它会获取到该进程的页表,然后将我们进程的各种数据的虚拟地址转换成物理地址,然后通过地址线传递给我们的内存的寻址器去获取目标数据然后再传到我们的CPU的寄存器当中

3.结语

那么本篇文章介绍了我们进程地址空间的概念,那么我们知道进程地址空间的出现的意义第一是能让用户以及操作系统能够以统一的视角与布局看待我们的内存,因为我们实际上各个数据在物理内存中的位置是离散的乱许的,但是在进程空间的视角下,逻辑上认为他们是有序排列,比如栈区以及堆区在高地址处,那么这样的内存布局的好处还方便于我们对于数据的查询以及管理。

那么第二是我们的虚拟进程地址空间以及页表的存在,建立一道用户与物理内存的屏障,那么用户不能通过代码直接访问到物理内存,不让用户的各个行为不会受到阻拦,那么可能会出现数据的修改以及越界访问等等问题。

第三是我们虚拟地址以及页表的出现,那么让我们的进程管理以及内存管理相互分离开,那么进程管理我们操作系统就管理我们task_struct结构体所对应的各个数据结构,而内存管理,则是管理我们的页表结构即可,实现了进程管理与内存管理的解耦

那么这就是本篇文章对于进程地址空间的全部内容,那么希望能够让你有所收获,那么我会持续更新,那么下一篇文章我将会解析我们进程的终止与等待,那么希望你能够多多关注,多多支持!
在这里插入图片描述

相关文章:

深入Linux系列之进程地址空间

深入Linux系列之进程地址空间 1.引入 那么在之前的学习中,我们知道我们创建一个子进程的话,我们可以在代码层面调用fork函数来创建我们的子进程,那么fork函数的返回值根据我们当前所处进程的上下文是返回不同的值,它在父进程中返…...

虚拟DOM与Diff算法:Vue如何高效更新UI?

虚拟DOM与Diff算法:Vue如何高效更新UI? 虚拟DOM与Diff算法:Vue如何高效更新UI?什么是虚拟DOM?定义虚拟DOM的优势 Diff算法:如何高效计算UI差异定义核心思想Diff算法的步骤示例代码 Vue中的虚拟DOM与Diff算法…...

Golang 并发机制-6:掌握优雅的错误处理艺术

并发编程可能是提高软件系统效率和响应能力的一种强有力的技术。它允许多个工作负载同时运行,充分利用现代多核cpu。然而,巨大的能力带来巨大的责任,良好的错误管理是并发编程的主要任务之一。 并发代码的复杂性 并发编程增加了顺序程序所不…...

【MySQL】第二弹---数据库基础全解析:从概念到实践的深度探索

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】 目录 1. 数据库基础 1.1 什么是数据库 1.2 主流数据库 1.3 基本使用 1.3.1 MySQL安装 1.3.2 连接服务器 1.3.3 服务器…...

c++计算机教程

目的 做出-*/%计算机 要求 做出可以计算-*/%的计算机 实现 完整代码 #include<bits/stdc.h> int main() {std::cout<<"加 减- 乘* 除/ 取余% \没有了|(因为可以算三位)"<<"\n"<<"提示:每打完一个符号或打完一个数,\…...

win32汇编环境,对话框程序中自定义工具栏的使用示例三

;运行效果 ;win32汇编环境,对话框程序中自定义工具栏的使用示例三 ;这次是竖着的,以下为生成48*48大小的自定义工具栏图标,自已设计图标样式,显得更专业点。 ;原理是,先生成工具栏控件,再生成图像列表,然后弄几个图标加入图像列表,再把图像列表与工具栏控件关联。需留意…...

集合类不安全问题

ArrayList不是线程安全类&#xff0c;在多线程同时写的情况下&#xff0c;会抛出java.util.ConcurrentModificationException异常 解决办法&#xff1a; 1.使用Vector&#xff08;ArrayList所有方法加synchronized&#xff0c;太重&#xff09; 2.使用Collections.synchronized…...

怎么使用Cursor以及升级Cursor pro会员

什么是cursor Cursor&#xff1a;结合AI技术的代码编辑器&#xff0c;助力开发者提升编码效率与质量。作为Visual Studio Code的一个衍生版本&#xff0c;Cursor继承了其用户熟知的界面和插件兼容性&#xff0c;并加入了革命性的AI特性。这款编辑器自2023年1月推出以来&#x…...

启用gui,启动图形化界面

1、停止服务 2、开启maxscale GUI &#xff0c;修改主配置文件&#xff08;增加框框内两行&#xff09; 3、启动服务 注&#xff1a;如果出现以下启动不成功 考虑权限问题 4、访问http://ip:8989 用户名/密码&#xff1a;admin/mariadb...

03-移除元素

给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k&#xff0c;要通过此题&#xff0c;您需要执行以下操作&#xff1a; 更改…...

LSSVM最小二乘支持向量机多变量多步光伏功率预测(Matlab)

代码下载&#xff1a;LSSVM最小二乘支持向量机多变量多步光伏功率预测&#xff08;Matlab&#xff09; LSSVM最小二乘支持向量机多变量多步光伏功率预测 一、引言 1.1、研究背景与意义 随着全球能源危机和环境问题的日益严重&#xff0c;可再生能源的开发利用成为了世界各国…...

使用Vue开发可复用的Web Components:跨框架组件封装指南

使用Vue开发可复用的Web Components&#xff1a;跨框架组件封装指南 使用Vue开发可复用的Web Components&#xff1a;跨框架组件封装指南引言什么是Web Components&#xff1f;为什么选择Vue开发Web Components&#xff1f; 封装跨框架组件的步骤1. 创建基本的Vue组件2. 将Vue组…...

用AI写游戏1——js实现贪吃蛇

使用模型通义千问 提示词&#xff1a; 用js html css 做一个贪吃蛇的动画 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Snake Game</title><link rel"stylesheet" href"c…...

星闪开发入门级教程之安装编译器与小项目烧录

系列文章目录 星闪开发入门级教程 好久不见&#xff0c;已经好几年没有发文章了&#xff0c;星闪-作为中国原生的新一代近距离无线联接技术品牌。我想着写点东西。为了适合新手&#xff0c;绝对小白文。 文章目录 系列文章目录前言一、Hispark Studio1.安装Hispark Studio2.安…...

java求职学习day32

JavaScript 详解 课程目标&#xff1a; 1 、 JavaScript 介绍 2 、 HTML 和 JavaScript 结合方式 3 、 JavaScript 的使用 4 、 DOM 操作 5 、 BOM 操作 1. JavaScript介绍 (1)虽然是 java 作为前缀&#xff0c;但 java 和 javascript 的关系&#xff0c;就像老婆和老婆…...

【Markdown语法】锚点机制:跳转任意位置

最近写文章时&#xff0c;发现有一个需求&#xff1a;想要实现一种点击跳转到文档中任意位置的功能&#xff0c;这就是锚点机制&#xff0c;就像游戏中的传送锚点&#xff0c;于是写成文章记录一下使用方式。 本文将详细介绍如何使用Markdown创建文档内部跳转&#xff08;即锚…...

Docker安装pypiserver私服

Docker安装pypiserver私服 1 简介 Python开源包管理工具有pypiserver、devpi和Nexus等&#xff0c;pypiserver安装部署比较简单&#xff0c;性能也不错。 搭建pypiserver私服&#xff0c;可以自己构建镜像&#xff0c;也可以使用官网的docker镜像。 # Github地址 https://g…...

基于微信小程序的居住证申报系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

网站改HTTPS方法

默认的网站建设好后打开的样子那看起来像是钓鱼网站&#xff0c;现在的浏览器特别只能&#xff0c;就是你新买来的电脑默认的浏览器同样也会出现这样“不安全”提示。 传输协议启动了向全球用户安全传输网页内容的流程。然而&#xff0c;随着HTTPS的推出&#xff0c;传输协议通…...

什么是三层交换技术?与二层有什么区别?

什么是三层交换技术&#xff1f;让你的网络飞起来&#xff01; 一. 什么是三层交换技术&#xff1f;二. 工作原理三. 优点四. 应用场景五. 总结 前言 点个免费的赞和关注&#xff0c;有错误的地方请指出&#xff0c;看个人主页有惊喜。 作者&#xff1a;神的孩子都在歌唱 大家好…...

极客说|利用 Azure AI Agent Service 创建自定义 VS Code Chat participant

作者&#xff1a;卢建晖 - 微软高级云技术布道师 「极客说」 是一档专注 AI 时代开发者分享的专栏&#xff0c;我们邀请来自微软以及技术社区专家&#xff0c;带来最前沿的技术干货与实践经验。在这里&#xff0c;您将看到深度教程、最佳实践和创新解决方案。关注「极客说」&a…...

Rust语言进阶之标准输入: stdin用法实例(一百零五)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…...

力扣刷题思路

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言递归70. 爬楼梯112. 路径总和509. 斐波那契数 分治169. 多数元素240.搜索二维矩阵 II --- 二分查找 单调栈 ---「找最近一个比当前值大/小」的问题739. 每日温度…...

MUX-VLAN实验

一、搭建实验拓扑图 二、基本设备配置 设备接口IP地址子网掩码网关PC1E0/0/110.0.1.1255.255.255.0N/APC2E0/0/110.0.1.2255.255.255.0N/APC3E0/0/110.0.1.3255.255.255.0N/APC4E0/0/110.0.1.4255.255.255.0N/APC5E0/0/110.0.1.6255.255.255.0N/Aserver-1E0/0/110.0.1.5255.2…...

音频进阶学习十二——Z变换

文章目录 前言一、Z变换1.Z变换的作用2.Z变换公式3.Z的状态表示1&#xff09; r 1 r1 r12&#xff09; 0 < r < 1 0<r<1 0<r<13&#xff09; r > 1 r>1 r>1 4.关于Z的解释 二、收敛域1.收敛域的定义2.收敛域的表示方式3.ROC的分析1&#xff09;当 …...

理解推理型大语言模型

构建和改进推理模型的方法与策略 本文描述了构建推理模型的四种主要方法&#xff0c;以及我们如何增强大型语言模型&#xff08;LLM&#xff09;的推理能力。我希望这能为你提供有价值的见解&#xff0c;并帮助你了解这一领域快速发展的文献和热潮。 在2024年&#xff0c;LLM…...

【Brinson 绩效归因模型】

Brinson 绩效归因模型 1、前言2、Brinson模型介绍2.1 归因方式2.1.1 BHB 超额收益分解方案2.1.2 BF 超额收益分解方案 2.2 多期 Brinson 模型 1、前言 如此之多的基金&#xff0c;收益率各有不同&#xff0c;即使同等收益率的基金也各有不同的成因。在这种形势下&#xff0c;广…...

如何轻松将Matlab生成的图表嵌入PowerPoint演示文稿

文章目录 Matlab将生成的图添加PPT中一、Matlab脚本1.添加图片函数2.使用示例 总结 Matlab将生成的图添加PPT中 在许多科学、工程和商业领域&#xff0c;Matlab作为一款强大的数值计算和可视化工具&#xff0c;被广泛应用于数据分析和模型构建。然而&#xff0c;当涉及到分享这…...

组合(力扣77)

从这道题开始&#xff0c;我们正式进入回溯算法的学习。之前在二叉树中只是接触到了一丢丢&#xff0c;而这里我们将使用回溯算法解决很多经典问题。 那么这道题是如何使用回溯算法的呢&#xff1f;在讲回溯之前&#xff0c;先说明一下此题是如何递归的。毕竟回溯递归不分家&a…...

2.7学习

crypto buu-还原大师 仔细阅读题目&#xff0c;这里有一段字符串&#xff0c;但是其中有四个大写字母被替换成了‘&#xff1f;’&#xff0c;那么我们写脚本&#xff1a;首先将四个问号均换成26个大写字母并且组成不同的组合&#xff0c; 所以有四个循环让四个问号都遍历26个…...

[开源/教程]使用Ollama+ESP32实现本地对话助手(可接入deepseek等模型)

[开源/视频教程]使用OllamaESP32实现本地对话助手(可接入deepseek等模型) 简介 使用ollama实现本地模型的定制, 可以做到数据不泄露以及绕开检测的效果, 之后使用嘉立创的esp32开发板实现简单的对话助手 同时接入本文档, 可以直接使用AI对话的方式进行文档处理 XuSenfeng/ai…...

Swagger2 自定义排序

分享一下SpringSwagger2在线文档自定义排序的代码。 这里参考swagger2 接口排序_swagger接口排序-CSDN博客提供的思路&#xff0c;并在此基础上做了优化。 1、引用pom信息 <!--swagger依赖(pojo注解)--><dependency><groupId>io.swagger</groupId>&l…...

sentinel的限流原理

Sentinel 的限流原理基于 流量统计 和 流量控制策略&#xff0c;通过动态规则对系统资源进行保护。其核心设计包括以下几个关键点&#xff1a; 流量统计模型&#xff1a;滑动时间窗口 Sentinel 使用 滑动时间窗口算法 统计单位时间内的请求量&#xff0c;相比传统的固定时间窗…...

Mac 部署Ollama + OpenWebUI完全指南

文章目录 &#x1f4bb; 环境说明&#x1f6e0;️ Ollama安装配置1. 安装[Ollama](https://github.com/ollama/ollama)2. 启动Ollama3. 模型存储位置4. 配置 Ollama &#x1f310; OpenWebUI部署1. 安装Docker2. 部署[OpenWebUI](https://www.openwebui.com/)&#xff08;可视化…...

C/C++ 面试智能指针

说下你对智能指针的理解 回答1: 因为C使用内存的时候很容易出现野指针、悬空指针、内存泄露的问题。所以C11引入了智能指针来管理内存。有四种&#xff1a; auto_ptr&#xff1a;已经不用了unique_ptr&#xff1a;独占式指针&#xff0c;同一时刻只能有一个指针指向同一个对…...

Halcon缓存?内存泄漏?

目录 1、前言 2、图片缓存 3、全局内存缓存 4、临时内存缓存 5、处理 HALCON 中的疑似内存泄漏 6、其他 1、前言 除⾮必要,否则不建议修改 HALCON 自带的缓存设置。 2、图片缓存 图像通常需要大量内存,而分配大块内存的过程较慢。因此,当释放图像时,HALCON并…...

升级 SpringBoot3 全项目讲解 — 周边店铺展示功能如何实现

学会这款 &#x1f525;全新设计的 Java 脚手架 &#xff0c;从此面试不再怕&#xff01; 1. 升级 Spring Boot 到 3.x 在升级 Spring Boot 之前&#xff0c;我们需要确保项目的依赖和配置与新版本兼容。以下是升级的主要步骤&#xff1a; 1.1 更新 pom.xml 文件 首先&#…...

Git(分布式版本控制系统)系统学习笔记【并利用腾讯云的CODING和Windows上的Git工具来实操】

Git的概要介绍 1️⃣ Git 是什么&#xff1f; Git 是一个 分布式版本控制系统&#xff08;DVCS&#xff09;&#xff0c;用于跟踪代码的变更、协作开发和管理项目历史。 由 Linus Torvalds&#xff08;Linux 之父&#xff09;在 2005 年开发&#xff0c;主要用于 代码管理。…...

光学和光子学模拟工具在 AR/VR 中的作用

AR/VR 中的光学和光子学 增强现实 (AR) 和虚拟现实 (VR) 站在数字进化的前沿。光学和光子学这一复杂的科学深入研究了光的产生、检测和操控&#xff0c;在这一转变中发挥着至关重要的作用。 图 1 (a) 展示了 AR 系统的设计&#xff0c;强调了光学的关键作用。该图描绘了光的旅…...

大模型产品Deepseek(四)、本地安装部署(Ollama方式)

Ollama与DeepSeek的本地安装与部署教程(Windows/MacOS) 在许多AI应用场景中,您可能希望将智能模型本地化,以便更高效地处理数据并减少对外部云服务的依赖。本文将介绍如何在Windows和macOS上直接安装和配置Ollama,以及如何基于Ollama平台部署DeepSeek模型并进行本地交互。…...

visual studio安装

一、下载Visual Studio 访问Visual Studio官方网站。下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 在主页上找到并点击“下载 Visual Studio”按钮。 选择适合需求的版本&#xff0c;例如“Visual Studio Community”&#xff08;免费版本&#xff09;&#x…...

AI大模型——DeepSeek模型部署实战

摘要 文章主要介绍了DeepSeek大模型的本地部署方法、使用方式以及API接入相关内容。首先指出可通过下载Ollama来部署DeepSeek-R1模型&#xff0c;并给出了模型不同参数版本及存储信息。接着说明了如何通过Chatbox官网下载并接入DeepSeek API&#xff0c;以及如何接入本地部署模…...

音视频的文件封装——AVI、MP4、MKV

3.MKV (Matroska Video File) Matroska &#xff08;俄语&#xff1a; матроска &#xff09;是一种多媒体封装格式&#xff0c;可把多种不同编码的影像、不同格式的音频、不同语言的字幕封装到一个文件内。也是一种开放源代码的多媒体封装格式。 Matroska 支持多种文件…...

讯飞绘镜(ai生成视频)技术浅析(五):视频生成

讯飞绘镜(AI生成视频)是一种先进的AI视频生成技术,能够将静态的分镜画面转换为动态视频,并使画面中的元素按照一定的逻辑和动作进行动态展示。 一、讯飞绘镜视频生成技术概述 讯飞绘镜的视频生成技术主要包含以下几个核心模块: 1.视频生成模型:包括生成对抗网络(GAN)…...

【FPGA】 MIPS 12条整数指令 【3】

实现乘除 修改框架 EX&#xff1a;实现带符号乘除法和无符号乘除法 HiLo寄存器&#xff1a;用于存放乘法和除法的运算结果。Hi、Lo为32bit寄存器。电路描述与实现RegFile思想一致 仿真 代码 DataMem.v include "define.v"; module DataMem(input wire clk,input…...

【补充】RustDesk一键部署及账号登录配置

前言 之前分享的配置rustdesk的帖子只是搭建了一个简易服务器&#xff0c;仅能实现简单的远程桌面功能。在后续的使用中切换设备使用时无法看到之前连接的设备&#xff0c;必须知道每个设备的id号&#xff0c;才能在新设备上连接。数据无法在设备间迁移&#xff0c;感觉很麻烦…...

2025.2.6 数模AI智能体大更新,更专业的比赛辅导,同提示词效果优于gpt-o1/o3mini、deepseek-r1满血

本次更新重新梳理了回复逻辑规则&#xff0c;无任何工作流&#xff0c;一共3.2k字细节描述。具体效果可以看视频&#xff0c;同时也比对了gpt-o1、gpt-o3mini、deepseek-r1-67BI&#xff0c;从数学建模题目解答上来看&#xff0c;目前我的数模AI智能体具有明显优势。 AI智能体优…...

昇腾,Ascend,NPU,mindie,镜像,部署vllm:第3篇,补档,没事可以看看这个readme

文章目录 前言文件位置已改变atb model和mindie的关系前言 在之前的版本中,我们提到了一个帮助文档(Readme),这个文档告诉我们,当时的mindie版本不支持0.5b版本的通义千问2.5 我现在就很好奇,新版的mindie,是否支持0.5b的版本呢? 文件位置已改变 之前的文件位置: …...

PbootCMS 修改跳转提示,修改笑脸时间

在使用时&#xff0c;每次都提示这个&#xff1a; 修改方法&#xff1a; 修改跳转时间&#xff1a;找到 handle.php 文件编辑 &#xff0c;调整 setTimeout 函数的时间参数。 修改提示文字&#xff1a;编辑 handle.php 文件&#xff0c;修改提示文字的内容。 隐藏提示页面&am…...

Python办公笔记——将csv文件转Json

目录 专栏导读1、背景2、库的安装3、代码1—自定义表头4、代码2—全字段5、代码3—全字段总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍&#x1f308; 博客主页&#xff1a;请点击——> 一晌…...