计算机组成原理笔记-第4章 存储器

第4章 存储器

笔记PDF版本已上传至Github个人仓库:CourseNotes,欢迎fork和star,拥抱开源,一起完善。

该笔记是最初是没打算发网上的,所以很多地方都为了自我阅读方便,我理解了的地方就少有解释;我不理解的地方理解后加上的解释便很多。

因此,若读者在阅读过程中遇到错误或理解问题,请评论区留言或者私信,我们一起讨论:看到会及时回复。

4.1 概述

4.1.1 存储器分类

在这里插入图片描述

4.1.2 存储器的层次结构
  • 存储器速度、容量和 位价的关系图

  • 缓存-主存层次和主存-辅存层次图

    在这里插入图片描述

    • 主存和缓存之间匹配的是速度,它们之间的数据调动是由硬件自动完成的
    • 主存和辅存之间匹配的是容量,它们之间的数据调动是 由硬件和操作系统共同完成的。

4.2 主存储器

4.2.1 概述
  • 现代计算机的主存都由半导体集成电路构成,,MARMDR制作在CPU芯片内,如下图所示。下图中虽然MAR和MDR是在CPU内部,但是这并不代表内存的MAR和MDR在CPU中。下图的MDR和MAR为CPU的器件,主存有但未画出来。

  • 寻址范围计算

    • 按字节寻址范围计算为【 2 地址线位数 2^\text{地址线位数} 2地址线位数】Byte
    • 按字寻址范围计算为【 2 地址线范围 × 8 字长 \frac{2^\text{地址线范围}\times8}{字长} 字长2地址线范围×8】bit
  • 主存的技术指标

    • 存储容量:指主存能存放二进制代码的总位数

      ①存储容量=存储单元个数x存储字长 (以位数表示)
      ②存储容量=存储单元个数x存储字长/8 (以字节表示)

    • 存储速度

      存储速度是由存取时间和存取周期来表示

      • 存取时间

        存取时间又称为存储器的访问时间(Memory Access Time),是指启动一次存储器操作(读或写)到完成该操作所需的全部时间。

        存取时间分读出时间和写人时间两种。读出时间是从存储器接收到有效地址开始,到产生有效输出所需的全部时间。写人时间是从存储器接收到有效地址开始,到数据写人被选中单元为止所需的全部时间。

      • 存取周期

        存取周期(Memory Cycle Time)是指存储器进行连续两次独立的存储器操作(如连续两次读操作)所需的最小间隔时间

    • 存储器带宽
      表示单位时间内存储器存取的信息量,如下例:

      存取周期为500ns,每个存取周期可访问16位,则它的带宽为32M位/秒,计算如下
      32 Mbit/s = 16 b i t 500 × 1 0 − 9 s 32\text{Mbit/s}=\frac{16bit}{500\times10^{-9}s} 32Mbit/s=500×109s16bit

      为了提高存储器的带宽,可以采用以下措施:

      ① 缩短存取周期。
      ②)增加存储字长,使每个存取周期可读/写更多的二进制位数。
      ③增加存储体

4.2.2 半导体存储芯片简介
  • 半导体存储芯片的译码驱动方式有两种:线选法和重合法

    在这里插入图片描述

  • 控制线

    • 片选线:用来选择存储芯片

      • CS ‾ \overline{\text{CS}} CS:片选线,低电平有效

      • CE ‾ \overline{\text{CE}} CE:使能线,低电平有效

    • 读/写控制线:决定芯片进行读/写操作

      • WE ‾ \overline{\text{WE}} WE:低电平写 高电平读
