王道操作系统课代表 - 考研计算机 第三章 内存管理 究极精华总结笔记
本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对
操作系统知识点的理解的总结。希望对新一届的计算机考研人提供帮助!!!
关于对 “内存管理” 章节知识点总结的十分全面,涵括了《操作系统》课程里的全部要点(本人来来回回过了三遍视频),其中还陆陆续续补充了许多内容,所以读者可以相信本篇博客对于考研操作系统 “内存管理” 章节知识点的正确性与全面性;但如果还有自主命题的学校,还需额外读者自行再观看对应学校的自主命题材料。
食用说明书:
第一遍学习王道课程时,我的笔记只有标题和截图,后来复习发现看只看图片,并不能很快的了解截图中要重点表达的知识点。
在第二遍复习中,我给每一张截图中 标记了重点,以及 每张图片上方总结了该图片 对应的知识点 以及自己的 思考 。
最后第三遍,查漏补缺。
所以 ,我把目录放在博客的前面,就是希望读者可以结合目录结构去更好的学习知识点,之后冲刺复习阶段脑海里可以浮现出该知识结构,做到对每一个知识点熟稔于心!
请读者放心!目录展示的知识点结构是十分合理的,可以放心使用该结构去记忆学习!
注意(⊙o⊙)!,每张图片上面的文字,都是该图对应的知识点总结,方便读者更快理解图片内容。
《操作系统》第3章 内存管理
【考纲内容】
王道 P177 ~ 248(一) 内存管理基础
网课耗时:
3.5 h
- ==内存管理概念:==逻辑地址与物理地址空间,地址交换,内存共享,内存保护,内存分配与回收;
- ==连续分配管理方式:==页式管理;段式管理;段页式管理;
(二) 虚拟内存管理
网课耗时:
1.5 h
- 虚拟内存基本概念;
- 请求页式管理;
- 页框分配;
- 页置换算法;
- 内存映射文件;
- 虚拟存储器性能的影响因素及改进方式;
【复习提示】
内存管理 和 进程管理 是操作系统的 核心 ;
本章围绕 分页机制 展开:
通过 分页管理方式 在物理内存大小的基础上提高内存的利用率,
再进一步引入 请求分页管理方式 ,实现虚拟内存,使内存脱离物理大小的限制,从而提高处理器的利用率;
3.1 内存管理概念
3.1.1 内存的基础知识

1. 什么是内存 ?
【补充】机械字 是硬件(物理)单元,存储单元 是逻辑单元,内存可以看成一个个存储单元组成;
内存的一大作用是 缓和CPU与硬盘之间的速度矛盾 ;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sGaAYKkS-1677664821962)(《操作系统》第3章 内存管理.assets/image-20220812211447837.png)]
补充知识:常用的数量单位:
- 210 = 1K
- 220 = 1M
- 230 = 1G

2. 进程运行的基本原理
创建进程首先要将程序和数据装入内存;
将 用户源程序 变为 ==可在内存中执行的程序,==通常需要以下几个步骤:
- 编译:由 编译程序 将 用户源代码 编译成 若干个模块(机器指令);
- 链接:由 链接程序 将 编译后形成的一组 目标模块 及 它们所需的 库函数 链接在一起,形成一个完整的 装入模块;
- 装入:由 装入程序 将 装入模块 装入内存运行;

(1) 逻辑地址 与 物理地址
指令的工作原理是基于 地址 进行的,而 每个地址对应一个数据的存储单元 ;

编译后,每个目标模块都从0号单元开始编址,这称为该目标的 相对地址(或逻辑地址)
当链接程序将各个模块链接成一个完整的可执行目标程序时,链接程序按顺序依次按各个模块的相对地址构成一个统一的从0号单元开始编址的 逻辑地址空间(或虚拟地址空间)
对于32位系统,逻辑地址空间的范围为 0 ~ 232 - 1
不同进程可以有相同的逻辑地址,因为这些相同的逻辑地址可以映射到主存的不同位置;
物理地址空间 是指内存中物理单元的集合,它是 地址转换 的最终地址;
进程在运行时执行指令和访问数据,最后都要通过物理地址从主存中存取;
当 装入程序 将可执行代码装入内存时,必须通过地址转换将逻辑地址转为物理地址,这个过程称为 地址重定位 ;

有三种装入方式,也就是三种重定位方式,用来解决指令中的逻辑地址到物理地址的转换(后面再补充)

