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

Linux: 进程地址空间(理解虚拟地址和页表)

目录

1. 虚拟地址

2. 进程地址空间分布

3. 描述进程地址空间

4. 内存管理——页表

5. 父子进程的虚拟地址关系

6. 页表标记位

6.1 读写权限

6.2 命中权限

7.为什么存在进程地址空间


1. 虚拟地址

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>int gval = 100;int main()
{printf("我是一个进程, pid: %d, ppid: %d\n", getpid(), getppid());pid_t id = fork();if (id == 0){//childwhile(1){printf("我是一个子进程, pid: %d, ppid: %d, gval: %d, &gval: %p\n", getpid(), getppid(), gval, &gval);gval++;sleep(1);} }else{while(1){printf("我是一个父进程, pid: %d, ppid: %d, gval: %d, &gval: %p\n", getpid(), getppid(), gval, &gval);sleep(1);}}
}

 我们写一份代码,先定义一个全局整型变量gval,赋值为100。再使用fork函数创建子进程,都使用while循环,不断打印pid,ppid,gval值和gval的地址,不一样的是子进程对gval不断加加。

运行结果如上,不管是子进程还是父进程对gval变量取地址,得到的地址都是相同的,但是子进程的gval变量在不断变大,而父进程的gval变量没有变。这在我们之前的学习过程中是不可能出现的情况。

因为子进程和父进程数据不是共享的,那么子进程和父进程打印出来的gval值应该是不同的,所以内存上的地址也应该不相同。如果内存上的地址相同,gval值就应该一样。这显然是互相矛盾。

这种情况表明什么呢?说明在语言层面上获得的地址不是物理内存地址,而是一个虚拟地址,也叫做线性地址。

2. 进程地址空间分布

 上面32为系统下虚拟地址分布情况中,先是由低地址往高地址增长,总共是4GB的内存。此外还有我们熟悉的代码段,栈区,堆区。我们可以写一段代码来验证上面区域的分布情况。

#include <stdio.h>
#include <stdlib.h>int unval;
int gval = 100;int main()
{int a,b,c;printf("stack addr: %p\n", &a);printf("stack addr: %p\n", &b);printf("stack addr: %p\n", &c);int *heap = (int*)malloc(10*sizeof(int));printf("heap addr:  %p\n", heap);printf("unval addr: %p\n", &unval);printf("gval addr:  %p\n", &gval);printf("code addr:  %p\n", main);return 0;
}

运行结果如下,栈区地址最高,其次是堆区,并且栈区和堆区地址相差较大,再到数据区,最后是代码段。

3. 描述进程地址空间

那么我们该如何理解进程地址空间呢?我们通过一个的例子来说明这一概念。

假设一位公司老板希望评估其手下四位员工的能力,于是决定启动一个项目,并指示这四人分别组建团队来实施。尽管项目的实际启动资金仅为十万元,但老板对每位员工都声称项目拥有十万元的启动资金,任由他们自由支配。这样一来,老板实际上在概念上“创造”了四十万元的虚拟资金池,这种做法俗称为“画饼”。

在这个比喻中,老板的角色相当于操作系统,而他手下的四位员工则代表进程。那十万元的实际项目资金,可以看作是物理内存;而老板向每位员工承诺的十万元“虚拟”资金,则相当于每个进程的地址空间。

既然每个进程都拥有自己独立的地址空间,那么就需要对其进行有效的管理。这里,我们遵循“先描述,再组织”的原则。首先,将进程地址空间封装成一个结构体,该结构体内部还包含一些用于连接和管理的字段。这样一来,对进程地址空间的管理,就转化为了对这个特定数据结构的增删查改的操作。

在进程地址空间的管理中,每个区域(如代码区、数据区、栈区、堆区等)都需要被精确地划分和界定。这可以通过在结构体中使用变量来记录每个区域的起始地址和结束地址来实现。这些变量定义了每个区域在进程地址空间中的位置和范围,从而确保了进程在运行过程中能够正确地访问和管理其内存资源。

接下来,让我们通过小明和小李的例子来进一步说明这一概念:

小明和小李作为同桌,他们共同使用了两张拼在一起的桌子,但为了避免相互干扰,他们设定了一条“三八线”。小明将桌子从1到100进行刻度划分,并规定了自己的活动范围为[1,50],而小李的活动范围为[51,100]。这样,一旦小李的活动超出了他规定的范围(即超过了51这条线),就被视为越界。

在32位操作系统中,进程地址空间也是从某个起始地址(通常是全0地址)到某个结束地址(如0xffffffff)进行排列的。与小明和小李的桌子划分类似,进程地址空间中的每个区域也可以通过两个变量(如起始地址和结束地址)来界定。例如,对于栈区,我们可以设定一个变量start来表示其起始地址,另一个变量end来表示其结束地址,那么栈区的空间范围就可以表示为[start, end]。

根据上面的讲解,我们大概了解进程地址空间。其中进程地址空间中有2^{32}个地址,每个地址占一个字节的空间,计算它们的乘积就相当于4GB的空间。并且每个地址就是一个无符号的整数,从最低位开始编址,刚好是全0地址到全f地址。

其中Linux的进程pcb是task_struct结构体,里面包含了一个指针变量,类型是名为mm_struct的结构体。该结构体就是描述进程地址空间的类,它的属性里就有对所有区域划分的start和end变量。因为地址是个无符号整数,所以使用的是unsigned long类型。

4. 内存管理——页表

前文讲解的都是虚拟地址,如果myproc可执行程序加载到物理内存中,它的代码和数据都存储在物理内存中,怎么做到从虚拟地址到物理地址的转换呢?

假设myproc进程中有个初始化的全局整型变量gval,物理地址为0x1234。它对应在进程地址空间的初始化数据区,也会有虚拟地址0x1010。操作系统会维护一个页表,对虚拟地址和物理地址建立映射关系。

因此,如果要修改gval变量,操作系统会通过页表,查找虚拟地址对应的物理地址,再进行写入操作。虚拟地址空间加上页表就是虚拟内存的管理方案。

5. 父子进程的虚拟地址关系

myproc进程通过fork函数创建一个子进程时,操作系统会为该子进程分配一个新的task_struct结构体对象。此时,子进程的虚拟地址空间属性会复制自父进程,包括页表。由于父子进程的代码区都映射到物理内存的同一块空间,因此可以认为它们的代码是共享的。

在父子进程都没有修改全局变量gval的值时,它们的虚拟地址空间中的数据区也会指向物理内存的同一块空间。然而,一旦子进程尝试修改gval的值,操作系统就会采用写时拷贝(Copy on Write)技术。这一技术会为子进程分配一块新的物理内存空间,并修改子进程的页表,以重新建立虚拟地址与物理地址之间的映射关系。这样,子进程就可以在其独立的内存空间中修改gval的值,而不会影响到父进程。

这也就是为什么fork函数看起来能返回两个返回值的原因,因为父子进程看似有相同的虚拟地址空间,实际上映射到物理内存上的空间是不同的。

通过了解进程地址空间,我们需要重新理解进程和进程的独立性。

  • 进程 = 内核数据结构(task_struct/mm_struct/页表) + 代码和数据

父进程创建子进程时,虽然子进程的内核数据结构一些属性会拷贝自父进程,但是内核数据结构各自一份。代码虽然在物理内存上共享,但是代码时只读的,也相当于各自一份。数据在父子任意进程中发生修改,会发生写时拷贝,也会各自私有一份。至于其他没有联系的进程,更不用说,所有的东西都是各自私有一份。因此,进程与进程之间是具有独立性的

6. 页表标记位

6.1 读写权限

页表除了会建立虚拟地址和物理地址的映射关系,还会存储一些标记位。因为一个字节有八个比特位,每个比特位可以写入0和1,表示两种不同的状态。这样一个字节就可以表示八种不同权限的有无。

其中就有几个比特位确定能否进行读写操作。我们以前谈程序崩溃,就是进程崩溃,进程又跟操作系统相关。假如我们写char *buff = “helloworld”,字符“helloworld”保存在代码区里面,而代码区是只读的,当我们写下*buff = “byte”代码时,编译器是检查不出来的,只有操作系统查看页表,发现你准备对只读代码区进行写操作,操作系统才会阻拦你,杀掉进程。

这就是为什么C语言会有const关键字的原因。因为编译器和操作系统耦合度不能过高,所以编译器无法获取进程页表信息,只能通过const关键字知道该变量无法修改,进而报错。

6.2 命中权限

页表中还有一个标记位,isexist表示该虚拟地址上的数据是否在物理内存中。因为有些可执行程序十分庞大,可能有几GB,操作系统不会一次性加载进来,会分批记载进来。或者是某些进程正在等待硬件资源的响应,进程占用内存空间但不被CPU调度,操作系统会将该进程占用的物理空间换出去,给其他进程使用。这些操作都会用到该标记位,该标记就可以支撑分批加载和进程挂起等待的操作。

其实代码在编译的过程中,就会按照代码区,初始化数据区和为初始化数据区的格式编码,形成elf格式的可执行程序。当可执行程序导入内存中,操作系统才会动态创建栈区、共享区和堆区。

我们通过malloc或者new函数申请堆区空间,实际上先向虚拟地址空间上申请一段空间,等要使用时,操作系统发现你的isexist标记位为0,会在物理内存上开辟一段空间给你使用。

7.为什么存在进程地址空间

  • 虚拟地址空间加上页表管理模式是为了保护内存。

比如我们常说的野指针问题,在语言层拿到的地址都是虚拟地址,通过页表转换指向其他位置的内存空间,而野指针崩溃是因为转换过程中的权限问题,或者根本不存该映射关系。

  • 进程管理和内存管理在系统层面上可以解耦合。

因为进程pcb和物理内存通过虚拟地址空间和页表隔开,物理内存根本不用关心进程申请的空间要做什么,而进程通过虚拟地址空间认为自己可以支配整个物理内存,他在虚拟地址开辟的空间,只有进程被调度执行时,才会在物理空间上申请。这就做到了进程管理和内存管理在系统层面上解耦了。

  • 让进程以统一的视觉看待物理内存。

如果没有虚拟地址,进程直接在物理内存上开辟空间,可能会有许多不连续的内存空间,产生内存碎片,造成内存空间的浪费。当虚拟地址空间和页表出现,进程认为自己可以支配整个物理内存,可以为许多区域进行扩展,再通过页表都映射到同一块连续的内存空间,这样就不会出现内存空间的浪费。


创作充满挑战,但若我的文章能为你带来一丝启发或帮助,那便是我最大的荣幸。如果你喜欢这篇文章,请不吝点赞、评论和分享,你的支持是我继续创作的最大动力!

相关文章:

Linux: 进程地址空间(理解虚拟地址和页表)

目录 1. 虚拟地址 2. 进程地址空间分布 3. 描述进程地址空间 4. 内存管理——页表 5. 父子进程的虚拟地址关系 6. 页表标记位 6.1 读写权限 6.2 命中权限 7.为什么存在进程地址空间 1. 虚拟地址 #include <stdio.h> #include <unistd.h> #include <sy…...

基于python的机器学习(四)—— 聚类(一)

目录 一、聚类的原理与实现 1.1 聚类的概念和类型 1.2 如何度量距离 1.2.1 数据的类型 1.2.2 连续型数据的距离度量方法 1.2.3 离散型数据的距离度量方法 1.3 聚类的基本步骤 二、层次聚类算法 2.1 算法原理和实例 2.2 算法的Sklearn实现 2.2.1 层次聚类法的可视化实…...

大语言模型---RewardBench 介绍;RewardBench 的主要功能;适用场景

文章目录 1. RewardBench 介绍2. RewardBench 的主要功能3. 适用场景 1. RewardBench 介绍 RewardBench: Evaluating Reward Models是一个专门用于评估 Reward Models&#xff08;奖励模型&#xff09; 的公开平台&#xff0c;旨在衡量模型在多种任务上的性能&#xff0c;包括…...

软件测试面试之重要的名词解释

1、测试(testing) 包括了所有生命周期活动的过程&#xff0c;包括静态的和动态的。涉及计划、准备和对软件产品及其相关工作产品的评估&#xff0c;用以确定它们是否满足了需求&#xff0c;证明它们是否符合了目标&#xff0c;以及是否发现了缺陷。 2.计算机软件的测试目的是 …...

mips架构下编译nginx-rtmp

1 源码下载&#xff1a; 下载nginx源码&#xff1a;wget http://nginx.org/download/nginx-1.23.1.tar.gz 下载依赖库libpcre.a源码&#xff1a;wget http://ftp.cs.stanford.edu/pub/exim/pcre/pcre-8.35.tar.gz 下载依赖库libz.a源码: wget https://downloads.sourceforge.ne…...

基于企业微信客户端设计一个文件下载与预览系统

在企业内部沟通与协作中&#xff0c;文件分享和管理是不可或缺的一部分。企业微信&#xff08;WeCom&#xff09;作为一款广泛应用于企业的沟通工具&#xff0c;提供了丰富的API接口和功能&#xff0c;帮助企业进行高效的团队协作。然而&#xff0c;随着文件交换和协作的日益增…...

《第十部分》1.STM32之通信接口《精讲》之IIC通信---介绍

经过近一周的USART学习&#xff0c;我深刻体会到通信对单片机的重要性。它就像人类的手脚和大脑&#xff0c;只有掌握了通信技术&#xff0c;单片机才能与外界交互&#xff0c;展现出丰富多彩的功能&#xff0c;变得更加强大和实用。 单片机最基础的“语言”是二进制。可惜&am…...

初始Python篇(7)—— 正则表达式

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 正则表达式的概念 正则表达式的组成 元字符 限定符 其他字符 正则表达式的使用 正则表达式的常见操作方法 match方法的…...

Linux 正则表达式(basic and extened)

正则表达式(Regular Expressions)&#xff0c;整理自&#xff1a; https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html gred sed 定义 Regular Expressions (REs) provide a mechanism to select specific strings from a set of character strings.…...

【Python爬虫】Scrapy框架实战---百度首页热榜新闻

如何利用Scrapy框架实战提取百度首页热榜新闻的排名、标题和链接 一、安装Scrapy库 二、创建项目&#xff08;以BaiduSpider为例&#xff09; scrapy startproject BaiduSpider生成每个文件的功能&#xff1a; 二、 创建爬虫脚本&#xff08;爬虫名&#xff1a;news&#xff…...

C#使用实体类Entity Framework Core操作mysql入门:从数据库反向生成模型2 处理连接字符串

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

OpenAI震撼发布:桌面版ChatGPT,Windows macOS双平台AI编程体验!

【雪球导读】 「OpenAI推出ChatGPT桌面端」 OpenAI重磅推出ChatGPT桌面端&#xff0c;全面支持Windows和macOS系统&#xff01;这款新工具为用户在日常生活和工作中提供了前所未有的无缝交互体验。对于那些依赖桌面端进行开发工作的专业人士来说&#xff0c;这一更新带来了令人…...

PHP8解析php技术10个新特性

PHP8系列是 PHP编程语言的最新主线版本&#xff0c;带来了许多激动人心的新特性和改进。作为一名PHP开发者&#xff0c;了解这些更新能够帮助你编写更高效、安全和现代的代码。 8的核心技术知识点&#xff0c;包括语言特性、性能优化、安全增强以及开发者工具的改进。 Just-In…...

vscode连接远程开发机报错

远程开发机更新&#xff0c;vscode连接失败 报错信息 "install" terminal command done Install terminal quit with output: Host key verification failed. Received install output: Host key verification failed. Failed to parse remote port from server ou…...

基于Java Springboot未央商城管理系统

一、作品包含 源码数据库设计文档万字全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&#xf…...

postman 调用 下载接口(download)使用默认名称(response.txt 或随机名称)

官网地址&#xff1a;https://www.postman.com 介绍 Postman 是一款流行的 API 开发和测试工具&#xff0c;用于发送 HTTP 请求、测试接口、调试服务器响应以及进行 API 文档管理。它支持多种请求类型&#xff08;如 GET、POST、PUT、DELETE 等&#xff09;&#xff0c;并且功能…...

小程序25- iconfont 字体图标的使用

项目中使用到图标&#xff0c;一般由公司设计进行设计&#xff0c;设计好后上传到阿里巴巴矢量图标库 日常开发过程中&#xff0c;也可以通过 iconfont 图标库下载使用自带的图标 补充&#xff1a;使用 iconfont 图标库报错&#xff1a;Failed to load font 操作步骤&#xff…...

线程控制方法之wait和sleep的区别

线程控制方法之wait和sleep的区别 wait()和sleep()都是Java线程控制方法&#xff0c;但存在明显区别&#xff1a; 所属与调用&#xff1a;wait()属Object类&#xff0c;需synchronized调用&#xff1b;sleep()属Thread类&#xff0c;可随意调用。锁处理&#xff1a;wait()释放…...

SQL 语句访问路径的方式

SQL 语句访问路径的方式 全表扫描&#xff08;Full Table Scans&#xff09; select * from t_Vio_Violation tPlan Hash Value : 1218663174 ----------------------------------------------------------------------------------------- | Id | Operation | Na…...

汽车HiL测试:利用TS-GNSS模拟器掌握硬件性能的仿真艺术

一、汽车HiL测试的概念 硬件在环&#xff08;Hardware-in-the-Loop&#xff0c;简称HiL&#xff09;仿真测试&#xff0c;是模型基于设计&#xff08;Model-Based Design&#xff0c;简称MBD&#xff09;验证流程中的一个关键环节。该步骤至关重要&#xff0c;因为它整合了实际…...

Vue v-if 与 v-for 使用指南:优先级、注意事项及常见错误防范

在 Vue.js 中,v-if 和 v-for 是两个常用的指令,它们分别用于条件渲染和列表渲染。理解它们的优先级和使用方式对于编写高效、易维护的代码非常重要。 1. v-if 和 v-for 的作用 v-if: 用于条件渲染,根据表达式的值决定是否渲染某个元素或组件。 <div v-if="isVisibl…...

DataWhale—PumpkinBook(TASK05决策树)

课程开源地址及相关视频链接&#xff1a;&#xff08;当然这里也希望大家支持一下正版西瓜书和南瓜书图书&#xff0c;支持文睿、秦州等等致力于开源生态建设的大佬✿✿ヽ(▽)ノ✿&#xff09; Datawhale-学用 AI,从此开始 【吃瓜教程】《机器学习公式详解》&#xff08;南瓜…...

空间注意力网络的性能优化与多维评估

在本文中&#xff0c;首先分析空间注意力网络&#xff08;Spatial Attention Neural Network&#xff09;在五个不同数据集上的训练结果。这些数据集包括Daily_and_Sports_Activities、WISDM、UCI-HAR、PAMAP2和OPPORTUNITY。通过对比这些结果&#xff0c;我们可以深入理解空间…...

linux基本命令2

7. 文件查找和搜索 (继续) find — 查找文件 find /path/to/search -name "file_name" # 根据名称查找文件 find /path/to/search -type f # 查找所有普通文件 find /path/to/search -type d # 查找所有目录 find /path/to/search -name "*.txt" # 查找…...

c++-练习2-类的封装练习(msg队列)

要求&#xff1a; 1、构造函数&#xff1a;创建一个消息队列&#xff0c;或者访问该消息队列 2、operator[] &#xff1a;通过index&#xff0c;切换send和recv的消息类型&#xff1b; 3、snd(const string& data) 向消息队列的指定频道中发送消息&#xff1b; 4、recv(int…...

战争迷雾FogOfWar---Unity中实现

从最初的即时战略《沙丘2》开始&#xff0c;战争迷雾的概念开始被引入和正式提出。在沙丘中每一次新开始游戏时&#xff0c;玩家只能观察到自己基地及单位周围极小的范围&#xff0c;而绝大多数地图区域均被黑色遮盖。当他命令单位向黑暗区移动后&#xff0c;经过的区域会被自动…...

[译]Elasticsearch Sequence ID实现思路及用途

原文地址:https://www.elastic.co/blog/elasticsearch-sequence-ids-6-0 如果 几年前&#xff0c;在Elastic&#xff0c;我们问自己一个"如果"问题&#xff0c;我们知道这将带来有趣的见解&#xff1a; "如果我们在Elasticsearch中对索引操作进行全面排序会怎样…...

C#构建一个简单的前馈神经网络

1. 神经网络的基本概念 神经网络是一种模拟人脑神经元结构的计算模型&#xff0c;由多个神经元&#xff08;节点&#xff09;组成&#xff0c;这些神经元通过连接&#xff08;边&#xff09;相互作用。每个连接都有一个权重&#xff0c;用于表示连接的重要性。神经网络通常分为…...

241123-UEFI模式下Linux-Windows双系统通过Grub设置选择开机系统

A. 准备工作: 将Linux系统作为默认启动系统 通过BIOS或EasyUEFI设置启动首选项为对应的Linux系统 A.1 通过BIOS选择对应的Linux系统 技嘉进入BIOS的按键 A.2 通过绿色向上箭头置顶Linux系统&#xff0c;下载地址&#xff1a; EasyUEFI A.1 与 A.2本质上执行的相同的操作 B. …...

LLaMA-Factory 上手即用教程

LLaMA-Factory 是一个高效的大型语言模型微调工具&#xff0c;支持多种模型和训练方法&#xff0c;包括预训练、监督微调、强化学习等&#xff0c;同时提供量化技术和实验监控&#xff0c;旨在提高训练速度和模型性能。 官方开源地址&#xff1a;https://github.com/hiyouga/L…...

单片机_简单AI模型训练与部署__从0到0.9

IDE&#xff1a; CLion MCU&#xff1a; STM32F407VET6 一、导向 以求知为导向&#xff0c;从问题到寻求问题解决的方法&#xff0c;以兴趣驱动学习。 虽从0&#xff0c;但不到1&#xff0c;剩下的那一小步将由你迈出。本篇主要目的是体验完整的一次简单AI模型部署流程&#x…...

Java-08 深入浅出 MyBatis - 多对多模型 SqlMapConfig 与 Mapper 详细讲解测试

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…...

单元测试、集成测试、系统测试、验收测试、压力测试、性能测试、安全性测试、兼容性测试、回归测试(超详细的分类介绍及教学)

目录 1.单元测试 实现单元测试的方法&#xff1a; 注意事项&#xff1a; 2.集成测试 需注意事项&#xff1a; 实现集成测试的方法&#xff1a; 如何实现高效且可靠的集成测试&#xff1a; 3.系统测试 实现系统测试的方法: 须知注意事项&#xff1a; 4.验收测试 实现验…...

整车安全需求考量的多维度深度剖析

在汽车工程领域,整车安全需求的确定是一项复杂且系统的工程,其涵盖了多个关键维度的综合考量。从需求的萌生到最终的落地实施,每一个环节都紧密相扣,涉及众多技术细节与实际操作的权衡。 一、需求来源的多渠道挖掘 整车安全需求的来源广泛,其中 TARA(威胁分析与风险评估)…...

虚幻引擎---初识篇

一、学习途径 虚幻引擎官方文档&#xff1a;https://dev.epicgames.com/documentation/zh-cn/unreal-engine/unreal-engine-5-5-documentation虚幻引擎在线学习平台&#xff1a;https://dev.epicgames.com/community/unreal-engine/learning哔哩哔哩&#xff1a;https://www.b…...

Oracle - 多区间按权重取值逻辑 ,分时区-多层级-取配置方案(二)

Oracle - 多区间按权重取值逻辑 &#xff0c;分时区-多层级-取配置方案https://blog.csdn.net/shijianduan1/article/details/133386281 某业务配置表&#xff0c;按配置的时间区间及组织层级取方案&#xff0c;形成报表展示出所有部门方案的取值&#xff1b; 例如&#xff0…...

线性代数的发展简史

线性代数的发展简史 线性代数作为数学的一个重要分支&#xff0c;其发展历史悠久而丰富。从古代文明中的基础计算到现代复杂的理论体系&#xff0c;线性代数经历了多个阶段的演变。 古代的起源 线性代数的雏形可以追溯到古埃及、古希腊、古印度和古代中国时期。这些早期文明…...

git使用详解

一、git介绍 1、git简介 Git 是一个开源的分布式版本控制系统&#xff08;最先进的&#xff0c;没有之一&#xff09;&#xff0c;用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用…...

ros2学习日记_241124_ros相关链接

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…...

【SQL】【数据库】语句翻译例题

SQL自然语言到SQL翻译知识点 以下是将自然语言转化为SQL语句的所有相关知识点&#xff0c;分门别类详细列出&#xff0c;并结合技巧说明。 1. 数据库操作 创建数据库 自然语言&#xff1a;创建一个名为“TestDB”的数据库。 CREATE DATABASE TestDB;技巧&#xff1a;识别**“创…...

图书管理系统(源码+数据库+报告)

基于SpringBoot的图书管理系统&#xff0c;系统包含两种角色&#xff1a;管理员、用户,系统分为前台和后台两大模块&#xff0c;主要功能如下。 前台&#xff1a; - 首页&#xff1a;展示系统推荐、热门图书等信息。 - 论坛&#xff1a;提供用户交流讨论的平台。 - 公告信息&a…...

python中lxml 库之 etree 使用详解

目录 一、 etree 介绍二、xpath 解析 html/xml1、第一步就是使用 etree 连接 html/xml 代码/文件。2、 xpath 表达式定位① xpath结合属性定位② xpath文本定位及获取③ xpath层级定位④ xpath索引定位⑤ xpath模糊匹配 一、 etree 介绍 lxml 库是 Python 中一个强大的 XML 处…...

vue3(十九)-基础入门之vue-nuxt反向代理

一、反向代理 1、下载 nuxtjs/proxy 使用 npm npm install nuxtjs/proxy 或使用 yarn yarn add nuxtjs/proxy 2、配置 nuxt.config.js 文件 export default {modules: [nuxtjs/axios,nuxtjs/proxy],axios: {baseURL: /,proxy: true},proxy: {/api/: {target: https://i.maoya…...

Unity3D 截图

使用 Unity3D 自带的截图接口&#xff0c;制作截图工具。 截图 有时候我们想对 Unity 的窗口进行截图&#xff0c;如果直接使用一些截图工具&#xff0c;很难截取到一张完整分辨率的图片&#xff08;例如&#xff0c;我们想要截取一张 1920 * 1080 的图片&#xff09;。 其实…...

【机器学习】近似分布的熵到底是p(x)lnq(x)还是q(x)lnq(x)?

【1】通信的定义 信息量&#xff08;Information Content&#xff09;是信息论中的一个核心概念&#xff0c;用于定量描述一个事件发生时所提供的“信息”的多少。它通常用随机变量 &#x1d465;的概率分布来定义。事件 &#x1d465;发生所携带的信息量由公式给出&#xff1…...

C语言:深入理解指针

一.内存和地址 我们知道计算机上CPU&#xff08;中央处理器&#xff09;在处理数据的时候&#xff0c;需要的数据是在内存中读取的&#xff0c;处理后的数据也会放回内存中&#xff0c;那我们买电脑的时候&#xff0c;电脑上内存是 8GB/16GB/32GB 等&#xff0c;那这些内存空间…...

Vue实训---4-使用Pinia实现menu菜单展示/隐藏

0.menu菜单展示/隐藏实现方法 Menu 菜单 | Element Plus中&#xff0c;当:collapse"isCollapse"其中isCollapse的值为true时菜单栏隐藏&#xff0c;当isCollapse的值为false时菜单栏显示。接下来使用pinia实现CommonAside.vue和CommonHeader.vue组件之间数据的共享&…...

Fakelocation Server服务器/专业版 Centos7

前言:需要Centos7系统 Fakelocation开源文件系统需求 Centos7 | Fakelocation | 任务一 更新Centos7 &#xff08;安装下载不再赘述&#xff09; sudo yum makecache fastsudo yum update -ysudo yum install -y kernelsudo reboot//如果遇到错误提示为 Another app is curre…...

网络安全,文明上网(4)掌握网络安全技术

前言 在数字化时代&#xff0c;个人信息和企业数据的安全变得尤为重要。为了有效保护这些宝贵资产&#xff0c;掌握一系列网络安全技术是关键。 核心技术及实施方式 1. 网络监控与过滤系统&#xff1a; 这些系统构成了网络防御体系的基石&#xff0c;它们负责监控网络通信&…...

Ettus USRP X410

总线连接器: 以太网 RF频率范围: 1 MHz 至 7.2 GHz GPSDO: 是 输出通道数量: 4 RF收发仪瞬时带宽: 400 MHz 输入通道数量: 4 FPGA: Zynq US RFSoC (ZU28DR) 1 MHz to 7.2 GHz&#xff0c;400 MHz带宽&#xff0c;GPS驯服OCXO&#xff0c;USRP软件无线电设备 Ettus USRP X410集…...