4.2.3 随机存储器
  • 静态 RAM(Static RAM, SRAM)

    由千静态 RAM是用触发器工作原理存储信息的,因此即使信息读出后,它仍保持其原状 态,不需要再生。但电源掉电时,原存信息丢失,故它属易失性半导体存储器。

    • 静态 RAM 基本单元电路

    在这里插入图片描述

    读出时, V C C V_{CC} VCC家电, T 3 T_3 T3 T 4 T_4 T4开关都闭合电路连通;接着A‘和A同时加电, T 1 T_1 T1 T 2 T_2 T2闭合,数据从存储芯片内流向A与A’(两侧数据是一致的); T 5 T_5 T5 T 6 T_6 T6从行地址选择线上获取行地址, T 7 T_7 T7 T 8 T_8 T8从列地址选择线上获取列地址,此时两侧数据流通;左侧数据流通至左侧写放大器后反向,无法通过;右侧数据不经过放大器直接送到 D OUT \text{D}_\text{OUT} DOUT中。

    写入时,数据经过左侧放大器将取反,右侧正常通过;我们选择好行地址与列地址,打开两侧通路。当数据到达A‘与A的时候有两种情况:

    • D IN \text{D}_\text{IN} DIN为1,则A’为0,A为1,此时 T 2 T_2 T2断开, T 1 T_1 T1连接,正常写入1;
    • D IN \text{D}_\text{IN} DIN为0,则A‘为1,A为0,此时 T 1 T_1 T1断开, T 2 T_2 T2连接,正常写入0.
    • 静态 RMA 芯片举例(Intel 2114)

      在这里插入图片描述

      C S ‾ \overline{\mathrm {CS}} CS W E ‾ \overline{\mathrm {WE}} WE 均为低电平时,输入()三 态门打开, I / O 4 ∼ I / O 1 \mathrm{I/O}_{4}\sim\mathrm{I/O}_{1} I/O4I/O1上的数据即写入指定地址单元中。 C S ‾ \overline{\mathrm {CS}} CS为低电平、 W E ‾ \overline{\mathrm {WE}} WE 为高电平时, 输出()三态门打开,列 I/0 电路的输出经片内总线输出至数据线 I / O 4 ∼ I / O 1 \mathrm{I/O}_{4}\sim\mathrm{I/O}_{1} I/O4I/O1 上。

      在这里插入图片描述

      • 存储矩阵结构

      在这里插入图片描述

      • 读周期时序

      在这里插入图片描述

      • 写周期时序

      在这里插入图片描述

      地址有效后,先发出写命令开始片选,片选完成了后,等待上一个读周期的数据滞后完成我们便开始写。由于写始终要知道内存单元的地址,所以地址失效一定在 D I N \mathrm {D_{IN}} DIN之后

  • 动态 RAM(Dynamic RAM, DRAM)

    常见的动态RAM基本单元电路有三管式单管式两种,它们的共同特点都是靠电容存储 电荷的原理来寄存信息,若电容上存有足够多的电荷表示存”1",电容上无电荷表示存“0”。

    电 容上的电荷一般只能维持 1~ 2 ms,因此即使电源不掉电,信息也会自动消失;为此,必须在 2 ms内对其所有存储单元恢复一次原状态,这个过程称为再生刷新

    由千它与静态 RAM 相 比,具有集成度更高功耗更低等特点,目前被各类计算机广泛应用。

    在这里插入图片描述

    1. 读操作:当读选择线被选中时,晶体管T2导通,若存储在 C g \text{C}_\text{g} Cg上的电荷足够则T1导通,那么T1和T2接地,使读数据线降为低电平,读出0;若 C g \text{C}_\text{g} Cg的电荷不足以导通T1,则读数据线保持高电平不变。

      因此我可以发现读出的信息与原存入的信息是反相的,若要恢复真正的数据,需要将读出的数据进行取反。

    2. 写操作:在写操作期间,写选择线被选中,晶体管T3导通,允许电流通过写数据线流向电容Cg。写入数据是正相的。

    • 三管 MOS 动态 RAM 结构示意图

    在这里插入图片描述

    • 单管 MOS 动态 RAM 基本单元电路

    在这里插入图片描述

  • 动态 RAM 的刷新

    刷新的过程实质上是先将原存信息读出,再由刷新放大器形成原信息并重新写入的再生过程。由于存储单元被访问是随机的,有可能某些存储单元长期得不到访问,不进行存储器的 读/写操作,其存储单元内的原信息将会慢慢消失。

    为此,必须采用定时刷新的方法,它规定在一 定的时间内,对动态 RAM 的全部基本单元电路必作一次刷新,一般取2 ms,这个时间称为刷新周期,又称再生周期。

    刷新是一行行进行的,必须在刷新周期内,由专用的刷新电路来完成对基 本单元电路的逐行刷新,才能保证动态 RAM 内的信息不丢失。通常有三种方式刷新:集中刷新分散刷新异步刷新

    • 集中刷新:集中刷新是在规定的一个刷新周期内,对全部存储单元集中一段时间逐行进行刷新,此刻必 须停止读/写操作。

      例如,对 128x128 矩阵的存储芯片进行刷新时,若存取周期为 0.5 µs,刷新周 期为2 ms(占 4 000 个存取周期),则对 128 行集中刷新共需 64 µs(占 128 个存取周期),其余的 1 936 µ,s (共 3 872 个存取周期)用来读/写或维持信息,如下图所示。由于在这 64 µs 时间内不能进行读/写操作,故称为“死时间”,又称访存“死区”,所占比率为 128/4000x 100% = 3.2%, 称为死时间率

      🈲刷新一行占一个存储周期

    • 分散刷新:分散刷新是指对每行存储单元的刷新分散到每个存取周期内完成。

      该模式中,所有的行刷新被分配到了各存取周期,即完成一次读/写就做一行的刷新;存取周期由0.5µs扩充到了1µs,这是因为前0.5µs用来进行读/写;后0.5µs用来刷新;这样做的好处是不存在读写停止读写的死区时间了,坏处是存储周期变长了,降低系统效率。

    在这里插入图片描述

    • 异步刷新

      结合分散刷新与集中刷新,每隔若干秒刷新一行。此般,经过一个刷新周期后所有行都得到了刷,即克服了集中刷新的长时死区效应又解决了

    在这里插入图片描述

  • 动态 RAM 和静态 RAM 的比较

