大话存储第三章-磁盘原理与技术详解
一些磁盘结构示意图:
1 硬盘结构
盘片:每个盘片有上下两个盘面,从上到下从0开始编号,盘面号又叫磁头号;
磁道:磁盘格式化划分多个同心圆,同心圆轨迹叫做磁道,从最外圈向内从0开始编号;外圈线速度快,读写速度要比内圈快;每段圆弧叫一个扇区,从1开始编号,每个扇区的数据作为读写最小单位被同时读出或写入;离主轴最远的0磁道存放着用于操作系统启动必须的程序代码,PC启动后BIOS程序在加载任何操作系统或其他程序时,默认从0磁道读取代码运行。
柱面:所有盘上的同一磁道,在竖直方向上构成一个圆柱,称为柱面;数据的读写按照柱面进行,因为选取磁头只需要电子切换,速度较快,而选取磁道需要机械切换,速度较慢;
扇区:扇区头标存放描述扇区的元数据,CHS编址方式转向LBA编址方式,磁盘对外提供的地址全是线性的LBA(logical block address)地址;磁盘初始化时,将磁盘控制电路的ROM芯片中的对应关系数据载入缓冲区,磁盘控制器可以通过LBA找到对应的物理地址。扇区按照交叉因子(Interleave)进行编号。MFM(Modified Frequency Modulation)改进型调 ...
大话存储第二章-IO
PCI 外围器件互联(Peripheral Component Interconnect)总线是台式机与服务器普遍使用的南桥与外设连接的总线技术;
cpu与内存速度较高,组成一个高速域。外设与硬盘速度相对较低,组成一个低速域。我们用南北桥将这两个域连接起来。目前的新式主板架构中,高速总线比如PCIE2.0往往直接接入北桥,南桥只连接低速总线。南北桥芯片有重定向的功能,比如将cpu发出的设备逻辑寻址重定向到总线上实际的设备上。
网络就是将节点连接起来,就是“连找发”模型;
CPU向磁盘读数据的过程(从IO的视角):
首先CPU将IO地址发送到系统总线上,北桥接收到之后,等待cpu发送的第一个针对该外设的指令。然后cpu发送如下3条指令:
第一条:包含当前指令读还是写;其他选项:操作完成时是否利用中断通知cpu,是否启用磁盘缓存;
第二条:指明读取硬盘的逻辑块号(LBA),它是对磁盘存储区的一种抽象;
第三条:给出读取出来的内容放到内存的哪个地址中;
这三条指令被北桥依次发送给IO总线上的磁盘控制器执行,磁盘开始调度寻道;
大话存储第一章-存储发展史
存储设备发展的历史,书中按照时间顺序展示如下:
竹简与纸张
选数管
穿孔卡
穿孔纸带
磁带
磁鼓存储器
硬盘驱动器
软盘
光盘
Flash芯片和卡式存储
磁盘阵列
大型网络化磁盘阵列
Hitting the Memory Wall Implications of the Obvious
论文笔记历史内存墙是指处理器在处理大量数据时,往往需要等待来自比较慢的 RAM 内存的数据。 因此,数据密集型算法每秒运行的计算量比处理器理论上的计算量要少。这是一个持续存在的问题,而且几十年来它变得越来越糟,因为与处理器速度相比,内存速度的进步本质上是较慢的。它在 1994 年的论文 Hitting the Memory Wall: Implications of the Obvious 中首次被描述。
描述一般情况下内存访问时间的公式如下:
t_{avg}=p*t_c+(1-p)*t_m其中t_c、t_m、p分别表示cache访问时间、DRAM访问时间、以及cache命中率。
随着技术的不断发展(处理器速度于存储设备的访问速度),平均访存时间将如何变化呢?我们不妨假设cache的速度与处理器速度相同并且增长速度相同,很多处理器的片上cache已经达到这一性能,即t_c=1\ cpu\ cycle。此外我们假设cache性能完美,即cache不会发生碰撞以及容量缺失,仅有的访存缺失是程序中必不可少的访存缺失,即1-p是访问以往从未被引用过的内存地址的概率。
虽然1-p很小,但是仍然 ...
什么是操作系统内核?
以下总结自wikipedia
内核是计算机操作系统核心的计算机程序,对系统中所有事务具有控制权。内核是操作系统代码的一部分,始终驻留在内存中,有助于硬件和软件组件之间的交互。一个完整的内核通过设备驱动控制所有的硬件资源(例如I/O,内存,加密)、仲裁有关此类资源的进程之间的冲突、优化公共资源(如CPU、缓存、文件系统)的利用、以及优化网络。
在大多数系统上,内核是启动时(在引导加载程序之后)加载的第一批程序。它处理启动的其余部分以及来自软件的内存、外围设备和输入/输出 (I/O) 请求,将它们转换为CPU的数据处理指令。
内核的关键代码通常被加载到单独的内存区域中,该区域受到保护,不会被应用软件或操作系统的其他不太关键的部分访问。内核在这个受保护的内核空间中执行其任务,例如运行进程、管理硬盘等硬件设备以及处理中断。相比之下,浏览器、文字处理器、音视频播放器等应用程序使用单独的内存区域,称为用户空间。这种分离可以防止用户数据和内核数据相互干扰并导致不稳定和缓慢,以及防止出现故障的应用程序影响其他应用程序或使整个操作系统崩溃。即使在内核被包含在用户程序空间的系统中,也需要内存保护来防止 ...
DDIA-第二部分-分布式数据
分布式数据
可扩展性:
如果你的数据量、读取负载、写入负载超出单台机器的处理能力,可以将负载分散到多台计算机上。
容错/高可用性:
如果你的应用需要在单台机器(或多台机器,网络或整个数据中心)出现故障的情况下仍然能继续工作,则可使用多台机器,以提供冗余。一台故障时,另一台可以接管。
延迟:
如果在世界各地都有用户,你也许会考虑在全球范围部署多个服务器,从而每个用户可以从地理上最近的数据中心获取服务,避免了等待网络数据包穿越半个世界。
扩展至更高的载荷
共享架构:
如果你需要的只是扩展至更高的载荷(load),最简单的方法就是购买更强大的机器(有时称为垂直扩展(vertical scaling)或向上扩展(scale up))。许多处理器,内存和磁盘可以在同一个操作系统下相互连接,快速的相互连接允许任意处理器访问内存或磁盘的任意部分。在这种共享内存架构(shared-memory architecture)中,所有的组件都可以看作一台单独的机器。在大型机中,尽管任意处理器都可以访问内存的任意部分,但总有一些内存区域与一些处理器更接近(称为非均匀内存访问(nonuniform me ...
DDIA Chapter 4:编码与演化
应用程序不可避免的存在迭代,所以开发人员应该竟可能构建具有可演化性、能灵活适应变化的系统。当数据格式(format)或模式(schema)发生变化时,通常需要对应用程序代码进行相应的 更改(例如,为记录添加新字段,然后修改程序开始读写该字段)。但在大型应用程序中, 代码变更通常不会立即完成,因为考虑到:
对于服务端(server-side)应用程序,可能需要执行滚动升级 (rolling upgrade)(也 称为阶段发布(staged rollout)),一次将新版本部署到少数几个节点,检查新版本是 否运行正常,然后逐渐部完所有的节点。这样无需中断服务即可部署新版本,为频繁发布提供了可行性,从而带来更好的可演化性。
对于客户端(client-side)应用程序,用户可能长时间不会去升级软件。
这意味着,新旧版本的代码,以及新旧数据格式可能会在系统中同时共处。系统想要继续顺 利运行,就需要保持双向兼容性(从代码读取数据的角度出发):
向后兼容 (backward compatibility) :新代码可以读旧数据。
向前兼容 (forward compatibility) : ...
DDIA Chapter 3:数据存储与检索
数据库核心:数据结构最简单的数据库由两个Bash函数实现,底层采用一个纯文本文件实现,每一行包含一个key-value对,逗号隔开。每次调用db_set追加新内容到文件末尾,旧版本不会被覆盖,需要查找文件中最后一次出现的键来查找最新值。这种思想类似于日志,很多数据库内部使用日志,其是一个仅支持追加式更新的数据文件。此外数据库还需要考虑并发控制、回收磁盘以控制日志文件大小、错误处理、部分完成写记录等诸多问题。
当日志变得非常大时db_get的性能会非常差,每次查找一个键的最坏开销为$O(n)$,为了加快查找,引入索引。索引的方法论为保留额外的元数据作为路标帮助定位数据,也可以针对不同的查询方式,在数据的不同部分,定义多种不同的索引。索引是原始数据派生出来的,众多数据库允许单独添加或删除索引且不影响数据库内容。然而,维护索引这个额外数据结构会引入开销,尤其是新数据写入时性能很难超过简单的追加文件方式。由于每次写都需要额外更新索引,任何类型的索引通常都会降低写速度。
索引的创建需要经过仔细的trade-off,适当的索引可以加快读取查询,但是索引也会降低写性能。
哈希索引原理:假设数据全部由 ...
论文阅读——MapReduce——Simplifified Data Processing on Large Clusters
MapReduce: Simplifified Data Processing on Large Clusters 论文链接
MapReduce整体介绍MapReduce是一个针对处理大数据集的编程模型,主要有Map函数和Reduce函数两个核心概念。我们使用Map函数来从输入文件中产生intermediate(这里翻译成“中间”) key/value键值对,然后使用Reduce函数来合并所有属于相同key的value。
具体来说,用户编写Map函数接受原始key/value键值对,然后产生一系列的中间key/value,MapReduce会将属于同一个key的所有value聚合成value列表,然后将它们传给Reduce函数。用户编写的Reduce函数接收中间key以及属于该key的value列表,然后将属于同一个key的value合并输出。根据论文描述,intermediate value是通过迭代器的形式提供给Reduce函数的,这样做的目的是为了应对value列表太大,无法全部放入内存的情况。
以这种风格编写的程序会在大型机器集群上自动并行执行,其中,运行时系统负责以下工作:
...
开端
2022年5月11日,我决定搭建一个自己的网站。之前在CSDN、博客园、知乎上边零零散散写过几篇博客,但是感觉很散,不够集中也不够专注,在做毕设的时候发现一个老哥的个人博客很有特色,因而转念搭建一个自己的博客。搭建这个博客大概有以下几个目的:
整理汇总之前写过的博客:airplane:
记录以后的学习内容:books:
拥有个人博客应该是一件很酷的事情吧:smile_cat: