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

《操作系统 - 清华大学》5 -4:虚拟技术

文章目录

  • 0. 虚拟存储的定义
  • 1. 目标
  • 2.局部性原理
  • 3. 虚拟存储的思路与规则
  • 4. 虚拟存储的基本特征
  • 5. 虚拟页式存储管理
    • 5.1 页表表项
    • 5.2 示例

0. 虚拟存储的定义

在这里插入图片描述

1. 目标

虚拟内存管理技术,简称虚存技术。那为什么要虚存技术?在于前面覆盖和交换技术,其实还觉得技术上面还不够理想,还达不到很方便、很高效的内存使用的效果,所以需要能够有些更好的办法。

在这里插入图片描述

  1. 覆盖技术到底什么问题?程序员需要去管理哪些应该覆盖,哪些不应该覆盖,它需要把这个调用关系分析清楚,然后告诉相应的处理单元完成相应工作,这个对程序员负担太大。
  2. 交换技术的力度太大,它是一次以一个程序做一个交换力度,会导致整个系统开销变大。

有时候没必要把整个数据导出,希望是把一小部分导出去,能不能做到这一步? 其实是可以做到,希望通过一种更好的办法,充分地把前面覆盖技术和交换技术的问题解决掉,就是虚存技术。

当然这听起来很好,但它怎么能达到呢?先看看它的目标:
在这里插入图片描述

  1. 它能够像覆盖技术一样,它不是把程序的所有都放在内存中去,只是把程序中一小部分放到内存中去,既然不把所有内容放内存中去,它所需要的空闲空间其实没那么大,另外它跟覆盖技术最大的不同,它的过程由操作系统自动来完成,不需要程序员做出干预。这样可以极大地减轻程序员的负担。内存中存放的内容可以是一小部分和覆盖技术一样。
  2. 内存上也像交换技术一样,它能够实现就是程序在内存中跑之后可以动态地根据当前执行情况来把某些数据直接导出和导入,交换技术的导入导出是以一个程序为力度,是程序间的,那能不能做到不管是在程序间还是程序内都无所谓,以一个更小的力度,比如说以一个页为力度来作为交换单位把它导入导出到内存中去。

看上图可能就可以看出来这特点,有四个程序,操作系统有 CPU 的 MMU 支持,有硬件支持之后,比如分页机制支持,内存中,比如说以 P3为例,它只放了两个内存页,其他的数据全是导在硬盘上去的,那这种情况下,P3 运营时它只用了这两个数据,其它没有用到,既然没用到就没必要放到内存中去,这样的话就可以使得这个程序本来整体运行需要很大空间,但是在某一个有限的时间段内,实际需要一小段空间就够了。这种方法可以实现虚存管理想达到一种理想,这种方法其实通过操作系统和 MMU 是可以做到。

2.局部性原理

需要注意,做到之前由于整个处理过程是完全自动的,也就说它不需要程序介入,那其实表面上不需要,其实还是对程序提出一个要求。什么要求呢?就需要程序具有局部性特征。

在这里插入图片描述

程序的局部性原理是指程序在执行过程中,在一个较早的时间之内它所需要的数据和操作的指令分别局限在一定的区域。 这样就可以实现高效地执行。

局部性存在两个细分的概念,一个时间局部性,一个空间局部性

  • 时间局部性是指,一条指令的一次执行和下一次执行,一个数据的一次访问和下一次访问,都集中在很短的时间之内就完成了。
  • 空间局部性是指,当前指令和临近指令,或者当前访问数据和它临近的数据,都集中在一个区域里面,它们在内存中的位置靠得很近。

程序如果具有时间局部性和空间局部性,认为程序的局部性很好,意味着它执行效率会很高。设计程序的时候需要考虑局部性的特征,如果说程序局部性做得很好,操作系统就可以利用程序局部性的特点来实行高效的虚存管理,可以得到很理想的效果,让程序可以很小的一部分的空间放到内存中去,同时它执行效率很高,达到虚拟内存的理想,访问速度快(在执行过程中基本上就是跟在内存中访问完全一样,而且给执行程序提供很大的虚拟空间),空间大,使用方便(不需要程序员干预)。

