内存物理组成
SAM:顺序存取存储器,按照某种顺序存取,存取时间和在存储体上的物理位置有关系
DAM:直接存取存储器,先寻找一块小区域,接着顺序查找
RAM:随机存取存储器,存取时间与物理位置无关
存取时间:启动一次存储器操作到完成所经历的时间
存取周期:连续进行两次独立访问存储器操作之间所需要最小的时间间隔
存取周期>存取时间(因为要恢复存储)
存储层析的主要思想:上一层的存储器作为低一层存储器的高速缓存。
主存和cache之间的交换都是硬件自动完成的,
cache-主存的速度接近cache,容量接近主存。主存-辅存的速度接近主存,容量接近辅存。
前者对所有程序员都是透明的,后者只对应用程序员是透明的。
SARM和DRAM都是易失性的,前者是双稳态触发器,后者是栅极电容。前者非破坏性读出,后者是破坏性读出。
DRAM的刷新分为:集中刷新、分散刷新(不存在死时间)和异步刷新(在译码阶段刷新)
刷新是对CPU透明的,不依赖于外部。DRAM的刷新单位是行,芯片内部自动生成行。刷新不需要选片,直接全部刷新所有芯片。
传统DRAM是异步交换数据,CPU发出信号后,延迟一段时间数据才读写完成,CPU不做别的工作。SDRAM与CPU之间采取同步方式,他可以把CPU传送的信号锁存起来,CPU和在读写完成前做其他的操作。SDRAM也可以突发传输。
行缓冲器用来缓存指定行中的数据,大小为列数×位平面数,通常是SRAM
存储芯片:存储体、IO读写电路、地址译码器和控制电路组成。
PROM只能编写一次,EPROM可以多次
FLASH:可以长期保存信息,又能快速读写
SSD:控制单元和存储单元(FLASH芯片)组成
U盘时由E2PROM类型的存储器
编址单位是指具有相同地址的那些存储元件构成的一个单位
CPU→MAR→M的地址寄存器→M的地址译码器→M→MDR→CPU
CPU同步读写信号:写信号时同步将内容传入MDR,将内容放在数据线上写入单元。读信号时,将单元内容通过数据线传入CPU中。
MAR位数与地址线位数相同,MDR位数与数据线位数相同。如果数据线位数不等于存储字长,MDR是和数据线一致。
DRAM的地址引脚复用,也只有DRAM复用。想要引脚最少|r-c|最小,其次r≤c
多模块存储器:
空间并行技术,利用多个结构完全相同的存储模块的并行工作来提高吞吐率。
①单体多字存储器,每个存储单元存储m个字,总线宽度也为m个字,一次性并行读出m个字。在一个周期内,从同一个地址取出m条指令(每1/m和周期,CPU取出一条指令)
②多体并行存储器:每个模块都用独立的读写控制电路、地址寄存器和数据寄存器
i) 高位交叉编址:将地址的前几位数当做体号确定模块,但是这种本质还是串行存取,顺序存储器
ii)低位交叉编址:将地址的后几位数当做体号确定模块,相当于扩字。
轮流启动:如果一次读写位数正好等于数据线位数,存取周期为T,总线周期(传输整个流程耗时)为r,为了实现轮流启动,模块数要 ≥ T/r。其实就是保证,下一次读取这个模块整个存储操作完成。此时连续存取m个字的时间为:T+(m-1)r。如果是顺序存储则为mT。交叉存取器中访存可能冲突,如果访存的地址出现在同一个模块则会冲突,此时需要延迟发生冲突的请求。
同时启动:所有模块一次并行读写的总位数刚好等于数据的总线位数。
外存物理组成
磁盘:①量大价低②记录介质重复使用③长时间存储,脱机存储④非破坏性读出
磁盘存储器:磁盘驱动器(读写器械),磁盘控制器(IO)和盘片
存储区域:磁盘面,面上磁道,磁道划分为扇区。
磁盘高速缓存:在内存中开辟一部分区域,用于缓冲将被送到磁盘上的数据。优点:写磁盘的时候是按照“簇”进行的,可以避免频繁使用小块数据写盘,有些中间结果数据在写回磁盘之前可以被快速再次使用。
磁记录方式:调频制FM和改进型调频制MFM
磁盘容量有非格式化容量和格式化容量。非格式化容量是指磁记录表面可利用的磁化单元总数,非格式化容量=记录面数×柱面数×每条磁道的磁化单元数。格式化容量是指按照某种特定的记录格式所能存储信息的总量。格式化容量=记录面数×柱面数×每个扇区的容量。格式化后的容量比非格式化容量小。
柱面号 盘面号 扇区号
磁盘属于机械式部件,其读写操作是串行的,不可能在同一时间既读又写,也不可能在同一时刻读两组或写两组数据。
RAID磁盘阵列
RAID是指将多个独立的物理磁盘组成一个独立的逻辑盘,数据在多个物理盘上分割交叉存储、并行访问,具有更好的存储性能、可靠性和安全性。
RAID0:无冗余和无校验的磁盘阵列
RAID1:镜像磁盘阵列
RAID2:采用纠错的海明码的磁盘阵列
RAID3:位交叉奇偶校验的磁盘阵列
RAID4:块交叉奇偶校验的磁盘阵列
RAID5:无独立校验的奇偶检验磁盘阵列
固态硬盘SSD是一种闪存技术的存储器。
闪存芯片代替磁盘驱动器,闪存翻译层代替磁盘控制器。
数据是以页为单位读写的。只有在一页所属的块整个被擦除后,才能写这一页。
随机写很慢,修改一个页需要将所在整个块复制到别的块中。
磨损均衡:动态磨损均衡(自动选择新的闪存块)、静态磨损均衡(更先进,没有数据写入SSD也会监测并自动进行数据分配)
高速缓冲存储器
cache直接集成在CPU中
局部性:时间局部性和空间局部性
时间局部性:最近的未来要用到的信息,可能为现在正在使用的
空间局部性:最近的未来要用到的信息,可能为现在正在使用的信息空间上邻近
CPU与cache之间的数据交换以字为单位,而cache与主存之间的交换则以cache块为单位。
cache关键问题:①数据查找②地址映射③替换策略④写入策略
直接映射:冲突概率最高空间利用率最低。cache行号=主存块号%cache总行数。
地址结构:tag+cache行号+快内地址
全相联映射:冲突概率低空间利用率高,标记比较速度慢实现成本高要采用按内容寻址的相联存储器。每个cache行都设置一个比较器,比较器位数等于标记字段的位数。(这个是每行都一个)
组相联映射:cache组号=主存块号%cache组数。
地址结构:标记+组号+块内地址
直接映射因为每块只能映射到唯一的cache行,因此只需要设置一个比较器。而r路组相联映射需要在对应分组中与r个cache行进行比较,因此需设置r个比较器。(这个是一次性比较几个有几个)
替换算法
随机算法(RAND)先进先出(FIFO)近期最少使用(LRU)做不经常使用(LFU)
①随机的确定替换cache行,但是未按照局部性原理
②选择最早调入cache行进行替换,也未按照局部性原理
③依据程序访问的局部性原理,选择近期内长久未访问过的cache进行替换(堆栈类算法),其算法需要在cache行增加一个计数器(也叫LRU替换位),其实就是往前数,数到最前面的那个替换
④讲一段时间内被访问次数最少得cache行换出,cache行加一个计数器,每访问一次计数器加一,替换时将计数值最小的行换出。
写命中
①全写法:CPU对cache命中时,将数据同时写入cache和主存。写缓冲(为了减少全写法直接写入主存的时间损耗,在cache和主存之间加一个写缓冲,CPU将数据写到cache和写缓冲中,写缓冲才写到主存中)是一个FIFO队列
②回写法:CPU对cache写命中时,只是把数据写入cache,只有替换时才写回。但是需要增加一个脏位
写不命中
①写分配法:更新主存单元,然后将这个主存单元调入cache中。
②非写分配法:只更新主存单元,而不把主存块调入cache。
非写分配+全写法 写分配+回写法
cache行中一定有有效位,但是有无脏位和替换位看题干。
虚拟存储器
CPU访问主存的时候用的是物理地址
用户编程用的是虚拟空间的虚拟地址
CPU使用虚地址是,先判断虚地址对应内容是否装入主存。若在主存则通过地址变换,直接访问主存。若不在主存中,则把包含这个字的一页或者一段调入主存后再由CPU访问。若主存满了用替换算法置换即可。
虚拟内存要高命中率所以采用全相联映射,在处理一致性问题的时候采用回写法。
页式虚拟存储器:
页表:长久的保存在内存中,包括有效位(是否在主存中)、脏位(修改位)和引用位(使用位),后面跟着物理页地址或者磁盘地址。
优点:页面长度固定,页表简单,调入方便。
缺点:内存浪费,处理保护和共享不如段式虚拟存储器方便。
每个进程都有一个页表基址寄存器(存放该进程的页表首地址),根据虚拟地址高位虚拟页号找到对应页表项,如果有效位为1则取出物理页号组成物理地址,否则缺页进行缺页处理。
TLB快表
将最近经常访问的页表项存放在高速缓冲器组成的快表(TLB)中。
快表通过SRAM组成,采用组相联映射或者全相联映射。TLB表项由页表表项内容和TLB标记组成。全相联就是页表项的虚拟页号。组相联则是虚拟页号的高位部分,低位是TLB的组号
序号 | TLB | Page | Cache | 说明 | 访存 |
1 | 命中 | 命中 | 命中 | TLB命中则Page一定在内存中,信息在主存中,就可能在cache中 | 0次 |
2 | 命中 | 命中 | 缺失 | TLB命中则Page一定命中,信息在主存中,也可能不在cache中。 | 1次 |
3 | 缺失 | 命中 | 命中 | TLB缺失但是Page命中,信息在主存中,就可能在cache中。 | 1次 |
4 | 缺失 | 命中 | 缺失 | TLB缺失但是Page可能命中,信息在主存,也可能不在cache中 | 2次 |
5 | 缺失 | 缺失 | 缺失 | TLB缺失则Page也可能缺失,信息不在主存,一定不在cache中。 | ≥2次 |
cache缺失由硬件完成,缺页处理由软件完成,操作系统通过“缺页异常处理程序”来实现。TLB缺失既可以通过硬件处理也可以通过软件处理。(TLB被集成在了CPU中,被视为MMU的一部分)
快表快因为是硬件快,慢表(页表)在内存中需要靠算法优化查找。
段式虚拟存储器
分段对程序员来说是不透明的,而分页对程序员透明。
段页式虚拟存储器
把程序按逻辑结构分段,每段再划分固定大小的页,主存空间也划分为大小相等的页,程序对主存的调入调出以页为交换单位。每个程序对应一个段表,每段对应一个页表,段的长度必须是页长的整数倍,段的起点必须是某一页的期待你。
优点:可以按段实现共享和保护。缺点:在地址变换过程中需要两次查表,系统开销大。
内存管理概念
①内存空间的分配与回收
②地址转换
③内存空间扩充:利用虚拟存储技术从逻辑上扩充
④内存共享:多个进程访问内存的同一部分,只有只读区域才可以共享
⑤存储保护:设置上下限寄存器,基址寄存器/重定位寄存器、界地址寄存器/限长寄存器
编译、链接(静态链接、装入时动态链接和运行时动态链接)和装入(绝对装入、可重定位装入、动态运行时装入)
绝对装入:单道程序,绝对地址,编译或者汇编时给出。
可重定位装入:装入时对目标程序中的相对地址的修改过程称为重定位。(静态重定位)
动态运行时装入:装入内存中不会立即转换,将要运行时才进行转换。(需要重定位寄存器)
静态链接:运行之前链接好
装入时链接:装入内存时链接
运行时动态链接:执行需要某模块的时候才链接这个模块
进程几个要素:代码段、数据段、PCB、堆和栈
可重入代码也叫纯代码,允许多个进程同时访问但是不允许被任何进程修改的代码。
存储管理方式:单一连续分配→动态分区分配。连续分配→离散分配(页式分配)
连续分配管理方式
单一连续分配:一个P占用整个用户区,内部碎片
固定分区分配:用户内存空间划分为固定大小的分区(可以大小相等或者大小不等),建立分区使用表,也有内存碎片
动态分区分配:可变分区分配,根据进程的需要动态的分配内存。但是会出现外部碎片
动态分区分配算法
①基于顺序搜索的分配算法
首次适应(第一个合适的分区):这个是最好的
邻近适应(从上次查找的地方接着找)
最佳适应(容量递增排列,最容易产生内存碎片)
最坏适应(容量递减排列,性能差)
②基于索引搜索的分配算法
快速适应算法:根据索引表找到可以容纳的最小的空闲分区链表
伙伴系统:先找2^i≥n的块数,如果没有则找2^(i+1)的块,分为两半,一个用于分配一个加入链表
哈希算法:构建哈希函数,根据空闲分区大小生成key
上述都是连续分配
非连续分配:分页存储管理、分段存储管理(进程一次性全部丢进去)
基本分页存储管理
页表:系统为每个进程建立一张页面映射表,页表。每个页表项由页号和块号组成,记录了页面在内存中对应的物理块号。
两级页表:
①用一张索引表来记录各个页表的存放位置
②只将当前需要的部分页表调入内存,其余继续驻留磁盘,需要时再调入。
实现:增加一个外层页表寄存器(页目录基址寄存器)
在多级页表机制中,各级页表的大小不能超过一个页面。
基本分段存储管理
分页和分段对比:
页是信息的物理单位,目的是提高内存利用率。
段是信息的逻辑单位,更好的满足用户需求。
页大小固定,段大小不固定
页地址是一维的,段地址是二维的
虚拟内存管理
当内存空间不够时,由os将内存中暂时用不到的信息换出外存,从而腾出空间存放要调入内存的信息,这个过程就是页面置换。这样,系统好像为用户提供了一个比实际内存容量大得多的存储器,叫做虚拟存储器(多次性、对换性、虚拟性)
请求分页存储管理
请求分段存储管理
请求段页式存储管理
需要内外存、页表机制、中断机构,地址变换机构
页表机制:比起基本的页表机制,多了状态位(是否在内存)、访问字段(在一段时间内被访问的次数)、修改位(是否被修改)、外存地址(页在外存的存放地址)
中断:缺页中断,调用缺页中断处理程序。缺页进程被阻塞,放入阻塞队列。调入页面后唤醒。
页框分配
①内存分配:固定分配局部置换、可变分配全局置换(只要缺页就增加物理块)、可变分配局部置换(根据缺页率来着呢增加物理块)
②物理块调入:固定分配的时候,将空闲物理块分配给各个进程。平均分配算法、按比例分配算法、游戏那去哪分配算法。
③调入页面的时机:预调页策略(用于首次调入,程序员指出,例如main函数的页)、请求调页
④从何处调入页面:外存分为存放文件的文件区和用于存放对换页面的对换区(也叫交换区),对换区连续存放,文件区采用离散分配方式,对换区的IO速度比文件区大。
i.系统拥有足够的对换区空间(全部从对换区调入)
ii.系统缺少足够的对换区空间(不会修改的直接从文件区调入,可能修改的直接从对换区调入)
iii.UNIX方式。与进程有关的文件都在文件区,未运行的页面从文件区调入,换出的页面放对换区。共享页面如果被其他进程调入,则不需要再次调入
页面置换算法(os专题有)