操作系统存储器章节知识梳理

news2024/12/24 22:10:19

🔥🔥宏夏Coding网站,致力于为编程学习者、互联网求职者提供最需要的内容!网站内容包括求职秘籍,葵花宝典(学习笔记),资源推荐等内容。在线阅读:https://hongxiac.com🔥🔥

存储器的层次结构

对于通用的计算机,存储层次至少应具有3层:最高层为CPU寄存器,中间层为主存储器,最低层为辅助存储器(简称辅存)。

对于较高档的计算机,存储层次可细分为:寄存器,高速缓存,主存储器,磁盘缓存,固定磁盘,可移动存储介质。层级越高,存储介质的访问速度越快,存储容量越小,价格也越高。

存储器结构

#寄存器

由于内存的访问速度远低于CPU执行指令的速度,为了缓解内存访问速度与CPU执行速度不匹配这一矛盾,引入了寄存器。

寄存器是CPU内部的一种告诉存储器,用于暂时存放参与运算的指令,数据和运算结果等内容,因为与CPU的运算单元相连,所以寄存器的访问速度远快于主存储器。

#高速缓存

为了缓和内存与CPU速度之间的矛盾,引入了高速缓存。

它是介于寄存器和内存之间的存储器,主要用于备份内存中较常用的数据,以减少处理机对内存的访问次数。通常,进程的程序和数据存放在内存中,每当要访问他们时,才会被临时复制到一个速度较快的高速缓存中。

#主存储器

主存储器(Main Memory),简称主存或内存,也称为随机访问存储器(RAM),是计算机系统中的主要部件,用于保存进程运行时的程序和数据。通常由许多存储单元组成,每个存储单元都有唯一的地址。这些存储单元按字节(Byte)进行编址,每个字节都有一个唯一的地址,可以被读取或写入数据。

#磁盘缓存

为了缓和内存和磁盘速度之间的矛盾,引入了磁盘缓存。

磁盘缓存和高速缓存不同,它本身并不是一种实际存在的存储器,而是利用内存中的部分存储空间,暂时存放从磁盘中读出或写入的信息。

#进程运行的基本过程

一个用户程序要运行,需要将其装入内存中,然后将其转变成一个可执行的程序,一般需要经过三个步骤:编译->链接->装入。

编译器将源程序进行编译,形成若干模块,随后经过链接程序,将这些模块和运行所需要的库函数链接在一起,形成装入模块,最后通过装入程序将他们装入内存中。

进程运行过程

#链接

分为静态链接、装入时动态链接、运行时动态链接

  • 静态链接:编译器事先将程序所需的所有代码和库函数链接成一个装入模块,在运行时无需依赖于外部的库文件

  • 装入时动态链接:采用边装入边链接的形式,即在装入时,若该模块中发生另一个外部模块调用事件,则装入程序会找出该外部模块,也把它装入到内存中。

  • 运行时动态链接:一开始只链接和装入部分目标模块,当程序运行时发现需要其他模块时,再进行链接和装入(加快程序装入过程,节省内存空间)

分类静态链接装入时动态链接运行时动态链接
特点直接将所有代码和库函数链接形成一个装配模块,不再拆开装入时根据模块调用事件找出并装入相应外部模块对某些模块的链接推迟到程序执行时才进行
优点程序运行时,不依赖外部的库文件,可以独立地在目标系统上运行。具有独立性和可移植性。各目标模块分开存放,便于修改和更新目标模块加快程序装入过程,可节省大量内存空间
缺点可执行文件较大,占用更多存储空间。可能增加启动时间和管理工作当找不到额外的库函数时,需要额外的开销进行加载

#装入

分为绝对装入、可重定位装入、动态运行时装入

  • 绝对装入:程序被加载到内存的固定位置。程序的指令和数据的物理地址在编译和链接时就已经确定,并且在装入时不会发生重定位。
  • 可重定位装入:允许程序被加载到内存的任意位置。在装入时,需要进行符号解析和重定位,将程序中的符号引用映射到实际的内存地址。
  • 动态运行时装入:把相对地址转化为绝对地址的过程推迟到进程真正要执行的时候,而不是装入内存就变化,因此可以允许程序在运行时移动位置。

#逻辑地址和物理地址

  • 逻辑地址(相对地址):指CPU生成的地址,是相对于进程而言的虚拟地址,一般从0开始

  • 物理地址(绝对地址):程序装入内存中,在内存中的实际的物理位置,处理器能够直接访问内存单元的地址