也许这时候虚拟空间并没有都放在内存中,只是放在硬盘上,但由于读写硬盘的次数很少,使得整个执行效率还是可以很高,但这需要程序本身局部性的保证。

示例:
~  在这里插入图片描述
~  
C语言是按照行优先来放置二维数组 ,数组元素大小是4字节,所以一维数组大小为4K.
~  在这里插入图片描述

3. 虚拟存储的思路与规则

要实现高效的虚存管理机制,除了操作系统和硬件之外,需要程序具有一定的局部性,如果程序不具有局部性,那么高效机制实现起来就很困难。有了操作系统,有了内存管理单元,有分页机制,或者分段机制,再加上程序具有局部性,怎么实现虚存技术?

在这里插入图片描述
操作系统有了硬件支持(分段或者分页), CPU + MMU 有效地实现分段和分页机制。

在这里插入图片描述
有了分段和分页之后,在分段分页的内存管理之上来实现以页或者以段为单位的虚存管理。

大致流程这样:

  1. 首先装入程序时候,不必将所有代码或者数据放内存中去,而只需将当前需要执行的代码和数据放入到相关的页或者段中去,这样使得一小部分代码和数据放到内存中去了,只要一小部分程序代码在内存中,那就可以让程序执行。

  2. 当然很明显,当执行到一定阶段的时候,它可能接下来需要访问的代码或者数据还在硬盘中,所以会产生访问异常,称之为缺页或缺段异常,产生异常之后,操作系统会得到通知,通知之后,操作系统就会看一看,它如果觉得现在内存还有空间,就会把所需要代码数据从硬盘导到内存中去,那导入内存之后,这条没有访问到的指令可以重新执行,它可以继续往下走了。

  3. 但也有可能这时候内存中没有空间了,那这时候操作系统可能干的事要更复杂一点,它要考虑现在这些被占的这些内存的数据和代码,哪些是将来可能不太会用到的,或者一段时间内不会被访问到的,会把这些代码数据给导到外存中去,这样可以空出更多的空闲空间来放入当前需要的代码数据,继续执行。

    那它的选择也很重要,选择得好,也可以保证将来跟内存访问的读写次数就会少,整体性能开销就会大大减少,整个系统性能就会提高。

4. 虚拟存储的基本特征

在这里插入图片描述

  1. 空间很大。 它把硬盘当成了一个虚拟的空间,实际整个虚空间包含的大小是物理空间加上硬盘合在一起形成了虚拟空间,那这空间就很大。

比如说 CPU 是32位的机器,那么其实它的理论空间可以访问 4G,那其实物理内存可能只有26M,在这种情况下硬盘可以很大,通过硬盘的补充可以实现使得在内存中可以跑多个程序,而且每个程序还都认为它自己占了 4G的空间。
~  
这感觉很不错,更大的空间会随便使用,但其实在用的过程中,操作系统会自动根据它的判断,来把程序当前正在用到的代码数据放到内存中去,因为内存只有256M,256M内存还要包含Linux 内核,内核本身是不能被换出的,操作系统内核是常驻内存的,但是内存中运行的用户程序,它们不像操作系统那么关键,所以说它可以根据当时的执行情况来选择一小部分放在内存中执行,通过这种方式可以给每个自然运行的程序一个很大的虚拟地址空间。

  1. 部分交换, 它跟前面交换技术相比,需要注意,它每次换入换出是很规整的,要么一个段要么一个页,基于分段分页机制,分段分页是操作系统管理的,它不需要把整个程序都给换出去。交换力度更小,使得效率会更高。
  2. 不连续性, 不连续体现在它物理内存分配是不连续,同时虚拟内存空间使用也是不连续的,前面讲虚拟内存空间是连续的,由于有换入换出机制,可能把虚拟空间连续的这块区域一部分换出去,换出到外存中去。使得实际执行过程中可能会出现,连续执行到某个阶段的时候,这个页不存在,这个情况下就会产生访问异常,但这个异常没关系,操作系统会自动处理这个情况,会把需要连续执行数据和代码,再从外存中再放到内存中去,使得这个程序继续执行,不连续性体现在,本来所有的数据都应该连续地放在虚拟内存中,由于操作系统要把某些数据和代码换出去,造成所谓的不连续,但没关系,操作系统会帮助把它弥补好,使得程序可以正常去访问。

