层次结构存储系统

  • 一、存储器概述
  • 1、存储器分类
  • 2、主存储器组成和主存访问操作过程
  • 3、存储器的主要性能指标
  • 4、各类存储元件的特点
  • 5、存储器的层次结构
  • 二、主存和CPU的连接和读写操作
  • 1、主存芯片技术
  • 2、主存与CPU的连接与存储器拓展技术
  • 3、装入指令和存储指令过程
  • 三、硬盘存储器
  • 1、磁盘存储器结构
  • 2、磁盘存储器性能
  • 3、磁盘存储器连接
  • 4、固态硬盘SSD
  • 四、高速缓冲存储器Cache
  • 1、程序访问局部性
  • 2、cache工作原理
  • 3、cache行和主存块的映射
  • 4、cache中主存块的替换算法
  • 5、cache一致性
  • 6、cache和程序性能
  • 五、虚拟存储器
  • 1、虚拟存储器基本概念
  • 2、虚拟地址空间
  • 3、虚拟存储器的实现

前言:
  大家都知道计算机程序的运行采用的是“存储程序”的方式,也就是程序执行时必须将指令和数据放入主存,然后计算机会自动执行。这个过程中会牵扯到很多存储器。
  既然有那么多不同的存储器,必然也有一定的体系结构。那么所谓的层次结构存储系统,就是各类存储器按照层次化方式,构成的计算机的存储器整体结构。

一、存储器概述

1、存储器分类

(1)按存储元件分类
(2)按存取方式分类
(3)按功能方式分类
(4)按信息可改性分类
(5)按断电后信息可保存性分类

2、主存储器组成和主存访问操作过程

(1)记忆单元:即存储元、位元,存储0或1,构成存储阵列。
(2)存储阵列:即存储体、存储矩阵,是存储器的核心部分。
(3)编址单位:存储器内每一个位元都会被编号,相同地址的位元构成一个编址单位,即一个存储单元。
(4)编址方式:指对存储单元进行编号的方式,如按字节编址(指存储阵列内一个地址中有一个字节的空间)、按字编址。

(5)访问主存的方式与过程:

  1. CPU将访问目的主存单元的地址送到主存地址寄存器MAR(Memory Address Register)。
  2. CPU通过地址线主存地址送到主存中的地址寄存器,然后地址译码器译码后可去选择相应单元 。
  3. CPU通过控制线读/写控制信号送到主存中的读写控制电路以进一步读or写。
  4. 在读写控制电路控制下,通过数据线主存数据寄存器MDR(Memory Data register)的数据传到主存内选中单元,或者将主存中选中单元的数据传到MDR中。

这里强调一下,
1、地址线的位数决定了主存地址空间的最大可寻址范围,如36位地址线的最大可寻址范围是0~236-1。
(同时MAR宽度与地址线宽度一致)
2、数据线的位数决定了每次最多存取数据的大小,如在字节编址方式下,64位数据线每次最多存取8个字节的内容。
(同时MDR宽度与数据线宽度一致)

3、存储器的主要性能指标

(1)存储器容量

(2)存储器速度:访问时间、存储周期、存储器带宽等等

  • 访问时间之读出时间T(A):存储器接到命令道信息送到数据线的时间。
  • 访问时间之写入时间T(W):存储器接到命令道信息被写入存储器的时间。
  • 存储周期:存储器进行一次读写操作所需要的全部时间。
  • 存储器带宽B:存储器被连续访问时可以提供的数据传送速率(信息位数或字节数/时间)

(3)价格:这个就不用多说了,不看商业只看技术的话,那肯定是越贵越好。

4、各类存储元件的特点

这里主要介绍半导体存储器。

(1)随机存取存储器RAM(Random Access Memory)

  • 静态RAM(SRAM)
    1.一个二进位需要6个晶体管;
    2.读写速度更快,信息能一直保存无需刷新;
    3.功耗大,集成度低,价格贵;
    4.一般用于高速小容量的存储器,如高速缓存cache。
  • 动态RAM(DRAM)
    1.一个二进位只需1个晶体管;
    2.读写速度较慢,需要定时刷新;
    3.功耗小,集成度高,价格便宜;
    4.一般用于慢速大容量存储器,如主存储器(内存条)。

(2)只读存储器ROM(Read-Only Memory)

  • MROM、PROM、EPROM、EEPROM:都是随机存取方式工作。
  • 闪存 Flash ROM :高密度非易失性读写存储器;一般用于如U盘、存储卡、BIOS等。