逻辑地址是相对于进程而言的,而物理地址是相对于计算机系统的物理内存而言的。逻辑地址一般由操作系统的内存管理单元(MMU)进行翻译,将其转化为物理地址。

#地址绑定

在处理用户程序的三个步骤中(编译,链接,装入),每个步骤的地址可能有着不同的地址形式。地址绑定是指将程序中使用的逻辑地址(或虚拟地址)映射到计算机实际物理内存中的物理地址的过程。

#内存保护

内存保护指的是两个方面

  1. 保护OS内存空间不被用户访问
  2. 保护进程所具有的独立内存空间,确保进程间不会相互影响。即一个进程只能访问合法的内存地址范围,而不能访问OS内存地址或其他用户进程内存地址。

内存保护通过CPU硬件实现。可以通过两个寄存器分别记录该进程在内存中的起始物理地址和该程序在内存中所需要的大小,即基地址寄存器和界限寄存器,此时该进程的合法地址范围就是(基地址,基地址+界限地址)区间,如果该进程访问合法地址以外的范围,就会陷入OS内核,而OS内核则会将其作为致命错误来处理。

#2.内存扩充

当内存空间不足或者进程所需的空间大于系统能够提供的,系统应该如何处理?一是拒绝该进程的运行请求,二是使用内存扩充技术。

所谓内存扩充,并不是增加系统的物理内存,而是指扩大内存的使用效率。常用的内存扩充技术,包括交换,覆盖,紧凑,虚拟存储器等。

#交换(对换)

指将内存中暂时不能运行的进程或暂时不用的程序和数据,转移到外存;再把已具备运行条件的进程或需要的程序和数据从外存装入内存中。

  • 选择被换出进程:当内核执行某项操作时发现空间不足时,就换调用对换进程。在选择时,对换进程会检查所有驻留在内存中的进程,首先选择处于“阻塞”状态或者“睡眠”状态的进程,当有多个这样的进程时,优先选择优先级最低的。如果没有阻塞进程,就会选择优先级最低的就绪进程。
  • 换出进程:在换出时,首先申请对换区,申请成功后将该进程的程序和数据传送到磁盘的对换区,然后回收该进程所占用的内存空间,最后对该进程的PCB和内存分配表等数据结构进行相应的修改。需注意的是,在对进程进行换出时,只能换出非共享的程序和数据段,对于共享的程序和数据段,只要有其他进程需要它,就不能被换出。
  • 换入进程:在换入时,对换进程首先检查PCB集合中所有进程状态,找出处于“就绪”状态但已被换出的进程。当有多个这样的进程时,优先选择换出时间最久的。然后为它申请内存空间,便可直接将进程从外存换入内存。

对换示意图

#覆盖

指在程序的执行过程中,根据需要加载不同的覆盖块到内存中,程序的不同部分相互替换。

在早期的计算机系统中,有限的内存无法装入整个程序,便将程序分割成多个部分(称为覆盖块或覆盖段),常用的部分常驻内存,不常用的根据需要再调入内存。

举个例子:

某程序由符号表(20KB)、公共例程(30KB)、分枝1(70KB)、分枝2(80KB)组成。如果只有150KB的内存空间,是无法将整个程序(200KB)装入内存的。因为分枝1和分枝2不会同时执行,所以两个分枝不必同时位于内存,可以使两个分枝共享一块存储区域,根据实际需要对这块共享存储区的内容进行替换。需要注意的是,使用覆盖技术须增加覆盖驱动程序(假设10KB),共享的存储区域为了能容纳分枝1和分枝2着两段代码,容量应该选择较大的那个,即分枝2的80KB。

覆盖

#紧凑

当一台计算机运行了一段时间后,它的内存空间会被分割成许多小分区,而缺乏大的空闲空闲。即使这些小分区的容量总和大于要装入的程序,但因为这些小分区不连续、不相邻,所以程序无法被装入。

为了解决这一问题,我们可以通过移动内存中其他作业的位置,把原来分散的小分区拼接成一个大分区,这种方法就成为”紧凑“。