5. 虚拟页式存储管理

讲完这个特征之后,就要考虑到怎么去实现它,在现有硬件和操作系统管理下,能不能具体实现它?
在这里插入图片描述

首先以页式存储管理的基础来讲解虚拟内存管理。

看上图,左侧是逻辑地址空间,右侧是物理地址空间,左侧右侧以页为单位映射关系是靠页表来维护的,页表里面维护了映射关系,页表项的索引是页号,页表项的内容是页帧号。
~  
除了页帧号之外还有几个 bit,bit 其实是有很关键的作用,有 bit 代表页存在或不存在,内存地址访问时,通过查找页表发现对应页表项它的存在位是0,意味着这个虚拟机空间对应的物理空间是没有的,不存在映射关系,就会产生访问异常,那异常机制会用来作为虚拟内存管理的效率手段。

根据当前页式内存管理,再增加两个新的功能,一个是请求调页,第二个是页面置换:

  • 请求调页: 需要访问这个页, 才把这个页调到内存中来。

当一个用户程序需要调入内存运行时,不是把所有程序都放到内存来,而是装入一部分程序,放到个别页里面去,运行时候就有可能出现缺页异常,因为建立映射的时候,只映射一部分内存空间,接下来访问那些数据和代码还没有映射上去会产生异常,因为访问数据或者代码不在内存中,这就需要请求调页,真正访问的时候,不在的时候才发出请求。
~  
这时候 CPU 会向操作系统发出缺页异常信号,操作系统接收信号之后,会根据当前产生异常地址来找到对应硬盘或者外存中的地址到底是哪个数据需要被调到内存中去。数据找出来之后再放到相应的物理页去,使得该页可以继续执行。

  • 页面置换: 随着程序执行,占用内存越来越多,可能内存不够用,这时候就需要把某些给换出去,把某些需要的页换进来,那换出去的页是不常用页,换进来页是当前正需要的页,那这换入换出就是置换功能。这个功能实现得好坏决定了整体的效率,后面专门介绍有效的置换算法。

5.1 页表表项

为了能够实现请求校验和页面置换,需要在页表中增加一些位,辅助完成这个功能,4个位是比较重要的。

在这里插入图片描述

本来页表项里面存的最主要是页帧号,为了能够有效实现虚存管理,还需要增加几位:

  1. 第一个位 驻留位:表示是该页在不在内存里面,1 代表该页在内存中,意味着它的逻辑页号一定会有对应的物理页号,若为0 代表是当前逻辑页在内存中没有对应的物业页来支持。它的数据有可能是放在硬盘上,这时候如果访问到这一页,就会产生一次缺页中断,这是所谓驻留位,这很重要,它决定了所访问数据是否在内存。

  2. 保护位: 代表能否访问这个地址。有可能这个页是只读的,那写操作就会产生错误,因为它是只读的。有可能是可读可写的,那这时候写操作没问题。还有可能是可执行的,表示这段区域可以执行,那这时候做具体代码的执行操作是没问题,但是如果这个区域是不可执行的,它只是可读可写的,对这块区域做执行操作也会产生异常。

  3. 修改位: 代表这个页是否被修改过。如果这个页被写过,会被置1,若没被写过,那个页会被置成 0,这很重要。

    如果这页被写过,在内存中就维持这个数据,与之前放在硬盘的数据是不一致的,这时候在做换入换出时候,需要把数据导回到硬盘中,使得硬盘中保持数据和内存数据是一致的。如果修改位是0,意味着对这个页没有做写操作,那么它的数据和当时在硬盘中数据是一样。这时候就不需要做写回,如果把这页给换掉的话,直接释放就 OK 了。因为硬盘中的数据和内存中的数据是一致的,下次需要的时候再从内存中调就行了,通过这个修改为处理可以有效地提高置换功能的效率。

  4. 访问位:,代表这个页最近是否访问过。被访问过,会置成1,没有被访问过,置成0。这个很重要,因为在置换算法中,要把一些页换出去,到底换哪些?应该换当前没有被访问的页,把它换出去,那这个位在一定程上表明当前这个页是否经常被访问,如果这个页经常被访问,它应该置成1,既然它没有被置成1就意味着这个页很长时间没访问了,这个页也许不是将来很近的时间之内要会访问的页,就把这个页给换出去。

