有了孩子之后,精力确实有限。珍惜现在的所有的所谓的悠闲时光吧。
之前在妇幼医院看过电梯,上面写着:
层层都停,
单层停靠,
双层停靠,
1-8层停靠,
医院人多满载后就不开门了。
还有我们经常见的高层电梯,低层电梯。
我就想闲下来的时候写个电梯控制的小程序。弥补一下空虚的心灵。
夜深人静的晚上我就在想,如果让我写我会怎么写?
客户端(也就是各个楼梯层上的上下按钮)发送指令?
总控中心入队指令?控制电梯运行?
如果是4部电梯,采用什么算法来控制电梯?
如果睡眠时,电梯停在哪里?
我想:
- 设计顶层一部,一楼一部,其他的都停靠在中间层?
- 还是说,都全部停靠在同一楼层?
- 还是说,运行到那个楼层就在哪里停靠?
- 为什么我按下了5楼,从16层下来比较快的电梯不拉我?从14层下来比较慢的电梯才拉我?
思考过了这个问题,果断搜索一下电梯运行算法,看到是电梯运行类似于都写算法。继续搜索硬盘读写算法:
一、硬盘调度算法
硬盘的读写算法,主要是分为4类演进:
1、先来先服务算法(FCFS):
这个也是最容易想到最简单的算法,一个队列接收命令,先进先出原则进行读写处理。
我们也知道硬盘读写需要寻道,这种简单暴力的算法,对寻道没有优化,致使响应时间过长。
2、最短寻道时间优先算法(SSTF):
为了解决寻道算法,那我每次都处理离我最近的指令就行了,这样寻道最短,时间也就最短,我可以很快滴给出相应。
如果请求并发较大,我可能对离我较远的指令处理不及时甚至很长时间才能给出相应。
因为我们需要很长时间在一个地方将请求处理完才能移动到下个位置。
3、扫描算法(SCAN):
那我既要兼顾寻道最短,还要尽量避免磁头方向的转换,造成的饥饿现象的出现。
那我就按照磁头方向寻找离我最近的并且是同一方向的请求。这样一点一点向边缘移动。
这个算法和电梯调度算法类似,所以可以称之为电梯算法。
如果我从中间的请求开始处理,磁头一次一次向外边缘推进来处理请求。当我到达最外边缘时,磁头调转方向向内边缘进攻。
这里的问题是,里我身后越近请求越少,因为我刚刚处理过。极有可能是理我较远的磁道有请求指令的概率比较大数量比较多。
根据正态分布规律,落在中间的概率大于落在两端的概率。这样还是会出现两边请求处理不及时的问题。
4、循环扫描算法(CSCAN):
根据以上问题,我们进行优化,磁头的处理方向只能是一个方向,比如从里到外运行。
当我到达最外边缘的磁道,我掉头返回到最里面的磁道,然后还是向外处理请求。
请求命令一直是从小到大排序让最小的磁道紧挨着最大磁道,这样就会磁头从里到外循环处理。既保证了寻道最短,也确保了请求处理的及时。
看到硬盘的读写算法,之前对硬盘的读写原理比较模糊,也是比较好奇硬盘怎么就能将数据写到磁盘上,并进行读取的?那就再看看硬盘是怎么读写的。
二、硬盘组成
说到硬盘,硬件了嘛,先看看硬盘的组成,看图:
盘片、磁头、盘片主轴、控制电机、磁头控制器、数据转换器、接口、缓存
看到这,我带着一些疑问打算再深入了解一下这些构造:
总的来说,磁盘上有很多的磁柱,磁柱上有很多的磁道,磁道上划分了很多的扇区。
盘片:每个盘片都有一个读写磁头,因为N个盘片两面都可以读写数据,所以就有2N个盘面,2N个磁头。
磁头由上到下从0开始编号,当然也对应着对应的盘面编号。现在我们有盘面编号了。
磁柱:所有盘面的同一磁道形成的圆柱。
磁道:以主轴马达为中心,碟片上的同心圆环。最外侧磁道是0,最里侧的是磁头归位不存储数据。
Q:磁道为什么最外侧是0号而不是最内侧为0?
A:因为当时老式磁盘设计每个磁道上的磁区是一样的,也就是说里侧的数据分布密度大,外侧的数据分布密度小,密度小数据相对来说安全。
定位0磁道:就是磁头梦开始和梦结束的地方,读取数据读取完毕磁头休息的地方。
物理0磁道:0柱面,0磁道,1扇区。这个厉害了,物理0磁道只是一个扇区,它是磁盘的第一个物理扇区,也就是第一个物理地址。
那么它来干什么呢?MBR引导程序和分区表信息都存储在这。硬盘低级格式化从这开始。
逻辑0磁道:硬盘的第一个逻辑扇区,一般在0柱面,1磁头,1磁道,系统读写时的第一个扇区。硬盘高级格式化从这开始。
Q:什么是低级格式化?什么是高级格式化?
A:低级格式化就是硬盘厂商将空白的磁盘划分出柱面和磁道,再将磁道划分为若干个扇区,每个扇区又划分出标识部分ID、间隔区GAP和数据区 DATA等。
高级格式化就是清除硬盘上的数据、生成引导区信息、初始化FAT表、标注逻辑坏道等。比如重装系统分区,比如手动格式化分区。
扇区:一小段磁道弧线,每个磁区一般会携带0.5KB数据。扇区是磁盘中最小的物理存储单位。
Q:为什么每个扇区是0.5KB?
A:现在硬盘厂商会提供4k大小扇区
老式是512bit,新式为了扩大容量是4096bit(4KB),但是为了兼容系统,将4KB模拟成8个512bit.
磁盘块: 操作系统中最小的逻辑存储单位。windows上叫簇,linux叫块。将几个相邻的扇区合并一起组成逻辑磁盘块,便于操作系统管理扇区和硬盘寻址。
磁盘块是文件系统操作文件的基本单位。扇区是硬盘基本单位。
因为存在逻辑存储单位和物理存储单位的映射,所以磁头控制器另一个功能是负责两者的映射关系。
4K对齐:之前是512,需要物理扇区和逻辑块进行映射关系。
对于现在的4KB硬盘,以windows为例,NTFS文件系统的默认逻辑分区是4KB(比武我们格式化硬盘,会有文件系统和默认分配单元大小)
这样物理扇区和逻辑块一一对应,可以加快硬盘的读取速度。
操作系统经常与内存和硬盘这两种存储设备进行通信,类似于“块”的一种虚拟的基本单位。内存操作--页;硬盘--块。
三、硬盘读写原理
写数据:
系统将文件存储到磁盘上时,按柱面、磁头、扇区的方式进行,即最先是第0磁道的第一磁头下的所有扇区。
然后,是同一柱面的下一磁头,……,一个柱面存储满后就推进到下一个柱面,直到把文件内容全部写入磁盘。
按照柱面来写数据,电子控制磁头,写到下一柱面才会有机械控制磁头。减少了频繁寻道时间。
读取数据:
根据文件存储的 三维坐标:柱面、磁头和扇区确认数据的起始位置。磁头控制器选择对应的磁头步进到相应的柱面上,然后等待旋转过来的对应的磁区。
校验坐标,根据读写标识转换电极,进行相应的读取操作。
局部性原理和数据预读取:
这里主要指的是空间局部性原理,思想是与数据相邻的数据用到的概率比较大,所以读取数据时会将此数据的一定的相邻数据一并都取出来,也就是数据预读取。
原文地址:https://www.cnblogs.com/sunchong/p/9167203.html