在这里插入图片描述

4.2.4 只读存储器(ROM)

半导体ROM基本器件为两种:MOS 型和 TTL 型。

4.2.5 存储器容量的扩展
4.2.6 存储器与CPU的连接
  • 存储器与 CPU 的连接步骤:
  • 存储器于CPU连接实例1
    • 问题描述

      例 4.1 设 CPU 有 16 根地址线、8 根数据 线,并用 M R E Q ‾ \overline{\mathrm{MREQ}} MREQ 作为访存控制信号(低电平有 效),用 W R ‾ \overline{\mathrm{WR}} WR作为读/写控制信号(高电平为读,低 电平为写)。现有下列存储芯片:1 Kx4 位 RAM、 4 Kx8 位 RAM、8 Kx8 位 RAM、2 Kx8 位 ROM、 4 Kx8 位 ROM、8 Kx 8 位 ROM 及 74138 译码器 和各种门电路,如图 4.36 所示。画出 CPU 与存 储器的连接图,要求如下:

      • 主存地址空间分配: 6000H ~ 67FFH 为系统程序区。;6800H ~ 6BFFH 为用户程序区。
      • 合理选用上述存储芯片,说明各选几片。
      • 详细画出存储芯片的片选逻辑图。

      在这里插入图片描述

    • 问题解答
      • 写出对应的二进制地址码

        在这里插入图片描述

      • 确定芯片的数量及类型

        根据6000H~ 67FFH 为系统程序区的范围,应选择 1 片 2 Kx8 位的 ROM

        根据6800H~ 6BFFH 为用户程序区的范围,选 2 片 1 Kx4 位的 RAM 芯片正好满足 1 Kx8 位 的用户程序区要求。

      • 分配地址线

        将 CPU 的低 11 位地址 A 10 ∼ A 0 \mathrm {A_{10}}\sim \mathrm{A_0} A10A0。与 2 Kx 8 位的 ROM 地址线相连;将 CPU 的低 10 位地址 A 9 ∼ A 0 \mathrm {A_{9}}\sim \mathrm{A_0} A9A0。与 2 片 1 Kx4 位的 RAM 地址线相连。

      • 确定片选信号和片选逻辑以及接线

        由74138 译码器输入逻辑关系可知,必须保证控制端 G 1 \mathrm G_1 G1为高电平, G ‾ 2 A \mathrm{\overline{G}_{2A}} G2A G ‾ 2 B \mathrm{\overline{G}_{2B}} G2B为低电平,才能使译码器正常工作。

        根据第一步写出的存储器地址范围得出, A 15 \mathrm {A_{15}} A15始终为低电平,, A 14 \mathrm {A_{14}} A14始终为高电平,它们正好可分别与译码器的 G ‾ 2 A \mathrm{\overline{G}_{2A}} G2A(低)和 G 1 \mathrm G_1 G1(高)对应。

        而访存控制信号 M R E Q ‾ \overline{\mathrm{MREQ}} MREQ (低电平有效)又正好可与 G ‾ 2 B \mathrm{\overline{G}_{2B}} G2B(低)对应。剩下的 A 13  、 A 12  、 A 11 \mathrm{A}_{13}\mathrm{~、A}_{12}\mathrm{~、A}_{11} A13 A12 A11可分别接到译码器的 C、B、A 输入 端。

        其输出 Y 4 ‾ {\overline{\mathrm{Y_4}}} Y4 有效时,选中 1 片 ROM; Y 5 ‾ {\overline{\mathrm{Y_5}}} Y5 A 10 {\mathrm{A_{10}}} A10 同时有效均为低电平时,与门输出选中 2 片 RAM,如图 4.37 所示。

        图中 ROM 芯片的 P D / P r o g {\mathrm{PD/Prog}} PD/Prog 端接地,以确保在读出时低电平有效。RAM 芯片的读写控制端与 CPU 的读写命令端 W R ‾ {\overline{\mathrm{WR}}} WR 相连。

        ROM 的 8 根数据线直接与 CPU 的 8 根数据线相连,2 片 RAM 的数据线分别与 CPU 数据总线的高 4 位和低 4 位相连。

      • 画图

        在这里插入图片描述