所以说这几个 bit 位会有效地帮助后续去做页的置换。

5.2 示例

看下图可以更进一步了解,有了这个位之后会产生现象。
在这里插入图片描述

左边图是它的虚存的页表的映射关系,它一共有64K,每一个页表项代表有4K物理页,X 表示驻留位为0,如果是一个具体的数,代表驻留位为1,那它的映射关系是有效的。

  1. 在这种情况下,如果说做一个访问,比如说想把虚拟的0地址的内容赋给一个寄存器,那查0地址在页表里面对应的映射关系,首先可以看最底下的值为 2,表示驻留位为1,且叶帧号是2,所以 2再乘以一个页大小是 8K,所以说它实际访问的物理地址是8192,这个操作很正常,没问题。
  2. 接下来,把虚拟地址32780的内容读到寄存器里面去。32780 其实对应页表项是第八项,32K ~ 36 k 区间,它里面驻留位设置是0,所以没有对应页帧号,也意味着访问这页会产生缺页异常,根据缺页机制把相应的页从外存中调进来。

相关文章:

《操作系统 - 清华大学》5 -4:虚拟技术

文章目录 0. 虚拟存储的定义1. 目标2.局部性原理3. 虚拟存储的思路与规则4. 虚拟存储的基本特征5. 虚拟页式存储管理5.1 页表表项5.2 示例 0. 虚拟存储的定义 1. 目标 虚拟内存管理技术,简称虚存技术。那为什么要虚存技术?在于前面覆盖和交换技术&#…...

网安瞭望台第5期 :7zip出现严重漏洞、识别网络钓鱼诈骗的方法分享

国内外要闻 7 - Zip存在高危漏洞,请立刻更新 2024 年 11 月 24 日,do son 报道了 7 - Zip 中存在的一个高严重性漏洞 CVE - 2024 - 11477。7 - Zip 是一款广受欢迎的文件压缩软件,而这个漏洞可能会让攻击者在存在漏洞的系统中执行恶意代码。…...

【JS】面试八股文

类型 JavaScript 有哪些数据类型,它们的区别? 答:JavaScript 共有八种数据类型, 分别是 Undefined、 Null、 Boolean、Number、String、Object、Symbol、BigInt。 其中 Symbol是ES6中新增的,BigInt 是 ES2020 中新增的。 Symbol 代表创建后独一无二且不可变的数据类型,…...

1、正则表达式

grep匹配 grep用来过滤文本内容,以匹配要查询的结果。 grep root /etc/passwd:匹配包含root的行 -m 数字:匹配几次后停止 -v:取反-i:忽略字符的大小写,默认的,可以不加-n&#xff1a…...

带有悬浮窗功能的Android应用

android api29 gradle 8.9 要求 布局文件 (floating_window_layout.xml): 增加、删除、关闭按钮默认隐藏。使用“开始”按钮来控制这些按钮的显示和隐藏。 服务类 (FloatingWindowService.kt): 实现“开始”按钮的功能,点击时切换增加、删除、关闭按钮的可见性。处…...

