虚拟内存和内存保护
一、内存
-
简单页表
内存是分页的 同一个页里的内存 在物理层面是连续的虚拟内存地址分为两部分 前部分是虚拟页号 后部分是偏移量
页表中存储的是 虚拟页号和物理页号之间的对应关系
-
内存地址转换
把虚拟内存地址 切分成页号和偏移量的组合从页表里 查询出虚拟页号 对应的物理页号
直接拿物理页号 加上前面的偏移量 得到物理内存地址
-
多级页表
就是将页表分为 4-1级页表 1级索引存储的就是对应的物理页号
TLB和内存保护
问题1 寻址是一个频繁的操作 需要加快速度
问题2 内存访问安全的问题
一、加速地址转换-TLB
内存中是按照页来分配的 一个页中的数据 内存都是连续的,所以同一个页中的页号完全可以缓存下来
增加一个 地址变换高速缓冲 TLB 分为 指令TLB和数据TLB,缓存策略也和CPU类似 例如脏标记和写回
这个缓存由硬件来完成 内存管理单元(MMU)芯片
二、安全和内存保护
-
可执行空间保护
就是只把指令部分设置成可以执行的 数据部分不设置成可执行的,就算是数据部分被解析成一条合理的指令 也不会被执行 -
地址空间布局随机化
一个程序或者进程的内存布局随机 不再是固定的地址
总线
- 本地总线
CPU和高速缓存通信 - 系统总线/内存总线/前端总线
CPU和主内存进行通信 - I/O总线
一、总线分类
- 数据线 传输实际的数据
- 地址线 确定把数据具体传送到哪里
- 控制线 控制对总线的访问 告诉总线有事件访问
输入输出设备
一、输入输出设备
- 接口
- I/O设备
硬件并不能直接和CPU进行通信 而是通过接口连接到总线上 再通过总线和CPU通信
设备里有3类寄存器 分别是状态寄存器 命令寄存器 以及数据寄存器
二、CPU是如何控制I/O设备的
硬件设备里还有控制电路 正式这些控制电路 CPU通过接口 向控制电路传输信号 来控制实际的硬件
以打印机为例
- 首先是数据寄存器 CPU 向I/O设备写入要打印的数据
- 然后命令寄存器 CPU 发送一个命令 告诉打印机要执行打印操作 同时将打印机的状态寄存器状态设置成not-ready
- 状态寄存器 就是告诉我们的CPU 现在设备已经在工作了 再发来指令都是没有用的
三、信号和地址
MIPS(精简指令集)的CPU是通过什么样的指令和I/O设备通信的呢?
计算机会把I/O设备的各个寄存器 以及设备内部的内存地址都映射到主内存地址空间来, 主内存会为不同的I/O设备预留一段一段的内存地址,CPU要想和I/O设备通信 就直接向这些地址发送数据 通过总线发送。I/O设备监控总线,把写入的数据通过接口 传入到I/O设备的寄存器中。这种方式叫做内存映射IO (MMIO)
什么是I/O性能
一、硬件性能
传输效率
-
HDD 机械硬盘
一般使用SATA 3.0 接口 -
SDD 固态硬盘
有两种可用 SATA 3.0 接口 和 PCI Express接口
SATA 3.0 接口的的传输速率大概是 768M/s HDD 的传输速率大概在200M/s 而SDD硬盘 使用SATA 3.0接口的话 差不多就是 500M/s 已经到极限了
SDD 硬盘还可以更快 使用PCI Express接口接口 读取速度可以到2G/s 写入速度也可以达到1.2GB/s
响应时间
就是 程序发起一个写入请求 直到请求返回的时间 SDD 更快
-
IOPS 每秒可以发起的读写次数
-
顺序读写和随机读写 随机读写的速度要比顺序读写的速度慢的多
机械硬盘
机械硬盘的IOPS 大概只有 100
一、物理组成原理
-
盘面
也就是盘片 是一个光滑的平面 这个平面上有一层磁性的涂层 盘面中间有一个电机控制的转轴 驱动我们的盘面旋转 硬盘的转速 例如 5400 7200 都是每分钟电机可以驱动盘面旋转的次数 -
磁头
盘面上的数据 并不能直接到总线 而是通过磁头从盘面上读到数据通过电路信号进行传输一块磁盘有很多个盘面 每个盘面都有正反两面 正反两面都可以存储数据 正反两面都分别有一个磁头
-
悬臂
悬臂链接在磁头上
二、存储原理
一个盘面通常是圆形的,有很多个同心圆组成,每一个同心圆都是一个磁道,每一个磁道都有一个编号 悬臂就是控制到底是读取那个磁道的数据
每个磁道会分成一个一个的扇区 上下平行的相同扇区称为一个柱面
读取数据 两个步骤
- 把盘面旋转到某一个位置 在这个位置上 悬臂可以定位到一个子区间 这个区间叫做几何扇区 所有的扇区都可以被悬臂访问到
- 悬臂移动到特定磁道的特定扇区 找到实际的扇区 找到之后磁头会落下 读取到真正的数据。
三、磁盘上的随机访问 时间组成
- 平均时延
就是我们旋转盘面 把几何扇区对准悬臂位置的时间
- 平均寻道时间
悬臂定位到具体扇区的时间
顺序存储
顺序存储的数据 尽可能在一个柱面上 这样只需要旋转一次盘面 进行一次寻道 就可以去写入和读取数据 顺序读写 HDD硬盘速度还可以
SSD固态硬盘
一、存储原理
使用电容 + 电压计的物理结构 电容充上电就是1 放电就是0 简单的实现就是一个电容存储一个bit数据 这样数据存储量上不去 价格也下不来,所以增加一个电压计 电容里冲上不同的电压 就可以表示多个bit的数。
二、物理结构
裸片叠加 裸片上放上电容
一张裸片可以放多个平面 一个平面存储量大概在GB 一个平面上会划分出很多个块 块里面会区分出很多个页 一个页大概是4kb
三、写入
对于SSD硬盘来说 数据的写入要先擦除 然后再写入 读取和写入的基本单位不是bit或者字节 而是一个页。SSD的擦除单位更夸张 必须按照块来擦除
擦除次数有上限 到达上限之后就坏掉了
四、数据写入以及再写入
我们的固态硬盘一开始都是空白的 平面 块 页 如果有数据写入的时候 就会占用块里边的页,当有数据删除的时候 就会出现有些块没有被完全用完的情况,此时这个块又是有数据的 ,但是固态硬盘又不能单独擦除一个页 只能擦除整个块,所以新数据的写入只能到新的块中。当一个块中所有的数据都删除的时候 此时才会擦除整个块 让这个块变成干净的。
当我们的磁盘快满的时候 已经没有充足完整的块的时候 这时就会做磁盘碎片整理的工作 辗转腾挪出新的块以供新数据存储 此时存储的效率就低了
实际当中呢 不可能每个块都是用满的 所以实际上一个250G的硬盘是用不完 所以厂商一般会 增加7-10%的容量
五、磨损均衡
-
增加一个闪存转换层(FTL)
FTL 就像管理内存一样 增加一张表 保存着逻辑块地址和物理块地址之间的映射 操作系统访问的都是逻辑地址 并不是实际的物理地址 只有经过FTL转换的才是物理地址 -
TRIM 指令的支持
操作系统不关心底层硬件的实现方法 所以就会带来问题 当我们删除文件的时候 其实硬件中的存储块并没有删除 只是标记成删除了 告诉操作系统 这个位置可以继续写内容 只是逻辑上的删除 并不是实际的删除。
TRIM命令 就是操作系统在删除一个文件的时候 会通知SSD 硬盘 文件块就删除了。
-
AeroSpike
一个充分利用AeroSpike 数据库的KV型数据库
- 直接对接SSD硬盘
- 大块写入 避免碎片
- 磁盘碎片整理 保证有足够的空间