5、存储器的层次结构

  前言里讲过,存储器的层次结构就是各类存储器按照层次化方式,构成的计算机的存储器整体结构。
  那么为什么要有层次结构呢,这是因为不同的存储器有其不同的特性和优点,如果有一种存储器既便宜、又容量大、又速度快、还能满足各种特殊需求,那么我们或许就不需要层次结构了,直接把这种存储器往里面塞就行,但这显然是不大可能的。
  所以我们需要一种层次结构以协调组织各种存储器,使其能在一定成本范围内完成我们预期的存储与读写效果。

二、主存和CPU的连接和读写操作

1、主存芯片技术

  第一节讲各类存储器的特点时提到过动态RAM(DRAM)主要用作主存,那么现在讲讲DRAM作为内存时的主存芯片技术。目前主要使用的是基于SDRAM的芯片技术的内存条,称为同步DRAM

(1)DRAM芯片技术

  • 目前DRAM芯片主要是采用双译码结构位片式芯片。(其实DRAM芯片都是位片式)
  • 前面讲到要访问主存的话,CPU会通过地址线将主存地址送到主存中的地址寄存器,然后地址译码器译码后可去选择相应单元 。而双译码结构中地址译码器就会分为行地址译码器和列地址译码器,分别指示存储阵列中的行号和列号。
  • 如果是单纯的二维双译码结构芯片,那么存储阵列的行列交接处的单元只有一位,称之为位片式芯片。
  • 而有时候也会有三维双译码芯片,即有多个位平面,行列交叉点上不再是一位,而是多位构成的一个存储字,会被同时读写

(2)基本SDRAM芯片技术:DDR SDRAM、DDR2 SDRAM、DDR3 SDRAM等等,其技术工作过程略显复杂,这里不多介绍。

2、主存与CPU的连接与存储器拓展技术

(1)主存与CPU连接关系如下:

CPU内部总线接口–处理器总线–I/O桥接器–存储器总线–主存

(2)存储器拓展技术:

  • 主存可以由多个内存条(内存模块)构成,内存条插槽就是存储器总线,而一个内存条是由多个存储器芯片拓展合成的。
  • 多个存储器芯片构成一个存储器时,需要进行字拓展和位拓展字拓展是单个芯片容量的拓展,位数不变;而位拓展则是将多个存储器芯片构成给定字长的存储器。
  • 多个芯片构成的内存条采用交叉编址,芯片内地址是不连续的,即同一行列位置处会同时读写。比如8个8位芯片会在行列交叉点(i,j)处同时读取64位地址。而这读取的片内地址在8片中是相同的,都是指i,j),具体的选片工作会在主存地址的低位地址完成。
  • 对于具体存储阵列,设行数r,列数c,那我们设计时一般要使r<=c,并且|r-c|最小。

  如一个8片16M×8位芯片构成的128MB内存条,该芯片有8个位平面,行地址和列地址可以是各占12位。则:

  • 128MB=212×212×8位(1B)×8片。
  • 如果主存只有这一个内存条,则主存地址低3位用于选片,
  • 高12+12位分别用于指示片内行地址、列地址。

3、装入指令和存储指令过程

load 和 store

三、硬盘存储器

1、磁盘存储器结构

(1)磁盘存储器的基本组成:

  • 磁记录介质:保存信息。
  • 磁盘驱动器:读写电路,读/写转换开关、读/写磁头与磁头定位伺服系统。
  • 磁盘控制器:控制逻辑、时序电路、并->串转换电路、串->并转换电路用于连接主机和磁盘驱动器。

(2)磁盘驱动器:

  • 磁头–盘面:每个盘片的俩面各有一个磁头,磁头号=盘面号
  • 磁道–柱面:多个盘片上的相同磁道形成一个柱面,磁道号=柱面号.
  • 扇区:即扇段,每个磁道被分成若干扇区,磁盘读写时是以扇区为单位的,每一个扇区都有一个编号。而对于每一个扇区,有多个间隙、ID域、数据域组成,数据域一般都是512B(现在有趋势至4KB)。
  • 磁道编号:读写磁盘时是一次读写一个柱面,然后移到下一个柱面。磁道最外面编址0,是自外向内编址的。

(3)磁盘读写过程逻辑

  • 盘地址:

