电梯引发的思考

有了孩子之后,精力确实有限。珍惜现在的所有的所谓的悠闲时光吧。

之前在妇幼医院看过电梯,上面写着:

  层层都停,

单层停靠,

双层停靠,

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

时间: 2024-10-26 05:10:29

电梯引发的思考的相关文章

曲演杂坛--一条DELETE引发的思考

原文:曲演杂坛--一条DELETE引发的思考 场景介绍: 我们有一张表,专门用来生成自增ID供业务使用,表结构如下: CREATE TABLE TB001 ( ID INT IDENTITY(1,1) PRIMARY KEY, DT DATETIME ) 每次业务想要获取一个新ID,就执行以下SQL: INSERT INTO TB001(DT) SELECT GETDATE(); SELECT @@IDENTITY 由于这些数据只需保留最近一天的数据,因此建立一个SQL作业来定期删除数据,删除脚

一次部署HTTPS的相关事件引发的思考

前言: 上周五快要下班的时候,突然收到通知客户希望了解一下部署HTTPS的流程,这种事情谁听了都会有几分诧异的.因为这件事虽然和工作有一定的相关度,但平时不会走这个方向,实际上也较少接触.此外,客户手下应该不缺人,做运维和开发的肯定比我更懂这个,但情况却和我想的不一样. 正文: 客户有需求,就应该尽量满足!因此,尽管之前对Apache.Tomcat的一些配置不熟,也未有过自己部署HTTPS的经验[当然失败的尝试还是有的],便趁着周末了解了一下相关的东西,在本地搭建了环境.实践表明,当你对一个东西

UPDATE 时主键冲突引发的思考【转】

假设有一个表,结构如下: root@localhost : yayun 22:59:43> create table t1 ( -> id int unsigned not null auto_increment, -> id2 int unsigned not null default '0', -> primary key (id) -> )engine=myisam; Query OK, 0 rows affected (0.00 sec) root@localhost

Navicat连接mysql出现2003——can't connect to mysql server on localhost(10061)引发的思考)

一:起因 (0)最近由于病了一场,闲暇时间(即生病期间)一直思考如下问题: 思考一:如何做一名合格的程序猿,怎么才能成为一名名副其实的程序猿? 思考二:还有就是到底,值不值得熬夜加班去搞研发(或转型或做相对轻松的其它IT岗位~~~对于这个问题,我一时无法给出答案,希望各位帮我分析一下,不胜感激!!!) (1)如果没有做到这一点你怎么能说,你是一名合格的程序猿 —— 安装程序或者运行开发程序... http://d.dxy.cn/detail/7870458http://d.dxy.cn/deta

黑马程序员---Objective-C基础学习---一道课后习题引发的思考

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一道课后习题引发的思考 /* 需求:设计一个类Point2D,用来表示二维平面中某个点 1> 属性 * double x * double y 2> 方法 * 属性相应的set和get方法 * 设计一个对象方法同时设置x和y * 设计一个对象方法计算跟其他点的距离 * 设计一个类方法计算两个点之间的距离 3> 提示 * C语言的math.h中有个函数:double pow(double

一个截取字符串函数引发的思考

背景 前些天,遇到这样一个问题,问题的内容如下: 要求编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串.但是要保证汉字不被截半个,如"我ABC", 4,截取后的效果应该为"我AB",输入"我ABC汉DEF", 6,应该输出为"我ABC",而不是"我ABC+汉的半个". 问题 刚看到这个问题的时候,以为还是很简单的,但写出来之后,发现并不是想要的效果.回想一下当时的思路,就发现刚开

【ROC曲线】关于ROC曲线、PR曲线对于不平衡样本的不敏感性分析说引发的思考

ROC曲线 在网上有很多地方都有说ROC曲线对于正负样本比例不敏感,即正负样本比例的变化不会改变ROC曲线.但是对于PR曲线就不一样了.PR曲线会随着正负样本比例的变化而变化.但是没有一个有十分具体和严谨地对此做出过分析和论证(至少我没有找到). 此处记为结论1: 结论1:PR曲线会随着正负样本比例的变化而变化:但是ROC曲线不会. 此处我就这一问题进行了详细的分析论证,并在这个过程中引发了很多思考. 首先,如何分析这个问题呢? 看下ROC曲线是由TPR和FPR组成的 下面我们这样来分析这个问题

《技术、沟通、协作,引发的思考》

<技术.沟通.协作,引发的思考> 01. 有些朋友私信问我,最近又在忙什么,很少看到我活跃了.其实,我在憋大招!我花了很多心思在项目上, 可以说,这是我工作以来,最重要的时刻,成败在此一举! 02. 我按着倒序来表述,也能谈谈我对于文章主题的思考.接下来的两周时间,我会与我的项目小团队,完美的与"理财运营中心"(我在互联网金融行业)实现功能联调测试.上线以后,整个公司理财营销业务的20%~50%的用户流量将正式走我们所开发的"智能营销体系(这是一个大数据挖掘应用的

由 &#39;&#39; in &#39;abc&#39; return True 引发的思考----Python 成员测试操作

最近遇到判断字典中是否存在空字符串'',这个很好判断,直接用:'' in ['a','b','c'],就可以直接判断出来:但是当我对字符串使用 "in" 方法进行判断的时候,发现:'' in 'abc' 仍然会返回True,对于这个问题,之前一直没有注意到过其中的原理,现在去进行探索总结一下: 首先,查看官方文档:https://docs.python.org/2/reference/expressions.html#not-in 文档在5.9.2中:Membership test o