我是一块硬盘(上)

我知道CPU和内存是计算机的核心, 毕竟所有的运算最后都得通过他们俩来完成, CPU从内存里要取一条指令, 做计算,然后再写回内存, 如此周而复始。


但是这俩货却瞧不起我,说这是什么年代了,还在用机械式操作, 读写数据的时候, 还得一个磁头在多个盘片上滑来滑去,找来找去, 速度慢的要死。


0?wx_fmt=jpeg

内存说:“CPU比我快100倍, 比你快100万倍,整个系统的速度都被你给拖慢了。”


这是典型的五十步笑百步。


他俩还嘲笑我很娇气,得真空、密闭、不能有浮尘、运行时不能震动, 一动就坏了。


但这俩二货总是会忘记他俩的最大问题,所以我只用一句就把他们俩给噎死: 你们俩断电了怎么办?


还有我的容量都是按TB, 甚至PB 来算的, 就你们俩那点容量,还笑我?


还有,没有我来存储程序,你们从哪儿得到程序, 难道要像牵牛星(如下图)一样, 手工拨动一排开关来输入程序吗?

0?wx_fmt=jpeg

其实我也很纳闷,  为什么你们人类造不出来一个能够断电存储的, 大容量的访问速度快的,当然还要便宜的硬盘来 ,你们不都上天了吗?要登陆火星了吗? 这些基础的材料怎么还无法突破?


我憧憬着这么一天的来临, 如果能制造出来了, CPU就可以直接访问硬盘了, 内存就一边凉快去吧。


在制造出来之前, 你们必须得容忍CPU-内存-硬盘之间的速度不匹配, 并且想出办法来解决这种速度的不匹配, 比如用缓存、 直接内存访问、 多进程/线程切换等等方法。

内部结构

其实我的内部是长这个样子的:

0?wx_fmt=jpeg

看到没有,我有很多个盘片像串糖葫芦一样被串在一个主轴上, 主轴带着他们疯狂的旋转。 


每个盘片都有很多一圈一圈的磁道, 每个磁道又分为一个一个的扇区。


多个盘片上的同一位置的磁道组成了一个柱面 (需要发挥一下你的想象力)


最后每个盘片上都有可以读写数据的磁头。

所以,如果你想访问我的数据,可以说: 把0柱面, 0磁头, 1扇区的数据给我拿来。 


我就把磁头挪到您指定的柱面,对每个磁盘来讲其实就是指定的磁道, 所以这叫“寻道时间


然后再旋转磁盘,让磁头指向您指定的扇区,这才能开始读取数据, 这叫“旋转时间”,转速快的硬盘能更快的旋转到特定扇区, 所以性能会更好些。


文件

当然,对于绝大部分人来说,都不想去了解什么柱面,磁头,扇区这些非人的术语,所以我为懒人们专门提供了一个叫做逻辑块的方式,你看到磁盘就是有一个个“块”组成的,编号为1, 2, 3, ..n 。


想取哪一块就取哪一块, 比如你说:把第1024号的“块" 的数据给我取过来, 我在内部就把1024转化成柱面,磁头,扇区, 按照上面说的方法寻道,旋转,读取数据。


但是这还远远不够,比方说你想写个文档,输入了很多字和图片,最后想存到我这个硬盘上,你该怎么操作?


一种方法是这样的:

: 硬盘,给我找20个空闲的磁盘块, 我想存我的文档


:空闲的磁盘块编号是1024, 2048, 2049 ,3000 ,......


: 把这些文字和图片存到这些磁盘块上


: 好的,存完了, 你得记住这些块啊, 这样下次才能读取。


: 拿一支笔把这些磁盘块编号都记到本子上


过了几天......


: 硬盘, 把1024,2048,2049,3000这些数据给我取出来,我要编辑。


: 好的,这是你的数据


没有人喜欢这种方式, 太折磨人了!每个人喜欢这么做:   

打开word -> 新建一个文件-> 输入文字和图片-> 保存到C盘“我的文档”目录下。


这个所谓的“文件”和“目录”就是我的杰作啊,你再也不需要和烦人的磁盘块打交道, 只需要记住你的文件名和路径, 一切工作交由我和操作系统老大来搞定。


我和老大商量好了,文件对人类来说是最小存储单位, 你想存任何东西,无论多么小,非得建个文件不可。


此外为了让这个世界整洁有序, 多个文件可以放到一个目录(其实也是个特殊的文件)里, 目录之上还可以有目录,形成一个树的结构。