(2) 链接的三种方式
① 静态链接

② 装入时动态链接

③ 运行时动态链接

(3) 装入的三种方式

① 绝对装入

② 可重定位装入(静态重定位)

③ 动态运行时装入


小结
1、从逻辑方面认识 内存和内存结构 ;
2、==进程运行的基本原理:==指令工作原理 + 逻辑地址与物理地址 + 编译、链接、装入;

3.1.2 内存管理的主要功能
王道课本在介绍 ==内存管理的主要功能,==有5个方面,课程只介绍了4个,少了 内存共享 ;
本节只是让你初步认识 内存管理功能 的 基本概念 ,后续章节会展开介绍;

1. 内存空间的分配与回收
具体负责:如何分配 ?如何回收 ?哪些分配了哪些还空闲 ?

2. 内存空间的扩充

3. 地址转换
逻辑地址 转换为 物理地址,也就是 地址重定位 ,涉及到之前介绍的 三种装入方式 ;


4. 存储保护
已经各个分配的内存空间互不影响,也就是说 确保各进程不会为了内存 打架 ;

内存保护的两种方法
方法一:设置一对上、下限寄存器,明确进程指令所能访问的 地址范围 ;

内存保护的两种方法
方法二:重定位寄存器 + 界地址寄存器。思想不变,本质还是确定进程指令所能访问的 地址范围 ;

小结
本节就是介绍 内存管理主要功能 的 基本概念 ;

3.1.3 覆盖与交换
覆盖 与 交换 是在多道程序运行环境下用来 扩充内存 的两种方法;

1. 覆盖技术
覆盖:分段思想 + 一个固定区 + 若干个覆盖区;


2. 交换技术
内存调度 就是通过 交换技术 实现的;


文件区 - 离散分配方式;
对换区 - 连续分配方式;

小结
下图总结的很充分,看下图复习即可;

3.1.4 连续分配管理方式
==连续分配方式:==为一个用户程序分配一个 连续的内存空间 ;

1. 单一连续分配

2. 固定分区分配
内存分区,每个分区装入一道作业;


3. 动态分区分配

问题1:操作系统要使用什么样的数据结构记录内存的使用情况 ?

问题2:当有很多空闲分区满足需求,该选择哪一个分区呢 ?

问题3:如何进行分区的分配与回收 ?
分配时可能遇到的情况:
- 分配的空间有剩余;
- 分配的空间刚刚好;


回收时可能遇到的情况:
情况一

情况二

情况三

情况四

内部碎片 和 外部碎片

4. 动态分区分配算法

① 首先适应算法(First Fit)


首次适应算法最简单,但会使得内存的 低地址部分 出现很多小的空闲分区,并且每次分配查找都要经过这些分区,增加开销;

② 最佳适应算法

③ 最坏适应算法

④ 邻进适应算法

小结
1、单一连续分配 (单一分区分配);
2、固定分区分配;
3、动态分区分配 - 动态分区分配算法;
要理解好 分区 的意义,就是一道作业对应一个分区;


3.1.5 基本分页存储管理 ⭐
固定分区会产生 ==内部碎片,==动态分区会产生 ==外部碎片,==这两种技术对内存的利用率都比较低;
为了尽量避免碎片的产生,就引入了 分页 的思想;

1. 分页存储的基本概念
(1) 回顾:地址空间

(2) 分页存储
① 分页思想
把主存空间划分成大小相等且固定的块,作为主存的基本单位;
每个进程也以块为单位进行划分,进程在执行时,以块为单位逐个申请主存中的块空间;
分页很像分区相等的固定分区技术,所以 分页管理也不会产生外部碎片 ;
区别:块的大小相对于分区来说要小很多,而且进程也按照块进行划分,进程运行时按块申请主存可用空间并执行;
进程只会在为最后一个不完整的的块申请一个主存块空间时,产生主存碎片==(页内碎片)==
② 页面和页面大小
进程中的块称为 ==页 或 页面,==内存中的块称为 ==页框 或 页帧,==外存直接称为 块 或 盘块;(注意和 存储单元 做区分)
页 和 页框 是逻辑划分,块 是物理划分;
进程在执行时申请主存空间,就是为 每个页面 分配主存中的 ==可用页框,==这就是 页 和 页框 的一一对应;