4.2.7 存储器的校验(汉明码)
  • 简介

汉明码是由 Richard Hanming 于 1950 年提出的,它具有一位纠错能力。

新增的汉明码校验位数应满足如下关系: 2 k ⩾ n + k + 1 2^{k}\geqslant n+k+1 2kn+k+1,其中k为校验位位数,n位数据位数。

同时,我要强调的是汉明校验码的生成和校验都都两种原则,希望读者要对概念进行清晰地把握,不可一知半解:
汉明校验 { 按配偶原则的校验 按配奇原则的校验 \text{汉明校验}\begin{cases} \text{按配偶原则的校验}\\ \text{按配奇原则的校验} \end{cases} 汉明校验{按配偶原则的校验按配奇原则的校验
这里直接阐述配偶和配奇的原则会比较抽象,我们放到具体的例子中来看,会更加易懂。

  • 汉明码生成
  1. 确定校验位的个数

    使用公式【 2 k ⩾ n + k + 1 2^{k}\geqslant n+k+1 2kn+k+1】计算需要的k,其中 k 是检验位的数量,n 是数据位的数量;

    举个逆子:原欲发送数据为:0101,此时我们可得n=4,则欲使 2 k ≥ 4 + k + 1 2^k\geq4+k+1 2k4+k+1,k最小为3,即校验位个数为3。

  2. 安置校验位

    我们规定:所有的校验位均放置在第 2 n 2^n 2n位,也就是第1、2、4、8…位置等都是校验位,n从0开始,到k-1结束。

    上例中k=3,则校验位的位置为:① 2 0 = 1 2^0=1 20=1;② 2 1 = 2 2^1=2 21=2;③ 2 2 2^2 22=4;即3位校验位放在最后要发送数据的第1,第2,第4个位置。

  3. 填充数据位:

    在非校验位的其他位置上填写真正的数据,填充后汉明码应如如下形式才对:

    c 1 c_1 c1 c 2 c_2 c20 c 3 c_3 c3101

    其中 c 1 c_1 c1 c 2 c_2 c2 c 3 c_3 c3为待确定值的校验位。

  4. 画表计算校验位的值

    我们的原则是,位置代表的二进制写好后,每一行值为1的二进制位分为一组;然后,你会发现,每一行校验位的位置是互斥的,只有一个校验位值为1。也就是说,一个校验位会和若干数值位搭配,组成一组。

    然后我们可以引出配奇和配偶原则了:

    • 配奇原则:通过配置校验位 C j C_j Cj,使得该组1的个数为奇数个,那么该组的各位进行异或操作必为1
    • 配奇原则:通过配置校验位 C j C_j Cj,使得该组1的个数为偶数个,那么该组的各位进行异或操作必为0

    基于这样的发现,我们让同一组各数据位进行异或(两个二进制位异或,相同结果为0,不同为1)运算,按照配偶原则,可得结果如下计算所示:
    配偶原则 { C 1 ⊕ 0 ⊕ 1 ⊕ 1 ⟹ C 1 = 0 C 2 ⊕ 0 ⊕ 0 ⊕ 1 ⟹ C 2 = 1 C 3 ⊕ 1 ⊕ 0 ⊕ 1 ⟹ C 3 = 0 \text{配偶原则}\begin{cases}C_1\oplus0\oplus1\oplus1\Longrightarrow C_1=0\\ C_2\oplus0\oplus0\oplus1\Longrightarrow C_2=1\\ C_3\oplus1\oplus0\oplus1\Longrightarrow C_3=0 \end{cases} 配偶原则 C1011C1=0C2001C2=1C3101C3=0
    我们怎么理解上面的 C 1 C 2 C 3 C_1 C_2C_3 C1C2C3的取值?

    C 1 C_1 C1=0】,是因为和它一组的数据位为011中有偶数个1,按照配偶原则,已经有偶数个1了,那我就不用管了;反之看第二组,【 C 2 C_2 C2=1】,这是因为第二组的数据位为001,只有奇数个1,按照配偶原则, C 2 C_2 C2要置1才能保证第二组的1为偶数个。第三组同理。

    刚好在这里把配奇的原则也讲一下,上面的 C 1 C 2 C 3 C_1 C_2C_3 C1C2C3如果按照配奇原则会是多少呢?如下(如果你理解了配偶原则,配奇也很简单):
    配奇原则 { C 1 = 0 ⊕ 1 ⊕ 1 ‾ ⟹ C 1 = 1 C 2 = 0 ⊕ 0 ⊕ 1 ‾ ⟹ C 2 = 0 C 3 = 1 ⊕ 0 ⊕ 1 ‾ ⟹ C 3 = 1 \text{配奇原则}\begin{cases}C_1=\overline{0\oplus1\oplus1}\Longrightarrow C_1=1\\ C_2=\overline{0\oplus0\oplus1}\Longrightarrow C_2=0\\ C_3=\overline{1\oplus0\oplus1}\Longrightarrow C_3=1 \end{cases} 配奇原则 C1=011C1=1C2=001C2=0C3=101C3=1
    可见,配奇的结果和配偶的结果刚好相反,这是因为异或操作的原理使得如果同一组中的数据位有偶数个1那么异或必为0,那么取反得校验位为1,那么组合起来(数据位有偶数个1,校验位有1个1,相加肯定是奇数咯)1的个数就是奇数个咯,完成奇配置。

  5. 书写完整的汉明码(配偶原则)

    如第四步所计算,得到三个校验位的值后,将其值填充到校验位所对应的位置,将校验位的值填充进行,写出完整的汉明码,上例的汉明码为

    1234567
    C 1 C_1 C1 C 2 C_2 C2 P 1 P_1 P1 C 3 C_3 C3 P 2 P_2 P2 P 3 P_3 P3 P 4 P_4 P4
    0100101
  6. 书写完整的汉明码(配奇原则)
    1234567
    C 1 C_1 C1 C 2 C_2 C2 P 1 P_1 P1 C 3 C_3 C3 P 2 P_2 P2 P 3 P_3 P3 P 4 P_4 P4
    1001101
  • 汉明码校4验

按照配偶原则,假设我们收到了0110101,已知这是一个传输出错的汉明码

按照配偶原则,假设我们收到了1001100,已知这是一个传输出错的汉明码

  1. 提取小组(配偶原则)

    0110101总位数为7,则易推得校验位为3位;再根据分组规则,我们可得到三组数据如下:

    • 组1(1357)=0111
    • 组2(2367)=1101
    • 组3(4567)=0101
  2. 提取小组(配奇原则)

    1001100总位数为7,则易推得校验位为3位;再根据分组规则,我们可得到三组数据如下:

    • 组1(1357)=1010
    • 组2(2367)=0000
    • 组3(4567)=1100
  3. 校验(配偶原则)

    我们按照配偶原则,将原来的分组的各组各位异或运算,若为0则表示该位没出错,否则表示出错。

    上述汉明码,我们进行如下计算:
    g 1 = 0 ⊕ 1 ⊕ 1 ⊕ 1 = 1 g 2 = 1 ⊕ 1 ⊕ 0 ⊕ 1 = 1 g 3 = 0 ⊕ 1 ⊕ 0 ⊕ 1 = 0 g1=0\oplus1\oplus1\oplus1=1\\ g2=1\oplus1\oplus0\oplus1=1\\ g3=0\oplus1\oplus0\oplus1=0 g1=0111=1g2=1101=1g3=0101=0
    欸,汉明码只能纠错1位,那到底是哪一位出错了呢?其实呀,这里并不能只管看出来,但是汉明码的神奇之处就在于,校验后的k位数值的二进制逆序组合转化为十进制表示的数值就是出错的位置。

    如上例,计算完得到 g 1 g 2 g 3 g_1g_2g_3 g1g2g3=110,我们逆序得到011,其十进制表示3,那么就是第三位出错了,瞅瞅是不是😁发的是0100101接收到的是0110101,确实是第3位出错了。

  4. 校验(配奇原则)

    我们按照配奇原则,将原来的分组的各组各位异或后取反运算,若为0则表示该位没出错,否则表示出错。

    上述汉明码,我们进行如下计算:
    g 1 = 1 ⊕ 0 ⊕ 1 ⊕ 0 ‾ = 1 g 2 = 0 ⊕ 0 ⊕ 0 ⊕ 0 ‾ = 1 g 3 = 1 ⊕ 1 ⊕ 0 ⊕ 0 ‾ = 1 g1=\overline{1\oplus0\oplus1\oplus0}=1\\ g2=\overline{0\oplus0\oplus0\oplus0}=1\\ g3=\overline{1\oplus1\oplus0\oplus0}=1 g1=1010=1g2=0000=1g3=1100=1
    此时得到 g 1 g 2 g 3 g_1g_2g_3 g1g2g3=111,逆序得到111111十进制表示7,那么第七位出错了;检查一下呗,发的是1001101接收到的是1001100,确实是第7位出错了。

4.2.8 提高访存速度的措施(多位交叉)

4.3 高速缓冲存储器

4.3.1 概述
4.3.2 Cache-主存地址映射

4.4 循环冗余校验码

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ES6 入门—ES6 解构赋值

let [c 3, d c] [1]; // c 1, d 1 let [e 3, f e] [1, 2]; // e 1, f 2 示例代码:步骤一:新建一个名为 test5.js 的文件,在其中输入以下代码:console.log(“示例一:”); console.log(“a 与 b 匹配结果为…

HTML5+CSS3小实例:可爱的卷纸开关

实例:可爱的卷纸开关 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=…

复习2-20240624

vscode 使用 Javabean &#xff08;封装性&#xff09; public class Demo01 {/*1.原则 &#xff1a; 字母 数字 $ _ 中文 除了 这五个 其它都不可以2. 细则 &#xff1a; 数字 不能 开头%hbviunh &hfiureh )nhjrn 7487j -ni hbiu tgf hi…

Verifieable FHE(VFHE):使用Plonky2来证明Zama TFHE的“Bootstrapping的正确执行”

1. 引言 Zama团队2024年论文Towards Verifiable FHE in Practice: Proving Correct Execution of TFHE’s Bootstrapping using plonky2 中&#xff1a; 首次阐述了&#xff0c;在实践中&#xff0c;将整个FHE bootstrapping操作&#xff0c;使用SNARK来证明。在其相应的http…

Appium+python自动化(二十一)- 让猴子按你指令大闹手机,让我们都成为耍猴高手(超详解)

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 简介  一年一度的暑假如期而至&#xff0c;每年必不可少的&#xff0c;便是《西游记》这部经典电视连续剧的播出&#xff0c;作为一名90后&#xff0c;对于这部经典剧的情谊&#xff…

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙&#xff08;Bluetooth&#xff09;是一种短距离无线通信技术&#xff0c;广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来&#xff0c;蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议&#xff0c;并通过一个具体的项目——使用…

自然语言处理:第三十九章 中文测评榜单-CEval

文章链接:2305.08322 (arxiv.org) 官网: C-Eval: 一个适用于大语言模型的多层次多学科中文评估套件 (cevalbenchmark.com) 主页: hkust-nlp/ceval: Official github repo for C-Eval, a Chinese evaluation suite for foundation models [NeurIPS 2023] 在人工智能领域&#…

Vue 项目居然有4种包管理器,你了解吗?

在vue项目中&#xff0c;用于依赖包管理的主流工具居然有四种&#xff0c;这是重复造了多少轮子呀。作为主要从事后端开发的我来说&#xff0c;这真是不可思议。Java的依赖包管理工具主要就两种&#xff0c;Maven和Gradle&#xff0c;而且据我多年实际开发经验来看&#xff0c;…

MySQL集群高可用架构之MySQL InnoDB Cluste

今天我将详细的为大家介绍Centos 7.5 基于 MySQL 5.7的 InnoDB Cluster 多节点高可用集群环境部署的相关知识&#xff0c;希望大家能够从中收获多多&#xff01;如有帮助&#xff0c;请点在看、转发支持一波&#xff01;&#xff01;&#xff01; 一、MySQL InnoDB Cluster 介…

Go 在结构体中定义下划线(_)字段原来还有这个特殊用途?

作者&#xff1a;陈明勇 个人网站&#xff1a;https://chenmingyong.cn 文章持续更新&#xff0c;如果本文能让您有所收获&#xff0c;欢迎点赞收藏加关注本号。 微信阅读可搜《程序员陈明勇》。 这篇文章已被收录于 GitHub https://github.com/chenmingyong0423/blog&#xff…

ECMAScript6介绍及环境搭建

这实际上说明&#xff0c;对象的解构赋值是下面形式的简写。 let { foo: foo, bar: bar } { foo: ‘aaa’, bar: ‘bbb’ }; 也就是说&#xff0c;对象的解构赋值的内部机制&#xff0c;是先找到同名属性&#xff0c;然后再赋给对应的变量。真正被赋值的是后者&#xff0c;而…

【经验分享】免费版虚拟机VMware Workstation Pro 17下载方式

【经验分享】免费版虚拟机VMware Workstation Pro 17下载方式 前言一、免费虚拟机下载方式二、 安装过程总结 前言 我真的是服了&#xff0c;现在的CSDN时效性为什么这么差了。都快一个月了还没有博主更新个人免费版虚拟机VMware Workstation Pro&#xff0c;甚至很多人还不知…

【数据结构】线性表:顺序表

文章目录 1. 线性表2. 顺序表2.1 概念及结构2.2 接口实现2.3 顺序表的问题及思考 1. 线性表 线性表是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在逻辑上是…

element-ui table使用type=‘selection‘复选框全禁用-全选禁用_elementui table禁用全选

问题点&#xff1a;当条件数据全被禁用时&#xff0c;全选按钮不是禁用的状态。 复选框全被禁用时&#xff0c;全选按钮将被隐藏 问题总结&#xff1a; 当条件数据全被禁用时&#xff0c;全选按钮也变成禁用的状态&#xff0c;而不是隐藏。有会做的小伙伴希望跟帖。谢谢&#x…

Java基础的重点知识-08-接口、多态

文章目录 接口多态 接口 从之前的章节中&#xff0c;我们了解到类的内部封装了成员变量、构造方法、成员方法&#xff0c;那么接口的内部主要就是封装了方法&#xff0c;包含了抽象方法&#xff08;JDK7及之前&#xff09;&#xff0c;默认方法和静态方法&#xff08;JDK8&…

思看科技冲刺上市疑云:募资用途遭强烈质疑,IPO前突击分红

近日&#xff0c;思看科技&#xff08;杭州&#xff09;股份有限公司&#xff08;下称“思看科技”&#xff09;已更新提交2023年最新财务资料&#xff0c;重启科创板IPO进程。贝多财经了解到&#xff0c;思看科技的上市申请于2023年6月获上交所受理&#xff0c;目前已进入问询…

yarn:终极包管理器指南 - 提高您的项目效率和性能

Yarn使用教程大纲 一、介绍1.1 什么是Yarn1.2 Yarn的优势1.3 Yarn与npm的比较 二、安装Yarn2.1 Windows安装Yarn2.2 macOS安装Yarn2.3 Linux安装Yarn2.4 注意事项 三、初始化项目3.1 在项目中使用Yarn3.2 创建新项目3.3 在已有项目中使用Yarn 四、添加依赖4.1 添加依赖4.1.1 安…

【Pandas驯化-15】Pandas中几个特征工程函get_dummies、factorize、diff、rank技巧

【Pandas驯化-15】Pandas中几个特征工程函get_dummies、factorize、diff、rank技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 相关内…

磨坊中年轻的面包师

磨坊中年轻的面包师 The young baker in the mill 每天清晨(early morning)&#xff0c;喜欢裸睡(sleep naked)的面包师(baker)在面包房(bakery)中醒来(wake up)后&#xff0c;就会到湖(lake)边取水&#xff0c;在刷(brushing)牙洗(washing)脸后&#xff0c;他就会开始烘焙(ba…

Linux_应用篇(22) 音频应用编程

ALPHA I.MX6U 开发板支持音频&#xff0c;板上搭载了音频编解码芯片 WM8960&#xff0c;支持播放以及录音功能&#xff01;本章我们来学习 Linux 下的音频应用编程&#xff0c; 音频应用编程相比于前面几个章节所介绍的内容、 其难度有所上升&#xff0c; 但是笔者仅向大家介绍…