uniapp开发微信小程序笔记8-uniapp使用vant框架

前言:其实用uni-app开发微信小程序的首选不应该是vant,因为vant没有专门给uni-app设置专栏,可以看到目前Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本,并由社区团队维护 React 版本和支付宝小程序版本。 但是我之前维…...

C++软件设计模式之组合模式与其他模式的协作举例

组合模式(Composite Pattern)、装饰器模式(Decorator Pattern)、享元模式(Flyweight Pattern)、迭代器模式(Iterator Pattern)和访问者模式(Visitor Pattern)…...

ArcGIS pro中的回归分析浅析(加更)关于广义线性回归工具的补充内容

在回归分析浅析中篇的文章中, 有人问了一个问题: 案例里的calls数据貌似离散,更符合泊松模型,为啥不采用泊松而采用高斯呢? 确实,在中篇中写道: 在这个例子中我们为了更好地解释变量&#x…...

mybatis-plus 实现分页查询步骤

MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了代码生成器、条件构造器、分页插件等多种功能,其中分页查询是一个常用的功能。 以下是如何在 MyBatis-Plus 中实现分页查询…...

Vue开发中常见优化手段总结

Tree Shaking or Trunk 动态引入(Dynamic Imports) 动态引入是指在代码执行过程中,根据需要动态加载模块,而不是在应用启动时一次性加载所有模块。这可以通过JavaScript的import()函数实现,它返回一个Promise对象&…...

IDEA无法创建java8、11项目创建出的pom.xml为空

主要是由于Spring3.X版本不支持JDK8,JDK11,最低支持JDK17 解决的话要不就换成JDK17以上的版本,但是不太现实 另外可以参考以下方式解决 修改spring初始化服务器地址为阿里云的 https://start.aliyun.com/...

TCP/IP网络编程-C++(上)

TCP/IP网络编程-C (上) 一、基于TCP的服务端/客户端1、server端代码2、client端代码3、socket() 函数3.1、函数原型3.2、参数解析3.2.1、协议族(domain参数)3.2.2、套接字类型(type参数)3.2.3、最终使用的协…...

在线绘制Nature Communication同款双色、四色火山图,突出感兴趣的基因

导读:火山图通常使用三种颜色分别表示显著上调,显著下调和不显著。通过为特定的数据点添加另一种颜色,可以创建双色或四色火山图,从而更直观地突出感兴趣的数据点。 《Nature Communication》文章“Molecular and functional land…...

ctfshow pwn wp

文章目录 Test_your_ncpwn-0pwn1pwn2pwn3pwn4 前置基础pwn5pwn6pwn7pwn8pwn9pwn10pwn11pwn12pwn13:gcc编译执行C语言代码pwn14:gcc编译执行C语言代码pwn15:nasm编译asm,ld链接为可执行文件pwn16:gcc编译汇编文件.s为可…...

【数据结构实战篇】用C语言实现你的私有队列

🏝️专栏:【数据结构实战篇】 🌅主页:f狐o狸x 在前面的文章中我们用C语言实现了栈的数据结构,本期内容我们将实现队列的数据结构 一、队列的概念 队列:只允许在一端进行插入数据操作,在另一端…...

数据结构 (11)串的基本概念

一、串的定义 1.串是由一个或者多个字符组成的有限序列,一般记为:sa1a2…an(n≥0)。其中,s是串的名称,用单括号括起来的字符序列是串的值;ai(1≤i≤n)可以是字母、数字或…...

快速高效求素数|质数的方法—Java(模板)

判断素数|质数方法时间效率:线性筛法>埃氏筛法>试除法 在写算法题的时候,各种各样跟素数有关的题目非常常见,本文列出了三种常见的判断素数的方法 三种求素数方法的优缺点 一、试除法 试除法的基本思想是:判断一个数 x 是否为素数&…...

探秘嵌入式位运算:基础与高级技巧