虽然思路简单,但会带来以下问题:

  1. 数据搬移开销:需要移动大量的用户程序和数据,可能需要调整指针和更新相关数据结构,这些数据搬移的操作会消耗大量的时间和计算资源。
  2. 系统暂停时间增加:通常需要暂停正在运行的进程或任务,以便进行数据搬移和内存重组。在这段时间内,进程无法执行任何操作,可能会导致系统响应变慢或出现停顿,对实时性要求较高的应用可能会受到影响。
  3. 额外复杂性:需要对内存分配器和数据结构进行复杂的管理和维护。为了实现高效的紧凑操作,需要设计和实现一些算法和策略,以便选择合适的时机和方式来进行紧凑。这增加了内存管理的复杂性。

(所以,紧凑技术通过移动其他作业的位置,将多个小分区拼接成一个大的分区,使得内存能够连续分配,能够消除或减少内存碎片化,提高内存空间的使用效率。)

紧凑前后

特点区别
交换将不需要的程序从内存转移到外存;将需要的程序从外存装入内存在不同进程或程序之间进行
覆盖根据需要,程序的不同部分相互替换用于同一进程或程序

#内存管理方式

为了能将用户程序装入内存,则需要为程序分配一定大小的内存空间。那么系统是如何对内存进行划分以及管理的呢?

#1.连续分配存储管理方式

连续分配方式指的是为一个用户程序分配一个连续的内存空间,即程序中的代码或数据的逻辑地址相邻,体现在内存空间中则是为用户程序分配的物理地址相邻。

分为单一连续分配、固定分区分配、动态分区分配、动态重定位分区分配。

#单一连续分配

在早期的单道程序环境下,内存被分为系统区和用户区。系统区供OS使用,而用户区供用户使用,仅装有一道用户程序,即用户区中连续的内存空间都由单个进程独占。这样的存储器分配方式就称作单一连续分配。

因此,它具有以下特点:

  1. 存储器的状态不是全部空闲,就是全部已分配
  2. 当作业被调度时,就获得全部空间

同时,具有以下缺点:

  1. 因为仅装入一道程序,程序大小和存储器的可用空间大小可能不相等,所以存储器空间未得到充分利用
  2. 因为是单道处理,一旦作业提出I/O请求,CPU就会处于空闲,所以处理机的利用率较低

#固定分区分配

早期的多道程序环境下,为了能够在内存中装入多道程序,就将内存中的用户空间划分为若干个固定大小的区域(称作分区),而每个分区中只装入一道程序。不同分区的大小可以相等,也可以不相等。

为了便于内存的分配,需要有一张表记录着每个分区的起始地址,大小,使用状况(即是否已经被分配),称作固定分区使用表。当有用户程序需要装入内存时,就需要查询固定分区使用表,找到满足条件的分区后分配给该程序,若找不到满足条件的分区则拒绝为该程序分配内存。

固定分区分配是最早出现的、可用于多道程序系统的存储管理方式。由于每个分区的大小固定,必然会造成存储空间的浪费,所以现在很少将它用于通用的OS中,更多用于控制多个相同对象的控制系统中(比如工业自动化中的生产线控制系统)

#动态分区分配

根据进程的实际需要,动态为其分配内存空间。

为了记录内存的使用情况。需要设置一张空闲分区表或空闲分区链,记录每个空闲分区的情况(分区号、大小、起始地址、分区状态...),可分别用数组或链表的数据结构实现。

空闲分区链

为了动态的把新作业存入内存,就需要按照一定的分配算法,从空闲分区表或空闲分区链中选出空闲分区并分配给进程。

下面就介绍几种分配算法,包括首次适应算法,循环首次适应算法,最佳适应算法,最坏适应算法,快速适应算法,伙伴匹配系统,哈希算法这六种算法。

#基于顺序搜索的分配算法
#首次适应算法(First Fit)

在空闲分区链中从低地址位置开始寻找空闲的分区,一找到合适的空闲分区就进行划分和分配。

具体的工作原理:

1.系统维护一个空闲内存块链表,按照地址递增的顺序排列。

2.当一个进程请求内存时,首次适应算法从链表的头部开始扫描,寻找第一个能够满足请求大小的空闲内存块。

3.如果找到了足够大的空闲块,将其分割成两部分:一部分用于分配给进程,另一部分则成为新的空闲块。

4.如果没有足够大的空闲块,则继续扫描链表,直到找到满足条件的空闲块或者扫描完整个链表。