文件这个东西是个伟大的发明, 我估计你们还得再用100年。

文件的存放

我日常的主要工作就是对目录和文件做操作,当然需要操作系统老大的配合,好吧,其实是老大在主导。


这其中最重要的一个问题怎么去记录各个文件都用到哪些磁盘块?


内存给我支了一招:你可以采用连续记录的方式啊, 就像这样。

0?wx_fmt=png

文件1 占据磁盘块 1-3

文件2 占据磁盘块 8-12

文件3 占据磁盘块 15-20


内存说: 这种方法在随机访问文件是效率极好,因为你只要知道了开头和长度,就像数组一样可以随便访问, 就像CPU访问我一样, 只要给出地址,立刻就能定位到指定的位置。


我仔细想了想, 内存出的是一个损招, 比如说内存磁盘块 4 -7 ,以及13-14怎么没用?  


那是因为之前那里也有文件,后来被删除了,留下了空洞, 如果之后没有大小合适的文件过来,他们就永远空在那里了。


对我来说这是严重的浪费, 这是我不能容忍的。 


我说:“小样你以为我看不出来啊,你不就是嫉妒我容量大,让我浪费一点嘛”


内存坏笑了一下又说: 不喜欢也没关系嘛,试试采用链式啊:


0?wx_fmt=png

这个文件从第一块磁盘开始,形成一个链 1->9->18->8->3   , 每一块空闲的磁盘都会得到充分的利用, 效率非常高。


我心想: 这些码农说的数据结构和算法还真是有用啊, 这里也用上链表了。


可是这种方式随机的访问效果太差, 每次都得从第一块开始,沿着绳子往后找,太痛苦了。


现在内存已经嘲笑我慢了,用这种很慢的办法,还不得笑死我?


操作系统老大说:“别听内存在那里BB了, 用索引式!”

0?wx_fmt=png

例如第16号磁盘块专门用来存放文件属性以及该文件所使用的磁盘块。


老大把这个磁盘块叫做inode,通过它可以轻松的找到这个文件所使用的所有磁盘块, 无论是顺序访问还是随机访问都很快。


唯一的缺点是得用额外的磁盘块单独存放inode 。


我觉得挺好,没有十全十美的东西,折中达到平衡最重要 ! 就是它了!


(未完待续)


你看到的只是冰山一角, 更多精彩文章,尽在“码农翻身” 微信公众号, 回复消息"m"或"目录" 查看更多文章


有心得想和大家分享? 欢迎投稿 ! 我的联系方式:微信:liuxinlehan  QQ: 14703250


0?wx_fmt=jpeg

公众号:码农翻身

“码农翻身”公众号由工作15年的前IBM架构师创建,分享编程和职场的经验教训。

推荐一个叫掘金的开发者社区,很多技术干货,  我的文章也会在这里分享 : 

掘金是一个高质量的技术社区,从 Swift 到 React Native,性能优化到开源类库,让你不错过互联网开发的每一个技术干货。长按图片二维码识别或者各大应用市场搜索「掘金」,技术干货尽在掌握中。

0?wx_fmt=gif

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux中挂载一块硬盘的步骤如下: 1. 首先,使用命令`lsblk`查看磁盘信息,确认要挂载的硬盘的设备名称,比如sdb。 2. 使用命令`fdisk /dev/sdb`对硬盘进行分区。在fdisk命令行界面中,可以使用n命令创建一个新分区,选择分区类型和大小,然后使用w命令保存并退出。 3. 使用命令`mkfs -t ext4 /dev/sdb1`将分区格式化为ext4文件系统。 4. 创建一个目录作为挂载点,比如`sudo mkdir /mnt/mydisk`。 5. 使用命令`sudo mount /dev/sdb1 /mnt/mydisk`将分区挂载到指定的目录。 6. 使用命令`df -h`检查挂载情况,确认硬盘已经成功挂载。 请注意,以上步骤假设你要挂载的硬盘设备名称为sdb,并且你要将其分区为sdb1。具体的设备名称和分区号可能会有所不同,请根据实际情况进行调整。\[1\] #### 引用[.reference_title] - *1* *3* [Linux挂载(增加一块硬盘)](https://blog.csdn.net/czhloveca/article/details/104290993)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [linux下,如何挂载一块硬盘?](https://blog.csdn.net/chenlongjs/article/details/80641060)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值