③ 页表
页表的作用:实现从页号到物理块号的地址映射;
注意很关键的一点,进程分成n块,页表对应n个页表项;

关于 页表 的两个问题,下面依次解答

【问题】
每个页表项占多少字节 ?

页表项中的 页号 可以 ==隐含,==即 页号不占用存储空间 ;
例如:==arr[1] = 101;==用页表项的角度来看,就是 1号页 对应的块号 是101;

每个页表项占 3B,存储整个页表至少需要
3 × (n + 1) B(n取决进程可分为多少页)

【问题】
如何实现地址的转换 ?
答:起始位置 + 偏移量(连续存放)

分页存储,逻辑地址A对应的物理地址 = P号页面在内存中的 起始地址 + 页面偏移量W

下面是一些关于分页的计算问题
【问题】
如何确定一个逻辑地址对应的页号、页内偏移量 ?

下图用32位的逻辑地址,页面大小为 212B
前20位表示页号,后12位表示页内偏移量;


【问题】
为何页面大小要取2的整数幂 ?

(4) 逻辑地址结构
逻辑地址 = 页号 + 页内偏移量
页内偏移量的位数K 表示 页的大小为 2K ;
页号的位数M 表示 共有 2M 个页面;

小结
1、分页的基本概念;
2、页表。进程大小 决定 页表项数量,内存大小 决定 页表项长度;
3、逻辑地址结构。进程大小 决定 页号 P,内存块大小 决定 页内偏移量 W;
4、如何借助页表实现地址转换;

2. 基本地址变化机构 ⭐

地址变换机构 是用于实现地址转换的 一组硬件机构 ;

① 根据逻辑地址求 页号 和 页内偏移量;
② 比较 页号P 和 ==页表长度M,==是否 页号越界(M表示有M个页表项);
③ 根据 页表寄存器 的信息,找到页表,查询页号对应的 内存块号;
④ 计算出物理地址
E = b × L + W; ⑤ 用得到的物理地址E访存;

用文字再复习下上图地址变换的过程

我们计算,是使用
b × L + M计算出物理地址; 但如果把内存块号、页内偏移量用二进制拼接起来,得到的物理地址是相同的;

例题,尝试计算一下

关于 页表项 的计算问题,如下图所示:
存储页表时,若采用 3个字节 时,页框会剩余1B的,其它页表项被迫存储在下一个页框里;
但进程页表通常是 连续存储 的;
针对这个问题,虽然 3字节 已经可以表示内存块号范围,但为了不产生页内碎片,所以采用 4字节 的页表项;

注意进程页表是装在 连续的内存块中 ;

小结
下图三部分总结的很好,注意标红部分;

3. 具有快表的地址变换机构

① 什么是快表 ?
快表不是内存,是一种高速缓存,但和狭义上的Cache还是有区别的;

【问题】
能否把整个页表都放在TLB中 ?
答:太贵了;所以应该选择合适的 页面置换算法 更实惠,选择把 最有用的页表项 放进快表里;

② 引入快表后,地址的变换过程
注意!快表是一个硬件,但进程切换时,快表内容会被清空,所以每次初始的时候,快表里是空的;
页表是根据进程存在的,而快表是独立于进程的;



③ 局部性原理

小结

4. 两级页表

(1). 单级页表存在的问题 ?如何解决 ?
单级页表存在的第一个问题:
下图的情况,需要专门给进程分配 1024个连续的页框 来存放它的页表;
不仅需要占用较大的连续空间,而且也丧失了 离散分配 的优点;

单级页表存在的第二个问题:根据局部性原理,没必要把整个页表常驻内存,因为进程只会访问部分页面;

总结下单级页表需要解决的两个问题

这里先简单提一下 虚拟存储技术 ;
给每个页表项增加一个 标志位,用来记录是否在内存中;

(2). 两级页表的原理、地址结构



(3). 如何实现地址变换 ?

(4). 两级页表需要注意的几个细节

小结
下图总结的很好,看下图即可;

章节小结
1、分页存储的基本概念;
2、地址变换机构;
3、快表;
4、两级页表;
3.1.6 基本分段存储管理 ⭐

1. 分段
按照程序 自身逻辑关系 划分为 ==若干个段,==每段从0开始编制;
程序员用段名来编程,编译程负责序会把段名转换为段号;


2. 段表
段号也可以 隐含 段号;
因为各段的长度不一,所以段表里添加了记录段长的字段;