5.如果链表中没有合适的空闲块,则内存分配失败,进程需要等待或者采取其他策略。

由于优先利用低地址空间,所以能保留高地址的大空闲分区,为以后大作业的分配保留空间。

但是每次都需要从低地址部分开始查找,增加查找的开销。

#循环首次适应算法(Next Fit)

也称作临近适应算法。在首次适应算法的基础上加以改进,改进点为从上一次查找结束的位置继续往下搜索,若到最后一个位置仍无法找到,则循环到链首。

#最佳适应算法(Best Fit)

优先使用最小的空闲分区。

由于优先使用最小的空闲分区,所以每次分配后切割下来的剩余部分总是最小的,在存储器中就会留下许多难以利用的碎片。但是能够尽可能留下大的空闲分区,为大进程保留较大的空间。

#最坏适应算法(Worst Fit)

优先使用最大的空闲分区。

由于优先使用最大的空闲分区,所以每次分割下来的空闲分区不至于太小,产生碎片的概率最小。但是会使较大的连续空闲分区被用完,不利于之后大进程的分配。

算法思想分区排序优点缺点
首次适应从低地址查找合适空间地址递增优先利用低地址空间每次都需要从低地址开始,增加查找开销
循环首次适应从上次查找处向后查找地址递增不用从头开始查找,减小查找开销会使高地址大空闲分区也被用完
最佳适应优先使用最小空闲空间容量递增保留大的空闲分区,以满足大进程需求容易产生难以利用的小碎片
最坏适应优先使用最大空闲空间容量递减不容易产生小碎片,查找效率高大的空闲分区容易被用完,不利于大进程的分配
#基于索引搜索的分配算法
#快速适应算法

快速适应算法的基本思想是为不同大小的内存请求维护多个预定义的空闲链表或分区。这些链表或分区根据其大小将可用内存块划分为不同的类别。每个类别的链表中存放着相应大小的可用内存块。

当有一个内存请求时,快速适应算法会先检查与请求大小最接近的类别的链表。如果链表中有足够大的内存块,则将请求分配给该块。如果找不到足够大的内存块,算法会继续检查更大或更小的类别链表,直到找到适合的内存块或遍历完所有链表。

#伙伴匹配系统

规定分区的大小都为2^k,对于具有相同大小的所有空闲分区,为其单独设立一个空闲分区双向链表。

当需要分配一个大小为n的空间时,首先计算一个值使得2^(i-1)<= n <= 2^i,然后在大小为2^i的空闲分区链表中进行查找,若大小为2^i的空闲分区已耗尽,则查找大小为2^(i+1)的空闲分区链,若存在则将这块空闲分区分割为两个相等大小的分区,这两个大小相等的分区就称为”一对伙伴“,其中一块分配给进程,另一块作为空闲分区添加到大小为2^i的空闲分区链中。

#哈希算法

利用哈希快速查找的优点,以及空闲分区在可利用空闲分区链表中的分布规律,建立哈希函数,构造一张以空闲分区大小为关键字的哈希表。该表的每个表项均记录了一个对应的空闲分区链表表头指针。

当进行空闲分区分配时,根据所需空闲分区的大小,通过哈希函数计算得到哈希表中的位置,从而得到相应的空闲分区链表,最终实现分配。

#2.分页存储管理方式

在介绍分页存储管理方式之前,我们先来承上启下,为什么会有分页存储管理方式?

在前面介绍到的连续分配方式中,由于多个进程不断被加载到内存和从内存中卸载,会导致内存空间出现分散的未被使用的小块空间,这些小块空间就称为外部碎片。正是由于分配和释放内存空间的不连续性(一个进程的空间是连续的,但多个进程间可能不连续),使得内存中的可用空间不连续,无法满足大块连续内存的分配需求。

虽然可以通过“紧凑”等方式将许多碎片拼接成可用的大块空间,但是由于需要移动大量用户程序和数据,会带来时间和计算资源的开销,所以未必是好的选择。

如果允许将一个进程直接分散地装入许多不相邻的分区中,就可以充分利用内存空间而无需进行”紧凑“。因此就产生了离散分配存储管理方式,包括分页存储管理方式,分段存储管理方式,段页式存储管理方式。

#页面和物理块

分页存储管理方式将进程的地址空间分为若干个页,并为每个页加以编号,从0开始,如第0页,第1页。对应地,也将内存空间分为若干个块,也对每个块加以编号,从0开始。