目录 一、位运算基础知识 1.1. 位运算符 1.1.1. 与运算(&) 1.1.2. 或运算(|) 1.1.3. 异或运算(^) 1.1.4. 取反运算(~) 1.1.5. 双重按位取反运算符(~~&#xf…...

iOS 17.4 Not Installed

0x00 系统警告 没有安装 17.4 的模拟器,任何操作都无法进行! 点击 OK 去下载,完成之后,依旧是原样! 0x01 解决办法 1、先去官网下载对应的模拟器: https://developer.apple.com/download/all/?q17.4 …...

RestTemplate 使用教程

RestTemplate 是 Spring 框架提供的一种用于执行HTTP请求的同步客户端。它简化了与HTTP服务器的交互,并支持RESTful Web服务。 1. 添加依赖 首先,确保你的项目中包含了Spring Web的支持。如果你使用的是Maven,在pom.xml文件中添加如下依赖&…...

windows下安装wsl的ubuntu,同时配置深度学习环境

写在前面,本次文章只是个人学习记录,不具备教程的作用。个别信息是网上的,我会标注,个人是gpt生成的 安装wsl 直接看这个就行;可以不用备份软件源。 https://blog.csdn.net/weixin_44301630/article/details/1223900…...

【贪心算法第五弹——300.最长递增子序列】

目录 1.题目解析 题目来源 测试用例 2.算法原理 3.实战代码 代码解析 注意本题还有一种动态规划的解决方法,贪心的方法就是从动态规划的方法总结而来,各位可以移步博主的另一篇博客先了解一下:动态规划-子序列问题——300.长递增子序列…...

【数据分析】基于GEE解析2000-2020年武汉市FVC时空变化特征

武汉市FVC时空变化特征解析 1. 写在前面2. 2000~2020年武汉市FVC时空变化特征解析2.1. 数据获取与预处理2.2. 辐射定标和大气校正2.3. 云层和云影去除2.4. FVC计算2.5. 时空分析2.6. 代码1. 写在前面 🌍✨在应对全球气候变化和环境监测的挑战中,植被盖度(Fraction Vegetati…...

springboot实战(19)(条件分页查询、PageHelper、MYBATIS动态SQL、mapper映射配置文件、自定义类封装分页查询数据集)

引言: 该类博客的学习是基于b站黑马视频springbootvue视频学习!具体围绕项目——"大事件"进行实战学习。 目录 一、功能介绍(需求)。 1、文章列表功能基本介绍。 2、条件分页查询功能与注意。 3、前端页面效果。&#x…...

Mongo数据库 --- Mongo Pipeline

Mongo数据库 --- Mongo Pipeline 什么是Mongo PipelineMongo Pipeline常用的几个StageExplanation with example:MongoDB $matchMongoDB $projectMongoDB $groupMongoDB $unwindMongoDB $countMongoDB $addFields Some Query Examples在C#中使用Aggreagtion Pipeline**方法一: …...

Docker部署mysql:8.0.31+dbsyncer

Docker部署mysql8.0.31 创建本地mysql配置文件 mkdir -p /opt/mysql/log mkdir -p /opt/mysql/data mkdir -p /opt/mysql/conf cd /opt/mysql/conf touch my.config [mysql] #设置mysql客户端默认字符集 default-character-setUTF8MB4 [mysqld] #设置3306端口 port33…...

银河麒麟桌面系统——桌面鼠标变成x,窗口无关闭按钮的解决办法

银河麒麟桌面系统——桌面鼠标变成x,窗口无关闭按钮的解决办法 1、支持环境2、详细操作说明步骤1:用root账户登录电脑步骤2:导航到kylin-wm-chooser目录步骤3:编辑default.conf文件步骤4:重启电脑 3、结语 &#x1f49…...

【微服务】 Eureka和Ribbon

一、Eureka 服务调用出现的问题:在远程调用另一个服务时,我们采用的解决办法是发送一次http请求,每次环境的变更会产生新的地址,所以采用硬编码会出现很多麻烦,并且为了应对并发问题,采用分布式部署&#…...

C++设计模式(工厂模式)

一、介绍 1.动机 在软件系统中,经常面临着创建对象的工作,这些对象有可能是一系列相互依赖的对象;由于需求的变化,需要创建的对象的具体类型经常变化,同时也可能会有更多系列的对象需要被创建。 如何应对这种变化&a…...

nodejs第三方库sharp对图片的操作生成新图片、压缩、添加文字水印及图片水印等

Sharp是一个基于libvips的高性能Node.js图像处理库,它提供了广泛的功能,包括调整大小、裁剪、旋转、格式转换等。Sharp可以处理多种图像格式,并且能够高效地转换图像格式。 相关说明及用法看:https://sharp.nodejs.cn/ 安装&#…...

uniapp-vue2引用了vue-inset-loader插件编译小程序报错

报错信息 Error: Vue packages version mismatch: - vue3.2.45 (D:\qjy-myApp\admin-app\node_modules\vue\index.js) - vue-template-compiler2.7.16 (D:\qjy-myApp\admin-app\node_modules\vue-template-compiler\package.json) This may cause things to work incorrectly.…...

计算机的错误计算(一百六十七)

摘要 将计算机的错误计算(一百六十六)中算式的分母有理化,然后再在 MATLAB 讨论其计算精度。本节说明,MATLAB 的输出与(一百六十六)的输出几乎一致,有效数字的错误率也相同。 例1. 探讨 …...

交叉编译openSSH

升级原系统中的SSHd服务 由于原系统自带的SSH版本过低存在漏洞风险,所以需要升级新版本的SSH 交叉编译前准备 需要下面三个库,都是开源的,去对应的网站下载即可 openssh-9.6p1.tar.gz openssl-1.1.1w.tar.gz zlib-1.3.1.tar.gz 这里没有…...

从零开始学GeoServer源码(二)添加支持arcgis切片功能

文章目录 参考文章环境背景1、配置打包好的程序1.1、下载GeoServer的war包1.2、下载GeoWebCache1.3、拷贝jar包1.4、修改配置文件1.4.1、拷贝geowebcache-arcgiscache-context.xml1.4.2、修改geowebcache-core-context.xml1.4.3、修改geowebcache-servlet.xml 1.5、配置切片信息…...

Android OTA 更新面试题及参考答案

什么是 OTA 更新? OTA 更新即空中下载技术(Over-the-Air Technology)更新,是一种通过无线网络对移动设备的系统软件或应用程序进行远程更新的技术手段 。 其原理是设备通过移动网络或 Wi-Fi 连接到服务器,服务器检测设…...

搜维尔科技:通过Touch力反馈主手实时通讯机械臂,进行远程操作

通过Touch力反馈主手实时通讯机械臂,进行远程操作 搜维尔科技:通过Touch力反馈主手实时通讯机械臂,进行远程操作...

Java ArrayList 与顺序表:在编程海洋中把握数据结构的关键之锚

我的个人主页 我的专栏:Java-数据结构,希望能帮助到大家!!!点赞❤ 收藏❤ 前言:在 Java编程的广袤世界里,数据结构犹如精巧的建筑蓝图,决定着程序在数据处理与存储时的效率、灵活性以…...

React中事件处理和合成事件:理解与使用

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

在Vue3项目中引入省市区联动插件

1. 打开HBuilder X 图1 2. 新建一个空项目 文件->新建->项目->uni-app 填写项目名称:vue3demo 选择项目存放目录:D:/HBuilderProjects 一定要注意vue的版本,当前选择的版本为vue3 图2 点击“创建”之后进入项目界面 图3 其中各文件…...

动态内存管理(c语言)

我们通常开辟空间的方式 int val 20; //大小为4个字节 char arr[10] {0} //开辟出一块连续的空间且大小为10 但是上面开辟空间方式的特点 1.空间开辟大小是固定的 2.数组在声明得时候,必须指定数组得长度,它所需要得内存在编译时分配 但是以上的方式不能…...

SLF4J日志快速上手

tags: SpringBoot 日志 快速上手 SLF4J日志快速上手 第一步:添加日志相关配置 logging:level:root: INFO # 设置全局日志级别为 INFO,只显示重要的日志信息(略过 DEBUG 和 TRACE 级别)# org.hibernate.SQL: DEBUG # 对于 Hiber…...

【PyTorch】(基础三)---- 图像读取和展示

图像读取和展示 pytorch本身并不提供图像的读取和展示功能,利用pytorch执行计算机视觉任务的时候,通常是利用opencv等工具先进行图像处理,然后将结果转化成tensor类型传递给pytorch,在pytorch执行之后,也可以将tensor…...

【纪念365天】我的创作纪念日

过去的一年 没有注意加入csdn已经有一年了。 这几天翻看小猴儿的通知才发现时间来到了一年的纪念日。稍稍思索想要将这一段时间的学习到的知识以及偶然遇到的机遇做一下总结。 上一次写纪念日是来到csdn128天的时候, 200天前我的学习状态是非常疯狂的。 只记得我当时…...

flink学习(7)——window

概述 窗口的长度(大小): 决定了要计算最近多长时间的数据 窗口的间隔: 决定了每隔多久计算一次 举例:每隔10min,计算最近24h的热搜词,24小时是长度,每隔10分钟是间隔。 窗口的分类 1、根据window前是否调用keyBy分为键控窗口和非键控窗口…...

第十六届蓝桥杯模拟赛第二期题解—Java

第十六届蓝桥杯模拟赛/校赛第二期个人题解,有错误的地方欢迎各位大佬指正 问题一(填空题) 【问题描述】 如果一个数 p 是个质数,同时又是整数 a 的约数,则 p 称为 a 的一个质因数。 请问, 2024 的最大的质因数是多少? …...

数据库-MySQL-Dynamic-Datasource源码解析

文章目录 前言一、简介二、整体流程三、核心解析四、总结 前言 多数据源的应用在日常项目中也是很常见的场景。 dynamic-datasource的功能,用起来的确很方便,只需要一个DS注解,加上一些简单的配置即可完成多数据源的切换。究竟是怎么做到的…...

uniapp+vue2+uview2.0导航栏组件二次封装

样式 代码 <template><view class"navBar"><u-navbar :title"title" :titleColor"titleColor" :bgColor"bgColor" :safeAreaInsetTop"safeAreaInsetTop":autoBack"true" leftClick"leftClic…...

【Git 工具】用 IntelliJ IDEA 玩转 Git 分支与版本管理

文章目录 一、使用 IDEA 配置和操作 Git1.1 查看 Idea 中的 Git 配置1.2 克隆 Github 项目到本地 二、版本管理2.1 提交并推送修改2.2 拉取远程仓库2.3 查看历史2.4 版本回退 三、分支管理3.1 新建分支3.2 切换分支3.2 合并分支3.4 Cherry-Pick 参考资料 一、使用 IDEA 配置和操…...

异或-java-leetcode

1486.数组异或操作 给你两个整数&#xff0c;n 和 start 。 数组 nums 定义为&#xff1a;nums[i] start 2*i&#xff08;下标从 0 开始&#xff09;且 n nums.length 。 请返回 nums 中所有元素按位异或&#xff08;XOR&#xff09;后得到的结果。 示例 1&#xff1a; 输入…...

Jmeter中的测试片段和非测试原件

1&#xff09;测试片段 1--测试片段 功能特点 重用性&#xff1a;将常用的测试元素组合成一个测试片段&#xff0c;便于在多个线程组中重用。模块化&#xff1a;提高测试计划的模块化程度&#xff0c;使测试计划更易于管理和维护。灵活性&#xff1a;可以通过模块控制器灵活地…...