3. 如何实现地址变换


4. 分段、分页管理的对比




小结
1、分段的基本概念;
2、段表;
3、地址变换;
4、分段 vs. 分页

3.1.7 段页式管理
还没看视频,等复习完分页、分段,再来看

1. 分页、分段的优缺点分析

2. 分段 + 分页 = 段页式管理
进程按 逻辑分段,各段按物理分页;


3. 段表、页表

4. 如何实现地址变换

小结
1、分页、分段的优缺点;
2、段页式存储的基本概念;
3、页表、段表结构;
4、地址变换;

3.2 虚拟内存管理
3.2.1 虚拟内存的基本概念

虚拟内存是基于高速缓存技术,提出的一种内存管理方案;

1. 传统存储管理方式的特征、缺点
- 一次性
- 驻留性

2. 局部性原理
传统存储管理就是想可以最大程度地压榨内存资源,不管有没有用,占住内存空间最重要;
虚拟存储技术,就是让最关键的哪个作业运行,其它不是很关键的作业先不管,就让人觉得内存好像很大;
根据什么策略选择呢?局部性原理
- 时间局部性;
- 空间局部性;

3. 虚拟内存的定义和特征
虚拟内存的思想:部分装入 + 请求调入 + 置换功能(对用户透明)–> 虚拟大内存
虚拟内存的特征:
- 多次性
- 对换性
- 虚拟性

4. 如何实现虚拟内存技术
【补充】虚拟内存的实现需要一定的硬件支持:
- 一定容量的 内存 和 外存 ;
- 页表机制(或段表机制),作为主要的数据结构;
- ==中断机构,==当用户程序要访问的部分尚未调入内存时,则会产生中断;
- ==地址变换机构,==逻辑机构到物理地址的变换;
虚拟内存的实现(三种方式)
- 请求分页存储管理
- 请求分段存储管理
- 请求段页式存储管理

小结
1、传统存储管理方式的特征、缺点;
2、局部性原理;
3、虚拟内存的定义和特征;
4、==如何实现虚拟技术:==部分装入 + 请求调入 + 置换功能(请求分页存储管理);

3.2.2 请求分页管理方式 ⭐
程序进内存时,基本分页的一次性 与 请求分页的多次性 ,两者的不同导致后续程序运行过程中也有区别;
由于多次性,导致请求分页还需要 请求调页 和 页面置换 两者功能;

1. 页表机制
基本分页页表 vs. 请求分页页表

2. 缺页中断机构


3. 地址变换机构
注意 请求分页 存储管理 与 基本分页 存储管理 的区别;

如果在快表中找到某个页面对应的页表项,那么这个页面一定是在内存中的;
若这个页面被换出外存,则快表中的相应表项也要删除,否则可能访问错误的页面;

重点留意王道 图 3-24 请求分页的地址变换过程


小结
1、页表机制;
2、缺页中断机构;
3、地址变换机构;

3.2.3 页面置换算法 ⭐

1. 最佳置换算法
OPT:选择剩余价值最低的;


OPT 算法只能是理想算法,因为无法提前知道未来要被调用的页面;

2. 先进先出置换算法


为进程分配 四个内存块时,缺页不减反增 - Belady 异常

3. 最近最久未使用置换算法
LRU:淘汰老页面

LRU 算法性能好,但是需要专门硬件,实现困难;

4. 时钟置换算法