在为进程分配内存时,以块为单位,将进程中的若干页分别装入多个可以不相邻的物理块中。由于进程的最后一页经常装不满一块,就形成了不可利用的碎片,称之为**”页内碎片“或”内碎片“**。

将进程分成了多个页,那么页面大小多少才合适呢?

如果页面过小,虽然可以减少内部碎片,有利于提高内存利用率,但是会使得每个进程占有较多的页面,导致进程的页表过长,占用大量内存,同时也会降低页面换入/换出的效率。

如果页面过大,虽然可以减少页表长度,提高页面换入/换出的效率,但又会使内部碎片增大。

因此,在内部碎片、页表长度、换入换出的综合影响下,页面的大小一般为1KB、2KB、4KB、8KB。

更多完整内容可以前往宏夏Coding查看

https://hongxiac.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1018452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于阻抗不连续的原因

1、连线中的分支结构 信号传输到分支结构处&#xff0c;表现出的是两条电路并联的效果&#xff0c;会导致阻抗的不连续问题。典型的就是菊花链结构。 2、参考平面的宽度 一般情况下参考平面都是很宽且连续的&#xff0c;但有的时候&#xff0c;参考平面会被反焊盘给掏空…

FPGA/数字IC(芯海科技2022)面试题 2(解析版)

以下仅为学习参考(非原创)&#xff0c;如有疑惑欢迎评论区指出&#xff01; 一、单选题&#xff08;共20题&#xff0c;每题3分&#xff0c;共60分&#xff09; 1. D触发器&#xff1a;Tsetup3ns&#xff0c;Thold1ns&#xff0c;Tck2q1ns&#xff0c; 该D触发器最大可运行时…

笔记1.5:计算机网络体系结构

从功能上描述计算机网络结构 分层结构 每层遵循某个网络协议完成本层功能 基本概念 实体&#xff1a;表示任何可发送或接收信息的硬件或软件进程。 协议是控制两个对等实体进行通信的规则的集合&#xff0c;协议是水平的。 任一层实体需要使用下层服务&#xff0c;遵循本层…

Linux 下的 10 个 PDF 软件

本文[1]是我们正在进行的有关 Linux 顶级工具系列的延续&#xff0c;在本系列中&#xff0c;我们将向您介绍最著名的 Linux 系统开源工具。 随着互联网上越来越多地使用可移植文档格式 (PDF) 文件来获取在线书籍和其他相关文档&#xff0c;拥有 PDF 查看器/阅读器对于桌面 Linu…

Wireshark分析HTTPS流量

1、设置环境变量 &#xff08;在不抓包的时候要把这个环境变量删掉,日志太多可能&#xff09; # 变量名称 SSLKEYLOGFILE # 变量值&#xff1a;日志文件存储的路径 D:\data\ssl\keylog.log2、 配置配置Wireshark软件文件路径 配置上之后一定要重启&#xff0c;不重启没效果。

Math_2023_09_17.java