是磁盘读写的根据,由柱面号(磁道号)、磁头号(盘面号)、扇面号(扇段号)组成。有了盘地址,就可以读写目标磁道中的指定扇区。

  • 操作过程:
  1. 寻道:磁盘控制器将盘地址送到磁盘驱动器的磁盘地址寄存器,产生寻道命令;启动磁头定位伺服系统,根据盘地址选择对应磁头到对应柱面;寻道结束,磁盘控制器收到信号,进入下一阶段----旋转等待。
  2. 旋转等待:扇区计数器清零,接下来每一个扇区标志脉冲都会使扇区计数器+1;当计数与磁盘地址寄存器的扇区地址符合时输出符合信号。
  3. 读写:此时已经确定读写信息就在磁头下,进行写操作或者读操作。

2、磁盘存储器性能

(1)记录密度:

  • 道密度:径向单位长度内的磁道数目。
  • 位密度:弧向单位长度内的二进制信息数目。
  • 有高密度存储和低密度存储之分,高密度存储的外道扇区数多,低密度存储则内外道扇区数都一样。

(2)存储容量

(注:格式化的记录面数约为盘片数的两倍,此时容量为格式化容量)

  • 存储容量=记录面数×柱面数×扇区数×扇区字节数
  • 如果是低密度存储方式,则:存储容量=记录面数×柱面数×内圆长度×最内道位密度(如果只给出位密度,一般是最内圈位密度,且是低密度存储方式)

(3)数据传输速率(内部传输速率、持续传输速率)

  • 概念:这里指的是内部传输,指真正进入读写阶段后单位时间读写的二进制信息。
  • 计算:转速(每秒)×弧长×位密度。

(4)平均存取时间

  • 存取时间=寻道时间+旋转等待时间+数据传输时间,而数据传输时间相对很小可以近似忽略。
  • 平均存取时间=平均寻道时间+平均等待时间 其中寻道时间一般为5-10ms,可以根据道数和道间移动时间计算; 其中一般为4-6ms平均等待时间就取磁盘旋转半周的时间.

3、磁盘存储器连接

第二节讲到了到了主存域CPU的连接,提到了连接结构:

CPU内部总线接口–处理器总线–I/O桥接器–存储器总线–主存

而磁盘存储器的磁盘控制器就连接在I/O总线上,从而与I/O桥接器乃至整个CPU和主存连接。

4、固态硬盘SSD

用闪存颗粒代替了磁盘作为存储介质。

四、高速缓冲存储器Cache

  前面提到过存储器的层次结构,可以看到主存和CPU之间会有一个高速缓存Cache。根据层次结构原理,Cache里存放最可能被频繁访问的程序和数据。
  这能大大提高CPU访问内存,而在这一节我们主要介绍Cache的相关性原理和自身性工作原理。

1、程序访问局部性

  程序指令、数据很多时候都是连续存放的。而在较短的时间间隔内,程序产生的地址往往集中在存储空间的一个很小范围内。通过分析可以得到以下俩个程序访问局部性:

(1)时间局部性:被访问的某个存储单元在一个较短的时间间隔内很可能又被访问。
(2)空间局部性:被访问的某个存储单元的邻近单元在一个较段的时间间隔内很可能又被访问。

2、cache工作原理

(1)主存块与cache行的结构

  • 主存块:cache是能和主存互相交换信息的,这就要保证cache和主存空间都被划分为等大的若干区域,以便按区域大小直接信息交换。其中主存中的区域称为主存块(简称块),信息交换以此为单位。
  • cache行:cache的信息来自主存块,其中存放一个主存块的区域称为cache行(槽)。

以下为cache行的结构:

  • cache有效位:无信息时cache行是空的,具体标记形式是设立一个有效位(valid bit),有效位清0则意味着该cache行内信息无效、已被淘汰,置1则表示有效主存块装入。
  • cache行标记:cache行内除了有效位,还有标记位,与接下来要讲的映射里的主存地址的标记位对应,用作映射匹配。
  • 修改位(脏位):在采用回写法时设立一位修改位,1表示主存块被修改过。(cache行不一定会有修改位,与一致性写法有关)
  • LRU位,2路组相联时占1位,4路时占2位(与修改位一样,cache行不一定有LRU位,与具体替换算法有关)

(2)Cache访问过程

  1. 地址搜寻:CPU给出主存地址addr,检查cache中有无addr所在块。
  2. cache访问:如果cache内addr所在块(cache hit),则从cache内区信息送CPU,。
  3. 主存访问:如果cache内addr所在块(cache miss),则从主存内取对应块复制到cache,同时送CPU。

(3)Cache-主存的平均访问时间

相关概念:

  • cache命中-命中率p
  • cache不命中-缺失率
  • 命中时的访问时间:即命中时间cache访问时间Tc cc
  • 不命中时的访问时间:读取主存块到cache的时间 主存访问时间Tm mm+cache访问时间Tc cc,其中Tm mm称为缺失损失

最后得到平均访问时间:

Ta aa = p×Tc cc + (1-p)×(Tm mm+Tc cc) = Tc cc + (1-p)×Tm mm

3、cache行和主存块的映射

  前面讲了cache访问的一些过程和相关时间概念。但现在有一个问题:
  
当我们要去访问某个主存单位时,要去哪个cache里面搜寻呢?或者说当我们要将某个主存块复制到cache中时,要怎么选择cache行呢?
  这里就要讲到cache行和主存块的映射方式,而映射方式的具体体现在 主存地址的结构 中:

(1)直接映射(模映射):

  • 主要思想:把主存的每一块映射到一个固定的cache行中
  • cache行号: 主存块号 mod cache行数
  • 主存地址:t位标记+c位cache行号+b位块内地址
  • 其中主存块号被分为标记和cache行号 ,根据t+c位直接推出主存块号(第几个块群的第几个块)。

如果无命中,则将主存块复制至对应cache行,设置有效位和标记位(此时标记指示在哪一个快群)

(2)全相联映射:

  • 主要思想:主存的每一块可映射到任意cache行
  • 主存地址:t位标记+b位块内地址。由于时任意cache行,所以无需在主存地址中指出cache行号,只需比较所有cache行的标记,只要与主存地址中标记一致就可以了。

    如果无命中,就直接将主存块复制到任意空闲行,然后设置cache行标记位和有效位。

(3)组相联映射:
  直接映射和全相联映射都各有其优缺点,前者容易过多的调进调出,而后者的搜寻开销大。两者结合取长补短就产生了组相联映射:

  • 主要思想:将cache分成大小相等的组,每个主存块映射到cache固定组任意一行,即组间模映射(直接映射),组内全映射,妙啊。
  • cache组号:主存块号 mod cache组数,同时组号
  • 主存地址:t位标记+q位cache组号+b位块内地址,
  • 其中主存块号被分为标记+cache组号,标记指示主存块在哪一个主存组群里,cache组号指示主存块在该主存组群的第几个从而指定组号去进行组内全映射搜索。也就是说cache有多少组,主存中每个组群中就有多少主存块。
  • N路组相联:设共有2ccache行,其中2q个组号,则每个组内有2c-q行,令s=c-q,则有每组有2scache行,称为2s路组相联,一般为2路或者4路比较常用。

如图2路组相联映射:1块、9块、17块等等都直接映射到cache1组,然后这些块在cache组内采用全相联映射

4、cache中主存块的替换算法

(1)先进先出算法(FIFO算法):

  • 替换掉最早装入cache的主存块。

(2)最近最少用算法(LRU算法):

  • 替换掉近期最少使用的主存块。
  • 每一个cache行有一个计数器,计数值称为LRU位,越小越常用,被访问时置0。
  • 此时LRU位也是cache行的组成部分,2路组相联映射时LRU位占1位,4路组相联时占2位。

(3)最不经常用算法(LFU算法)

  • 替换掉cache行中引用次数最少的块。
  • 与LRU类似但不完全相同。

(4)随机替换算法

  • 随机替换,事实证明性能还可以,主要是代价很低。

5、cache一致性

  cache行中的内容时来自主存块的副本,我们在写操作时也得更新cache,这里涉及到cache–主存一致性的问题。(当然,一致性问题在其他的一些情况也会涉及到,比如共享主存)。
  总之,为了处理好cache一致性问题,那么关键在于处理好写操作。

(1)全写法

  • 写命中时,即要写的内容就在cache内,则同时写cache和主存。
  • 写不命中,则进行写分配法(更新主存并分配cache行装入)或者非写分配法(即通写法和直写法,仅更新主存单元而不把主存块装入cache行)。

(2)回写法

  • 只写cache不写主存,若缺失则将主存块调入cache中并更新cache。
  • cache行内此时会有一位修改位,cache被替换时才将主存块内容一次写回。
  • 会出现cache和主存不同步,通常由其他同步机制进行保证。

6、cache和程序性能

  程序的性能指程序执行所用的时间,很大程度上体现在指令数据的访问时间上,而这几乎由cache命中率决定。这就要求我们的程序有良好的访问局部性。

五、虚拟存储器

1、虚拟存储器基本概念

  计算机系统在运行程序时不是单纯地拿着主存的物理地址去进行指令、数据操作的。每一个程序通常会有一个独立的巨大虚拟存储空间,这样编写程序时就不会有物理内存的大小约束了。
  可以理解为程序员在虚拟地址空间内编程,而程序实际运行时会有一套机制去到真正的内存内操作。
  就好像cache与主存间的关系一样,虚拟存储空间也会有交换块大小、映射、替换、写一致性等等问题需要考虑。

2、虚拟地址空间

每个进程都会对应一个结构相同,空间一样的虚拟地址空间映像。

(1)内核空间:用以存放操作系统内核代码和数据等,内核代码区和数据区在每个进程的地址空间中都一样。用户没有权限访问内核空间

(2)用户空间:用以给用户存放进程的代码和数据等。

  • 用户栈
  • 共享库
  • 可读写数据区
  • 只读数据和代码区

3、虚拟存储器的实现

主要介绍分页式虚拟存储器

(1)分页:

  • 虚拟地址空间被划分为大小相等的页面,硬盘和主存之间按页面为单位交换信息。虚拟地址空间中的页称为虚拟页、逻辑页、虚页
  • 主存空间也被划分为大小相等的页框,即页帧、物理页、实帧
  • 每一个进程生成一个页表,页表联系了虚拟地址空间和主存空间。通过页表实现程序中指令所用的逻辑地址(虚)向存放指令或数据的实际物理地址(实)转换。

(2)页表:
  页表是一张存放在主存中的虚页号和实页号的对照表,记录着程序的虚页调入主存时被安排在主存中的位置,且页表一般长久的保存在内存中。
  进程的每一个虚拟页都在页表里有一个对应的页表项,有如下内容:

  • 装入位:即有效位和存在位,“1”表示对应页面在主存,该虚拟页已从外存调入主存,是一个“缓冲位”。
  • 修改位:即脏位,说明页面是否被修改过。修改过的话被替换时会写回磁盘。
  • 使用位:说明使用情况,用来配合替换策略。
  • 访问权限位:说明权限,用于存储保护。
  • 禁止缓存位:说明是否可以装入cache,保证存储器一致性。
  • 虚拟页的存放位置:若装入位为“1”,表示 主存物理页号(页框号)
    若装入位为“0”:则该字段要么是虚拟页在磁盘上的地址,表示虚拟页面是一个未缓存页
    要么是null,表示虚拟页面是一个未分配页

(3)地址转换:
  这里的地址转换指将虚拟地址转换为主存物理地址,由CPU内的存储器管理部件MMU完成。
  地址构成结构:虚拟地址和主存物理地址都由页号页内偏移地址组成,
  其中,页内偏移地址俩者一样,页号根据页表项关联,当我们知道了虚拟地址后,作如下转换过程:

  • 根据页表基址寄存器找到主存中对应的页表位置。
  • 找到页表后,根据虚页号找到对应页表项。
  • 如果装入位为1,则找到物理页号并且得到完整的物理地址。
  • 如果装入位为0,则说明缺页,进行缺页处理。

(4)快表:

  上述过程都需要从主存中查页表并且做各种后续操作,访存次数会变多,相对于主存中的页表(可以称为慢表),我们可以将活跃页表项复制到高速缓存内,形成快表TLB(后被转换缓冲器)。
  TLB很小,表项是TLB标记+慢表项,标记表示该表项来自哪一个虚拟页。

  • 全相联时虚拟页号:直接对应TLB标记。
  • 组相联时虚拟页号:高位对应TLB标记,低位对应TLB组号。

(5)最后po一张老师ppt里的CPU访存过程图:


----完结撒花 :: 2021/1/3,01:37

