缓存为啥比内存快
内存使用 DRAM 来存储数据的、也就是动态随机存储器。内部使用 MOS 和一个电容来存储。
需要不停地给它刷新、保持它的状态、要是不刷新、数据就丢掉了、所以叫动态 、DRAM
缓存使用 SRAM 来存储数据、使用多个晶体管(比如6个)就是为了存储1比特
内存编码
内存控制器:作为 CPU 和 内存的中介、为两位提供服务。
CPU 给内存存储空间统一编址、以字节为单位、然后要读取数据的时候直接把地址交给内存控制器、然后内存控制器再映射成内存的哪个芯片哪个分片哪些位置。
后面将这个内存控制器直接集成到 CPU 内部了
NUMA
Non Uniform Memory Access 非一致性内存访问
16 个车间拆分位两部分,成为两个 CPU、组成两个 NUMA 节点。每个 cpu 里面有 8 个核心。
每个节点直接连接一部分内存、两个节点之间有专门的inter-connect(内连接)通道。
各个节点访问自己管理的内存叫作本地访问 Local Access,通过 inter-connect 通道反问其他节点管理的内存叫作远程访问 remote Access。很显然、前者的访问速度要比后者快很多。
操作系统对此的支持
首先是缓存的问题、操作系统的进程和线程调度管理部门需要尽量不要跨 NUMA 节点调度线程、不然都话、缓存都失效了。
还有就是内存亲和性的问题、线程在哪个 NUMA 节点内执行、就把内存分配到那个节点直接连接的内存中、避免跨节点内存访问。
NUMA 节点和物理 CPU 并不是意义对应的、实际情况可能会更复杂
机械硬盘
金属磁粒
磁道、磁头、每个扇区固定存储 512 字节
机械硬盘每次读写都是以扇区作为单位、即使你只想读取一字节、也得把我所在的整个扇区一起读取出去。
操作系统把几个连续的扇区当作一个整体、叫作块、读写都是以块为单位进行的。
最常见的是以 8 个扇区构成的块、也就是4096字节。4kb
块位图
为了知道哪些块是空着的、哪些块是已经使用的、文件系统使用位图进行记录、0表示空闲、1表示占用。
位图放在专门的块中、比如放在第一个块中。
inode
每个文件都有一个 inode 对象
inode 对象中包含文件的大小、所在块的位置、权限、时间等数据、只要拿到 inode 数据就能找到文件了。
inode 对象存在哪?
inode 表、每个 inode 对象都是 128 字节、整整齐齐的列在表格中、每个 inode 对象都哟一个号码、拿着 inode 号码就能查找到 inode 对象、进而找到文件。
那怎么知道 inode 表哪些是空闲的哪些是已经使用了的?
inode 位图块
目录
有个表格、记录的是文件名和 inode 号的映射关系
可以使用单独一个文件来存储这个表格、并把它叫作目录、里面的每一项都是一个目录项、目录文件里面记录的内容就是属于这个目录下的所有文件、通过这个目录项就能将文件名翻译成 inode 号
如何找到根目录文件?
把它放到 inode 表格开头固定的位置
描述符
inode 对象的大小是 128字节、一个块的大小是 4096、那么可以存放 32 个 inode 对象、但是一个硬盘怎么可能只有 32 个对象
所以只用一个块来做 inode 表肯定不够的、要有多个才行、既然多个、那么就要把它的位置信息记录下来、
那就再拿一个块来记录这些信息吧、叫做描述符、顺便把位图块、inode 位图块的位置信息记录下来。
超级块
一个块才 4k 用它来充当块位图、最多能表示 8 x *4096 = 32768 个数据块、也即是 32768 *x 4k = 128M
硬盘空间肯定会比这个大的。
那就将硬盘空间进行分组、每个块组就是 128M
但是分成多个块组之后、又有一个新的问题、如果想知道所有块组总共使用了多少块、剩余多少块、怎么去统计?
一个个块组去遍历吗?干脆再拿一个块来记录这些全局信息、那就叫它超级块、放在第一个块组的最前面。
这样子之后、一个完整的文件系统存储格局就出来了
引导块、分区DBR 和 MBR
一个硬盘可以有多个分区、每个分区都可以使用不同的文件系统、所以上面所说的规则、只对硬盘的某个分区有效的。
每个分区的开头、需要一个启动扇区 DBR 安装操作系统的时候、引导程序久被写到这里、所以还需要在分区的最前面准备一个引导块。
最后还要找个地方将所有的分区信息记录起来、它位于硬盘的第一个扇区、同时还肩负着引导操作系统的重要使命、它的名字叫主引导记录 – MBR
上面这个文件系统叫做 ext2
https://book.douban.com/subject/36428782/