package homework;import util.StringUtil;/*** 八位数: 2 _ _ _ _ _ _ 5* 每相邻三个数字和为11** author ZengWenFeng* email 117791303qq.com* mobile 13805029595* date 2023.09.17*/ public class Math_2023_09_17 { public static boolean isOk(String str, int sum){in…

Apache Hive概述,模拟实现Hive功能,Hive基础架构

1、Apache Hive 概述 1.1、分布式SQL计算 对数据进行统计分析&#xff0c;SQL是目前最为方便的编程工具。 大数据体系中充斥着非常多的统计分析场景 所以&#xff0c;使用SQL去处理数据&#xff0c;在大数据中也是有极大的需求的。 MapReduce支持程序开发&#xff08;Java…

88 # express 应用和路由的分离

上一节实现了应用和创建应用的分离&#xff0c;这一节来实现应用和路由的分离 application.js const http require("http"); const Router require("./router");function Application() {this._router new Router(); }Application.prototype.get fun…

Learn Prompt-ChatGPT 精选案例:内容总结

ChatGPT 可以通过分析内容并生成一个浓缩版本来总结文本。这对节省时间和精力很有帮助&#xff0c;特别是在阅读长篇文章、研究论文或报告时。 通用总结​ 你所要做的就是把具体的文字复制并粘贴到提示中&#xff0c;并要求ChatGPT对所选文本进行简化总结。这里我们参考opena…

[尚硅谷React笔记]——第1章 React简介

目录&#xff1a; 第1章 React简介 React的基本使用:虚拟DOM的两种创建方式&#xff1a; 使用jsx创建虚拟DOM使用js创建虚拟DOM(一般不用)虚拟DOM与真实DOM:React JSX:JSX练习&#xff1a;模块与组件、模块化与组件化的理解 模块组件模块化组件化 第1章 React简介 中文官网: …

【微信小程序】关于页面中引入背景的两种方式

| 布局设计思路 <view class"about"> <view class"pubilcTitle"><view class"en"></view><view class"cn"></view><view class"line"></view> </view> <view cl…

linux基础(2)

目录 一.vi\vim编译器介绍1.三种模式2.vim的使用3.快捷键的使用 二.which&#xff0c;find命令三.grep命令四.wc命令五.管道符六.echo命令1.重定向符 七.tail命令 一.vi\vim编译器介绍 vim\vi是linux中最经典的文本编译器 同图形化界面中的文本编译器是一样的&#xff0c;vi是…

记录:移动设备软件开发(搭建Android开发环建)

目录 前言安装Android Studio 前言 Android是一种基于Linux的开放源代码操作系统&#xff0c;主要用于移动设备&#xff0c;如智能手机和平板电脑。Android提供了一个丰富的应用程序框架&#xff0c;允许开发者使用Java语言创建创新的应用程序。为了开发Android应用程序&#…

前 K 个高频元素

题目链接 前 K 个高频元素 题目描述 注意点 k 的取值范围是 [1, 数组中不相同的元素的个数]题目数据保证答案唯一&#xff0c;换句话说&#xff0c;数组中前 k 个高频元素的集合是唯一的返回其中出现频率前 k 高的元素可以按 任意顺序 返回答案 解答思路 使用哈希表存储所…

Go-Python-Java-C-LeetCode高分解法-第六周合集

前言 本题解Go语言部分基于 LeetCode-Go 其他部分基于本人实践学习 个人题解GitHub连接&#xff1a;LeetCode-Go-Python-Java-C Go-Python-Java-C-LeetCode高分解法-第一周合集 Go-Python-Java-C-LeetCode高分解法-第二周合集 Go-Python-Java-C-LeetCode高分解法-第三周合集…

Learn Prompt-为什么用 ChatGPT API?

引用人工智能先驱吴恩达先生说过的话&#xff1a;“一个系统需要的远不止一个提示&#xff08;prompt&#xff09;或者一个对LLM&#xff08;大性语言模型&#xff09;的调用。” API的优点&#xff1a; 集成更深: 通过 API&#xff0c;您可以将 ChatGPT 集成到自己的系统和工…

腾讯云阿里云云服务器 Linux 操作系统 BT 宝塔面板快速建站教程

宝塔面板概述 宝塔面板是一款服务器管理软件&#xff0c;支持Windows和Linux系统&#xff0c;可以通过Web端轻松管理服务器&#xff0c;提升运维效率。总体来说&#xff0c;宝塔面板具有操作简单、功能丰富、安全可靠等特点&#xff0c;是一款非常实用的服务器管理软件。 宝塔…

ElasticSearch(ES)简单介绍

ES简介 Elasticsearch&#xff08;通常简称为ES&#xff09;是一个开源的分布式搜索和分析引擎&#xff0c;旨在处理各种类型的数据&#xff0c;包括结构化、半结构化和非结构化数据。它最初是为全文搜索而设计的&#xff0c;但随着时间的推移&#xff0c;它已经演变成一个功能…

QT:使用行编辑器、文本编辑器、单选按钮、水平布局、垂直布局做一个小项目

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLineEdit> //行编辑器 #include <QTextEdit> //文本编辑器 #include <QRadioButton> //单选按钮class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *pare…

【Vue-01】MVVM数据双向绑定与Vue的生命周期

目录 一、Vue介绍 1.1 什么是Vue &#xff1f; 1.2 Vue的优点 1.3 库与框架的区别 二、Vue入门 2.1 MVVM&#xff08;数据双向绑定&#xff09; 2.2 BootCDN&#xff08;加速服务&#xff09; 三、Vue实例 3.1 Vue开发示例 3.2 双向数据绑定 3.3 Vue生命周期钩子 一…