六、层次结构存储系统相关推荐

  1. 计算机组成原理闭卷,《计算机组成原理》试卷A (闭卷)

    <<计算机组成原理>试卷A (闭卷)>由会员分享,可在线阅读,更多相关<<计算机组成原理>试卷A (闭卷)(3页珍藏版)>请在人人文库网上搜索. 1.计 ...

  2. 袁春风老师:计算机系统基础(一) 第一章

    南京大学 计算机系统基础(一)主讲:袁春风老师 基础好的读目录回顾一下即可 本课程是以csapp为教材进行讲解的 程序执行结果,不仅取决于算法.程序编写.编程语言的语法语义 ,而且取决于语言处理系统. ...

  3. 计算机导论与计算机组成原理关系,计算机组成原理

    一 .课程简介 课程中文名称:<计算机组成原理与汇编语言> 课程英文名称:Computer principle and assembly language 课程编号:ZYB08003 课程 ...

  4. 想从事分布式系统,计算,hadoop等方面,需要哪些基础,推荐哪些书籍?--转自知乎...

    作者:廖君 链接:https://www.zhihu.com/question/19868791/answer/88873783 来源:知乎 分布式系统(Distributed System)资料 & ...

  5. 微机原理及接口技术-6

    <微机原理及接口技术>第06章在线测试  <微机原理及接口技术>第06章在线测试 剩余时间: 59:55  答题须知:1.本卷满分20分.            2.答完题后, ...

  6. 2019在职跨考南大计算机非全日制专硕-初试364经验帖

    今天刚刚收到录取通知邮件,一颗悬着的心终于放下了. 接下来,我将为大家介绍一下南京大学计算机科学与技术系-计算机专业学硕/专硕的录取难度.全日制和非全日制的培养方式.我的复习经验.复试流程等. 一.背 ...

  7. 计算机组成原理_存储系统结构

    计算机组成原理总目录 存储系统结构 1. 存储系统的层次结构 存储系统的层次化结构图如下: 除此之外,存储系统的层次结构还可以分为以下两个层次 [Cache--主存]:用于解决主存与CPU不匹配的问题 ...

  8. 计算机系统基础期末复习--袁春风详细版

    计算机系统与基础 1.1.1 C语言程序举例 用"系统思维"分析问题 -2147483648<2147483647 (false)与事实不符?!why? 以下表达式如何呢? ...

  9. 【期末复习】计算机组成原理

    使用教材:唐朔飞 <计算机组成原理> 第二版 参考慕课:<计算机组成原理>刘宏伟 哈尔滨工业大学 计算机导论指路:还没写呢 概述部分 第1章 计算机系统概论 计算机=主机+外设 ...

最新文章

  1. python image stiching_Python自然语言处理,词云图生成
  2. matlab节约里程法_芳烃产业链里程碑:唐山旭阳30万吨/年苯乙烯项目一次性开车成功...
  3. 第二届数据标准化及治理奖评选顺利结束
  4. XXL-Job分布式任务调度
  5. MySQL主从复制详细配置步骤及复制延时问题解决
  6. Fedora 17 PHP编程环境配置
  7. java常用网络协议_初识java网络编程
  8. 案例:需求问题的解决方案
  9. springmvc 基础内容
  10. 百度离线语音合成SDK使用
  11. c语言编写程序p1207.c,《C语言程序设计》(卷)考核班级
  12. VC++开发RTX拨打电话插件
  13. 免费开源的智能家居系统,SpringBoot+Vue前后端分离,WiFi智能设备接入,手把手开发安卓APP,建立QQ智能管家机器人!
  14. 软件测试速记口诀(一)<软件测试基础>
  15. CVPR 2019 论文最新汇总(按方向划分,0611 更新中)
  16. 为多孔介质的当量直径_CFX多孔介质模型介绍
  17. DOS命令篇(find 和 findstr)
  18. 滤波器,滤波器的种类,作用,原理
  19. js在指定的td中插入html元素,js在指定位置增加节点函数insertBefore()用法实例
  20. 剧情/惊悚基因危机:天才科学家的五日

热门文章

  1. 用猿大师办公助手在Chrome网页中打开了Office Word,再用桌面Office打开其他Word打不开怎么办?
  2. 基于JAVA大学生心理咨询系统计算机毕业设计源码+系统+lw文档+部署
  3. SINGAN: Singing Voice Conversion with Generative Adversarial Networks
  4. 函数占位符和占位参数
  5. DAC双通道输出电压实验
  6. 怎样解决MathType破解版中工作区光标变小
  7. 河南省多校联萌-HAUT-1285-军团再临
  8. 三星Galaxy手机配备6800mAh电池
  9. 虚拟机下安装Fedora教程
  10. python中sorted用法_Python中sorted()方法的用法