5. 改进型的时钟置换算法
改进思想:当页面未被修改过,可以直接抛弃,无需写回外存;
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3v5cVxVr-1677664822065)(《操作系统》第3章 内存管理.assets/image-20220922202300293.png)]](https://img-blog.csdnimg.cn/eccbcc72eae94f88aabd4a6e205b77ba.png)

小结

3.2.4 页面分配策略、抖动、工作集

1. 驻留集

2. 页面分配、置换策略
- 固定分配局部置换
- 可变分配全局置换
- 可变分配局部置换

3. 调入页面的时机

4. 从何处调页



5. 抖动(颠簸)现象

6. 工作集

小结
下图总结的很好,直接看下图小结;

3.2.5 内存映射文件

1. 内存映射文件
本质就是操作系统向上层程序员提供的一个功能,作用:
- 方便程序员访问文件数据;
- 方便多个进程共享同一个文件;

2. 传统的文件访问方式

3. 内存映射文件的原理和作用
① 方便程序员访问文件数据;
传统文件访问方式,文件其实是离散地分布在磁盘里;
采用内存映射文件方式,会让你感觉要访问的文件是连续的存储;

当我们要读入第2块数据时,但此时还没有数据,就会有一个缺页异常,操作系统就会去把对应的数据调入内存;
也就是说,程序员再也不用考虑 read操作 了,读入数据的过程由操作系统替我们完成;

② 方便多个进程共享同一个文件

小结

3.3 常见问题和易混淆知识点
分页管理方式和分段管理方式在很多地方是相似的,比如在内存中都是不连续的、都有地址变换机构来进行地址映射等。
但两者也存在许多区别,如下:
| 分页 | 分段 | |
|---|---|---|
| 目的 | 分页仅是系统管理上的需要,是为实现离散分配方式,以提高内存的利用率。而不是用户的需要; | 段是信息的逻辑单位,它含有一组意义相对完整的信息。分段的目的是能更好地满足用户的需要; |
| 长度 | 页的大小固定且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的; | 段的长度不固定,决定于用户所编写的程序,通常由编译程序在编译时根据信息的性质来划分; |
| 地址空间 | 分页的程序地址空间是一维的,即单一的线性地址空间,程序员利用一个记忆符即可表示一个地址; | 分段的程序地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址; |
| 碎片 | 有内部碎片,无外部碎片; | 有外部碎片,无内部碎片; |
1)为什么要进行内存管理 ?
在单道系统阶段,一个系统在一个时间段内只执行一个程序,内存的分配极其简单,即仅分配给当前运行的进程;
引入多道程序后,进程之间共享的不仅仅是处理机,还有主存储器。然而,共享主存会形成一些特殊的挑战;
若不对内存进行管理,则容易导致内存数据的混乱,以至于影响进程的并发执行;
因此,为了更好地支持多道程序并发执行,必须进行内存管理;
2)页式管理中每个页表项大小的下限如何决定 ?
页表项的作用是找到该页在内存中的位置;
以32位逻辑地址空间、字节编址单位、一页4KB为例,
地址空间内共含有 232 B / 4KB = 1M 页,需要 log21 M = 20 位才能保证表示范围能容纳所有页面;
又因为以字节作为编址单位,即 页表项的大小 ≥ ⌈20 / 8⌉ = 3B ;
当然,也可选择更大的页表项大小,让一个页面能够正好容下整数个页表项,以方便存储
(例如取成4B,一页正好可以装下1K个页表项),或增加一些其他信息。
3)多级页表解决了什么问题 ?又会带来什么问题 ?
多级页表解决了当逻辑地址空间过大时,页表的长度会大大增加的问题;
而采用多级页表时,一次访盘需要多次访问内存甚至磁盘,会大大增加一次访存的时间;
无论是段式管理、页式管理还是段页式管理,读者都只需要掌握下面3个关键问题:
- ① 逻辑地址结构
- ② 表项结构
- ③ 寻址过程
搞清楚这三个问题,就相当于搞清楚了上面几种存储管理方式。再次提醒读者区分逻辑地址结构和表项结构;
1)为什么要引入虚拟内存 ?
上一节提到过,多道程序并发执行不仅使进程之间共享了处理器,而且同时共享了主存;
然而,随着对处理器需求的增长,进程的执行速度会以某种合理平滑的方式慢下来;
但是,若同时运行的进程太多,则需要很多的内存,当一个程序没有内存空间可用时,那么它甚至无法运行;
所以,在物理上扩展内存相对有限的条件下,应尝试以一些其他可行的方式在逻辑上扩充内存。
2)虚拟内存空间的大小由什么因素决定 ?
虚存的容量要满足以下两个条件:
- ① 虚存的实际容量 ≤ 内存容量和外存容量之和,这是硬件的硬性条件规定的,若虚存的实际容量超过了这个容量,则没有相应的空间来供虚存使用;
- ② 虚存的最大容量 ≤ 计算机的地址位数能容纳的最大容量;
假设地址是 32 位的,按字节编址,一个地址代表 1B 存储空间,则 虚存的最大容量 ≤ 4GB (232 B);
这是因为若虚存的最大容量超过 4GB,则 32 位的地址将无法访问全部虚存,也就是说 4GB 以后的空间被浪费了,相当于没有一样,没有任何意义; 实际虚存的容量是取条件①和②的交集,即两个条件都要满足,仅满足一个条件是不行的。
3)虚拟内存是怎么解决问题的 ?会带来什么问题 ?
虚拟内存使用外存上的空间来扩充内存空间;
通过一定的换入/换出,使得整个系统在逻辑上能够使用一个远远超出其物理内存大小的内存容量;
因为虚拟内存技术调换页面时需要访问外存,会导致平均访存时间增加,若使用了不合适的替换算法,则会大大降低系统性能。
本节学习了4种页面置换算法,要把它们与处理机调度算法区分开;
当然,这些调度算法之间也是有联系的,它们都有一个共同点,即通过一定的准则决定资源的分配对象;
在处理机调度算法中这些准则比较多,有优先级、响应比、时间片等,而在页面调度算法中就比较简单,即是否被用到过或近段时间内是否经常使用;
在操作系统中,几乎每类资源都会有相关的调度算法,读者通过将这些调度算法作为线索,可把整个操作系统的课程连成一个整体。
相关文章:
王道操作系统课代表 - 考研计算机 第三章 内存管理 究极精华总结笔记
本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对 操作系统 知识点的理解的总结。希望对新一届的计算机考研人提供帮助!!! 关于对 “内存管理” 章节知识点总结的十分全面,涵括了《操作系统》课程里的全部…...
Cypher中的聚合
深解Cypher中的聚合 值或计数的聚合要么从查询返回,要么用作多步查询下一部分的输入。查看数据模型 CALL db.schema.visualization() 查看图中节点的属性类型 CALL db.schema.notetypeproperties() 查看图中关系的属性类型 CALL db.schema.reltypeproperties() C…...
图注意网络GAT理解及Pytorch代码实现【PyGAT代码详细注释】
文章目录GAT代码实现【PyGAT】GraphAttentionLayer【一个图注意力层实现】用上面实现的单层网络测试加入Multi-head机制的GAT对数据集Cora的处理csr_matrix()处理稀疏矩阵encode_onehot()对label编号build graph邻接矩阵构造GAT的推广GAT 题:Graph Attention Netwo…...
项目成本管理中的常见误区及解决方案
做过项目的人都明白,项目实施时间一般很长,在实施期间总有很多项目结果不尽人意的问题。要使一个项目取得成功,就要结合很多因素一起才能作用,其中做好项目成本的管理就是最重要的步骤之一,下面列出了常见的项目成本管…...
墨天轮2022年度数据库获奖名单
2022年,国家相继从高位部署、省级试点布局、地市重点深入三个维度,颁布了多项中国数据库行业发展的利好政策。但是我们也能清晰地看到,中国数据库行业发展之路道阻且长,而道路上的“拦路虎”之一则是生态。中国数据库的发展需要多…...
仓储调度|库存管理系统
技术:Java、JSP等摘要:随着电子商务技术和网络技术的快速发展,现代物流技术也在不断进步。物流技术是指与物流要素活动有关的所有专业技术的总称,包括各种操作方法、管理技能等,物流业采用某些现代信息技术方面的成功经…...
Canvas入门-01
导读: 读完全文需要2min。通过这篇文章,你可以了解到以下内容: Canvas标签基本属性如何使用Canvas画矩形、圆形、线条、曲线、笑脸😊 如果你曾经了解过Canvas,可以对照目录回忆一下能否回答上来 毕竟带着问题学习最有效…...
运算符优先级
醋坛酸味罐,位落跳福豆 醋:初等运算符: () [] -> . 坛:单目运算符: - ~ – * & ! sizeof 右结合 酸:算术运算符: - * / % 味:位移运算符:>> << …...
微信小程序使用scss编译wxss文件的配置步骤
文章目录1、在 vscode 中搜索 easysass 插件并安装2、在微信开发工具中导入安装的easysass插件3、修改 spook.easysass-0.0.6/package.json 文件中的配置4、重启开发者工具,就可用使用了微信小程序开发者工具集成了 vscode 编辑器,可以使用 vscode 中众多…...
一步一步教你如何使用 Visual Studio Code 编译一段 C# 代码
以下是一步一步教你如何使用 Visual Studio Code 编写使用 C# 语言输出当前日期和时间的代码: 1、下载并安装 .NET SDK。您可以从 Microsoft 官网下载并安装它。 2、打开 Visual Studio Code,并安装 C# 扩展。您可以在 Visual Studio Code 中通过扩展菜…...
vue-cli中的环境变量注意点
在客户端侧代码中使用环境变量只有以 VUE_APP_ 开头的变量会被 webpack.DefinePlugin 静态嵌入到客户端侧的包中。你可以在应用的代码中这样访问它们:console.log(process.env.VUE_APP_SECRET)在构建过程中,process.env.VUE_APP_SECRET 将会被相应的值所…...
2.3数据类型
文章目录1. 命名规则2.字符3.数字4.日期5.图片1. 命名规则 字段名必须以字母开头,尽量不要使用拼音长度不能超过30个字符(不同数据库,不同版本会有不同)不能使用SQL的保留字,如where,order,group只能使用如下字符a-z、…...
Kafka基本概念
什么是Kafka Kafka是一个消息系统。它可以集中收集生产者的消息,并由消费者按需获取。在Kafka中,也将消息称为日志(log)。 一个系统,若仅有一类或者少量的消息,可直接进行发送和接收。 随着业务量日益复杂,消息的种类…...
使用QueryBuilders、NativeSearchQuery实现复杂查询
使用QueryBuilders、NativeSearchQuery实现复杂查询 本文继续前面文章《ElasticSearch系列(二)springboot中集成使用ElasticSearch的Demo》,在前文中,我们介绍了使用springdata做一些简单查询,但是要实现一些高级的组…...
taobao.open.account.update( Open Account数据更新 )
¥开放平台免费API不需用户授权 Open Account数据更新 公共参数 请求地址: HTTP地址 http://gw.api.taobao.com/router/rest 公共请求参数: 公共响应参数: 响应参数 点击获取key和secret 请求示例 TaobaoClient client new DefaultTaobaoClient(url, appkey, sec…...
PT100铂电阻温度传感器
PT100温度传感器又叫做铂热电阻。 热电阻是中低温区﹡常用的一种温度检测器。它的主要特点是测量精度高,性能稳定。其中铂热电阻的测量精确度是﹡高的,它不仅广泛应用于工业测温,而且被制成标准的基准仪。金属热…...
蓝桥杯-本质上升序列
没有白走的路,每一步都算数🎈🎈🎈 题目描述: 小蓝特别喜欢单调递增的事物 在一个字符串中如果取出若干个字符,按照在原来字符串中的顺序排列在一起,组成的新的字符串如果是单调递增的…...
synchronized锁重入验证
文章目录synchronized锁重入验证1. 可重入锁2. synchronized锁重入2.1 本类同步方法内部调用本类其它同步方法2.2 子类同步方法内部调用父类的同步方法2.3 A类的同步方法内部调用B类的同步方法3. synchronized修饰方法写法synchronized锁重入验证 1. 可重入锁 可重入锁&#…...
超简单的计数排序!!
假设给定混乱数据为:3,0,1,3,6,5,4,2,1,9。 下面我们将通过使用计数排序的思想来完成对上面数据的排序。(先不谈负数) 计数排序 该排序的思路和它的名字一样…...
发现新大陆——原来软件开发根本不需要会编码(看我10分钟应用上线)
目录 一、前言 二、官网基础功能及搭建 三、体验过程 01、连接数据源 02、设计表单 03、流程设计 04、图表呈现 05、组织架构设置 五、效率评价 六、小结 一、前言 众所周知,每家公司在发展过程中都需要构建大量的内部系统, 如运营使用的用户…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...
深度解析云存储:概念、架构与应用实践
在数据爆炸式增长的时代,传统本地存储因容量限制、管理复杂等问题,已难以满足企业和个人的需求。云存储凭借灵活扩展、便捷访问等特性,成为数据存储领域的主流解决方案。从个人照片备份到企业核心数据管理,云存储正重塑数据存储与…...
WinUI3开发_使用mica效果
简介 Mica(云母)是Windows10/11上的一种现代化效果,是Windows10/11上所使用的Fluent Design(设计语言)里的一个效果,Windows10/11上所使用的Fluent Design皆旨在于打造一个人类、通用和真正感觉与 Windows 一样的设计。 WinUI3就是Windows10/11上的一个…...
EC2安装WebRTC sdk-c环境、构建、编译
1、登录新的ec2实例,证书可以跟之前的实例用一个: ssh -v -i ~/Documents/cert/qa.pem ec2-user70.xxx.165.xxx 2、按照sdk-c demo中readme的描述开始安装环境: https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c 2…...
