什么都无所谓只想在你身边,什么都无所谓只想和你说话,什么都无所谓所以请你不要逃避。 每日签到 收藏本站
登陆 / 注册 搜索

USERCENTER


查看:4468   回复: 4

一块硬盘的自述

[复制链接]
发新帖
跳转到指定楼层
楼主
仗剑天涯吾是土豪 发表于 2017-6-27 22:54:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

今生相逢便是缘分,何苦去怨恨,何苦去仇视。

        我是一个非常精密的存储介质,虽然具有坚固冰冷的外表,让人有种冷酷到底的感觉,但是你们却不知道我的内心是非常脆弱的~
" n3 J/ U, W8 f) R. e" k$ M, @* I        
, g: q) U+ @. E% ~% y4 k        我知道CPU和内存是计算机的核心,毕竟所有的运算最后都得通过他们俩来完成,CPU从内存里要取一条指令,做计算,然后再写回内存,如此周而复始。
% I0 Y( j+ I4 C3 _: \3 X' m, z- o; d% E6 |$ y. ^
        但是这俩货却瞧不起我,说这是什么年代了,还在用机械式操作,读写数据的时候,还得一个磁头在多个盘片上滑来滑去,找来找去,速度慢的要死。& S6 j1 D- h9 F6 |) o8 d$ N

* ?1 L7 i: F  C+ P3 N# G' b8 ~3 [* i- r# I
 GriffWason_GenericHardDrive_exploded01.jpg 一块硬盘的自述

- v4 q+ [5 x0 G7 Y8 I        内存说:“CPU比我快100倍,比你快100万倍,整个系统的速度都被你给拖慢了。”#j318:
7 O  _. ]: E$ |; o5 p
; R2 k! K( h8 m) i4 U- h: {* N        他俩还嘲笑我很娇气,得真空、密闭、不能有浮尘、运行时不能震动,一动就坏了。但这俩二货总是会忘记他俩的最大问题,所以我只用一句就把他们俩给噎死:你们俩断电了怎么办?
& }' l" |# U' }$ I) x3 B9 a7 k! M8 ]/ x' b
        还有我的容量都是按TB,甚至PB来算的,就你们俩那点容量,还笑我?还有,没有我来存储程序,你们从哪儿得到程序,难道要像牵牛星(如下图)一样,手工拨动一排开关来输入程序吗?) r  C' N0 F% m* Z" `+ n

6 D: Z  R2 g* |! D. E8 i# s8 _) T: S
 W020150927433549562851.jpg 一块硬盘的自述
# u- M& |- t5 h( j
        其实我也很纳闷,为什么你们人类造不出来一个能够断电存储的,大容量的,访问速度快的,当然还要便宜的硬盘来,你们不都上天了吗?要登陆火星了吗?这些基础的材料怎么还无法突破?#j331:
9 c# `* O3 c4 ^# P
! l% Z& A8 q3 ]3 O  h9 a1 r& Z9 o  y        我憧憬着这么一天的来临,如果能制造出来了,CPU就可以直接访问硬盘了,内存就一边凉快去吧。, P3 B. k1 V5 J' Q& {  U+ _
; j# L6 k* a7 [. U/ I& Z) B
        在制造出来之前,你们必须得容忍CPU-内存-硬盘之间的速度不匹配,并且想出办法来解决这种速度的不匹配,比如用缓存、直接内存访问、多进程/线程切换等等方法。" u* n7 N4 \# {3 n
        
9 W$ w. a+ I( ?, }& p% Q- C
我 的 内 部 结 构
# s) r% b9 P0 ]0 s9 r1 e, C0 c: ~( ]
 硬盘内部.jpg 一块硬盘的自述
- z1 m3 e! p0 p  J. k  P

8 U2 T) I( L, Z; I7 w3 Z        看到没有,我有很多个盘片像串糖葫芦一样被串在一个主轴上,主轴带着他们疯狂的旋转。6 t' ]1 s& g! J8 F) [
% I$ P% l0 t1 ]2 \: P1 x+ }! a% d
        每个盘片都有很多一圈一圈的磁道,每个磁道又分为一个一个的扇区。
# B. L0 ^1 E4 s; R  f
/ j# y; H" Y% C        多个盘片上的同一位置的磁道组成了一个柱面(需要发挥一下你的想象力)# i6 H* Y: h0 n  e7 J: B$ |- E& v
! |* v( t8 ~0 A% U
        最后每个盘片上都有可以读写数据的磁头。4 d* t9 S1 Y' G
        ! b" p2 d! }3 Z! E+ [9 J5 [, `
        所以,如果你想访问我的数据,可以说:把0柱面,0磁头,1扇区的数据给我拿来。! k" V6 L% H9 t* }) a, z
6 c: \7 n* r- c! I
        我就把磁头挪到您指定的柱面,对每个磁盘来讲其实就是指定的磁道,所以这叫“寻道时间! Z% J9 H/ u8 O

+ Z  n$ h6 z) a  ~; m+ J! Z        然后再旋转磁盘,让磁头指向您指定的扇区,这才能开始读取数据,这叫“旋转时间”,转速快的硬盘能更快的旋转到特定扇区,所以性能会更好些。
# B6 U& C5 k! v9 C5 Q$ X
& Y' ~7 H1 w2 `8 b5 b# |$ m" F
什 么 是 文 件
( T( P# r( `4 H( U. ?9 u
        8 |3 [% J( y2 T% S7 x' d. T) S
        当然,对于绝大部分人来说,都不想去了解什么柱面磁头扇区这些非人的术语,所以我为懒人们专门提供了一个叫做逻辑块的方式,你看到磁盘就是有一个个“块”组成的,编号为1,2,3,..n。
$ M# L- J( S9 j4 D* x4 s0 T. A' J# F+ z  t$ {3 ^% @
        想取哪一块就取哪一块,比如你说:把第1024号的“块"的数据给我取过来,我在内部就把1024转化成柱面,磁头,扇区,按照上面说的方法寻道,旋转,读取数据。( V4 a" D$ o" {" w$ y9 A) @
$ x7 z8 n% S4 K; z5 V
        但是这还远远不够,比方说你想写个文档,输入了很多字和图片,最后想存到我这个硬盘上,你该怎么操作?#j321:
3 b# ?! @' b" ~  }+ {3 r- Q6 a( N1 W5 G8 e2 b7 k1 n( H" D
        一种方法是这样的:
& t' P+ E* k/ {3 B        
3 Q4 k1 }8 P( @: w. {        你:硬盘,给我找20个空闲的磁盘块,我想存我的文档。
& J, P! G  b* D$ g8 ]0 f; q; O7 \
        我:空闲的磁盘块编号是1024,2048,2049,3000,......0 q5 h8 q( [/ D5 c6 j9 |

8 R: |/ m! n$ Z9 B) `        你:把这些文字和图片存到这些磁盘块上。5 Z* |. |% |- d- K
4 u$ n7 ^, G- G' e
        我:好的,存完了,你得记住这些块啊,这样下次才能读取。
7 g4 @# L& S6 M# N/ c  E6 _
' i+ u7 G/ B: ^* h7 f        你:拿一支笔把这些磁盘块编号都记到本子上。
; E4 A/ f6 x1 y# [" i) v7 s
% X2 H/ M2 ^  U- `        过了几天......
& p2 E8 |1 r' r' _- s
' X2 F" s- J# a  _  W) b        你:硬盘,把1024,2048,2049,3000这些数据给我取出来,我要编辑。; i. ^4 o) l5 o, O

2 I+ f: f, s4 k! n        我:好的,这是你的数据。/ M# ?* F; ^" i8 C) u/ w" c
" e. {9 ^- ^/ y
        没有人喜欢这种方式,太折磨人了!
( q& J) u' v( _; c* O, x/ [4 ~
       所以你们更喜欢这么做:; w7 O. k# `- s2 ~: k& D
        ( x7 p& H" H! N
        打开word->新建一个文件->输入文字和图片->保存到:D盘\我的文档 目录下。
$ E3 `) ^2 e$ ~6 ?0 o$ f0 a+ w* n* t
        这个所谓的“文件”和“目录”就是我的杰作啊,你再也不需要和烦人的磁盘块打交道,只需要记住你的文件名和路径,一切工作交由我和操作系统老大来搞定。
( u% ~7 O2 n% H, {" m  `& B8 y8 R$ c2 G/ h, S& V
        我和老大商量好了,文件对人类来说是最小存储单位,你想存任何东西,无论多么小,非得建个文件不可。/ h) Y% E& C4 t( f% w

/ Q4 I' O5 D6 |        此外为了让这个世界整洁有序,多个文件可以放到一个目录(其实也是个特殊的文件)里,目录之上还可以有目录,形成一个树的结构。9 E( L! o) `6 }4 c+ Z  p; k* g3 _

4 Q4 ^; ~5 ^- A+ j8 @        文件这个东西是个伟大的发明,我估计你们还得再用100年。#j346:
6 X- `# P6 N) N+ t: ]& F0 }) A        
3 o0 o+ A; ?: _# B
文 件 的 存 放
: o; @3 |3 z5 I1 D* T9 a

+ Y6 G3 i; u: [        我日常的主要工作就是对目录和文件做操作,当然需要操作系统老大的配合,好吧,其实是老大在主导。) p6 Y9 k7 g4 D0 a2 j, V
/ G' w) T( W. O% ?
        这其中最重要的一个问题怎么去记录各个文件都用到哪些磁盘块?
+ [* r6 X5 ?+ r
3 Q* B6 N1 @9 e' t        内存给我支了一招:你可以采用连续记录的方式啊,就像这样。0 j/ }* o+ u1 r

% p9 ^1 {- k/ G/ N
 文件的存放.png 一块硬盘的自述
% Z" z2 R0 d% Q1 \2 V

# j! z3 G6 X* T2 K- g        文件1占据磁盘块1-3
# `/ d4 Y2 t2 w9 B( M9 i        文件2占据磁盘块8-128 C6 n  m# P' C$ y; m  e% }0 ?
        文件3占据磁盘块15-20
  I5 \' V8 f* O4 K2 @
0 b' }. y1 t! u7 }
        内存说:这种方法在随机访问文件是效率极好,因为你只要知道了开头和长度,就像数组一样可以随便访问,就像CPU访问我一样,只要给出地址,立刻就能定位到指定的位置。1 Y* N  B! }! R# o( n2 O

- S/ f9 i, |1 y, d        我仔细想了想,内存出的是一个损招,比如说内存磁盘块4-7,以及13-14怎么没用?6 q% V1 G& u2 N7 _' ^) F

. k2 }0 u5 ~& b5 \0 B2 V        那是因为之前那里也有文件,后来被删除了,留下了空洞,如果之后没有大小合适的文件过来,他们就永远空在那里了。
5 Q6 j( u, j9 ?' }2 Q' ~2 [% G, c# y
        对我来说这是严重的浪费,这是我不能容忍的。
  l/ q8 z$ G9 W4 P( i- o
4 A+ v) H# k3 `3 ^        我说:“小样你以为我看不出来啊,你不就是嫉妒我容量大,让我浪费一点嘛”!: x# j  X# T- ?2 c7 B
7 j6 p( f+ E! L
        内存坏笑了一下又说:不喜欢也没关系嘛,试试采用链式啊:
0 ~. q* y! R! `# J  ~6 H8 t0 p) _+ |
' y# _+ B+ B% B% K0 Y8 }
 链式.png 一块硬盘的自述
) o; ?* C# S& o1 @( Z0 ~9 |

: L0 \' \& R' T1 L- X5 X        这个文件从第一块磁盘开始,形成一个链1->9->18->8->3,每一块空闲的磁盘都会得到充分的利用,效率非常高。7 }7 `8 e7 H- @" @* h7 _: m4 ^

+ {8 @* @; g% n6 K/ w7 u5 k        我心想:这些码农说的数据结构和算法还真是有用啊,这里也用上链表了。可是这种方式随机的访问效果太差,每次都得从第一块开始,沿着绳子往后找,太痛苦了。
3 w% c6 y8 R6 ?* F0 s
1 H- n& |+ u, Y% {/ z        现在内存已经嘲笑我慢了,用这种很慢的办法,还不得笑死我?操作系统老大说:“别听内存在那里BB了,用索引式!”
8 w- H" E, V9 Z& X5 S) W# F% C5 u* u, j0 E$ T
 索引式.png 一块硬盘的自述

$ B: x, v! g/ \7 Y
+ g" t8 d& b" [+ n% N" W        例如第16号磁盘块专门用来存放文件属性以及该文件所使用的磁盘块。$ m/ G& K7 q; v

* X. _- n7 V$ s2 z        老大把这个磁盘块叫做inode,通过它可以轻松的找到这个文件所使用的所有磁盘块,无论是顺序访问还是随机访问都很快。
' E% Q, `% a$ X3 c  Q6 A8 I; t: k+ {' O: V
        唯一的缺点是得用额外的磁盘块单独存放inode。
! x1 H2 Z$ k, z9 [3 G
" ]' J; M1 l4 q$ J6 X/ E        我觉得挺好,没有十全十美的东西,折中达到平衡最重要!就是它了!#j325:
, p, J# R; h0 l, m: K5 T: r) v1 {/ S2 |4 O4 E
        我问老大:每个文件都需要有个inode来描述,每个目录是不是也需要一个?' @2 r/ N- ?3 l  O. R5 @; n

5 I* j& A9 J8 G$ |+ |        ”这是自然,和文件一样,每个目录也是一个inode,其中有目录的属性,还有存放这个目录内容的磁盘块号,在磁盘块中才真正的存放着目录下的内容“。( Y! C; M& N# Y3 o
# q  G! ?" ]- ]) _) r
 内容.png 一块硬盘的自述

/ g7 X8 d1 z7 y8 Z% }5 A% U% D8 q% G. b: M3 c
        “举个例子来说吧:有人要读取/tmp/test.log这个文件,查找次序是这样的:根目录inode->根目录磁盘块->tmp目录inode->tmp目录磁盘块->test.log的inode->读取磁盘块”/ J% u  i$ W4 g; u
6 Z, c' Q6 Q, w/ k( t: W
 读取磁盘块.jpg 一块硬盘的自述

2 X( ?  i# R$ ^
9 t3 e/ M' K- Z4 G' w        内存说:“卧槽!这也太绕了吧,比CPU访问我的数据麻烦多了,硬盘,你要小心点,这要是操作不当的很容易出乱子的。”#j340:
/ O. ]5 O: ^; |4 P
* h! @; U7 u- X/ t$ y        我心想内存这次没坑我,他提醒的对,这操作确实有点复杂,读数据的时候还行,如果是修改,尤其是删除就很容易出事,例如想删除上面的文件/tmp/test.log,需要这些步骤:
- p; ]+ }9 h1 p2 m5 L: F        
: {0 C/ Y. W+ Y8 e5 a# C6 ?% L        (1)在目录中删除文件
2 A3 g6 [; g7 T7 g        (2)释放inode到空闲的节点池,这样可以复用
( [, a8 }$ T* o& o3 r" q( ^/ r4 p        (3)将磁盘块释放到空闲的磁盘块池

4 z+ M- y* ]; L% X3 P* _% d- q5 u# s1 S/ G2 U
        在操作某一步的时候出现系统崩溃,那我这些个目录和文件就凌乱了,可能会出现空间无法释放的情况。
, [7 y3 v' \0 A9 r  G
; d1 q& e/ h9 `! ?        系统老大说:“这确实比较烦,不过也能解决,听说过数据库是怎么办的吗:记录日志!”
; u. a; I, m; f8 ?' r/ K5 {, F+ i+ w( f$ s& b9 v# R* z
        ”就是把要做的事记录下来?“6 P8 M8 D$ A$ @/ d/ S$ y' q

" T, W7 B6 O7 E+ E9 l" w        “是的,在做操作之前,记录要做的事情,形成日志,把他们成功写入磁盘以后再正式动手操作,等到所有步骤都搞完,才可以擦除日志项。你想想,如果执行到某一步崩溃,系统重启时检查日志项,就知道哪些没做,哪些已经做了,对于没做的日志,重新来一遍就是了”。6 l* ~! B) b0 q( J( g2 E6 T2 @/ @# o- J

7 g; _+ k! ^4 M0 S9 i" x        其实说的很轻松,实施起来还是挺难的,重新执行就意味着那些操作一定是可以重复执行,并且不会带来破坏才行。
) ^; ^. W+ S" c7 ?- V3 E' X; j! Y6 L
$ t9 `/ D1 k) b5 x- k$ U# N
管 理 空 闲 块
5 F2 x* d, Q/ U( k# O  b* t" n

0 ]3 i; g* @* L9 n        目录和文件的存储问题解决了,接下来我需要一个大管家,把那些没有使用的、空白的、数量上亿的磁盘块给管理起来,只有这样,新的文件来的时候,才能分配空间存储。
4 x5 m4 Z4 v8 h
( j9 S7 v6 c0 v3 G3 `: M        操作系统老大给我推荐了两位,第一位主张是链式大法好,无非就是把空闲磁盘块组成一个链表(又是链表!),但是我心里盘算了一下:如果磁盘块号是32位的,每个块都得花费我32位的空间,如果我有5亿个空闲块,那仅仅为了记录他们就要占用接近2G的磁盘空间!这浪费可是有点大啊。
! b/ N: f. Q: `- A0 Z1 v0 G; C; A; ^+ F- S; @) j& X
        还有一位主张位图法,这个方法更简单,对每个磁盘块,如果已经被使用,那就标记为1,没被使用就是0。这样整个磁盘块就形成了一个由0和1组成的一个大位图。
6 k+ L, z3 ?: ]) x' e' N( ]' h* i# m  W2 I. K: Z+ r
 0和1.png 一块硬盘的自述

' g( U. P; R! s; T& i6 G3 u' x
. o- [6 N8 K, e4 A" Y        由于每个磁盘块只用一个位来表示,非常节省空间,这个方案我喜欢!#j327:
) o3 x' P' o- `9 p        1 T/ d  V8 A) a
文 件 系 统

! g1 l$ U7 R7 D. R- s% {2 I8 l" W5 R( S: O9 o. @
        扯了这么多,是时候看一看全局了,在你们程序员的眼中,其实我是长这个样子的(拿Linux ext2为例):) F2 d6 ?% U1 r$ v2 e

0 m1 {/ q+ j* r
 linux ext2.jpg 一块硬盘的自述
* D. f7 D1 T- k# G- A

& Z* |. O" `% T3 J7 M        我这个硬盘主要由MBR(Master Boot Record)和各个磁盘分区组成。
  [* C/ A. Y( {2 f: l$ e# Z& U) X0 f8 D1 I) ]/ I; E) F2 I
        MBR中的有引导代码和磁盘分区表,分区表中记录了每个分区的起始位置,以及哪个磁盘分区是活动分区,这样系统就会找到它,然后装载这个分区中的引导块,并执行之。- r+ k6 B, z5 p/ g4 }

2 `2 G) J9 R, O% n% g, l: `        引导块将会装载存存储在本分区的操作系统。需要注意的是,每个分区都有一个引导块,不管这个分区有没有操作系统,这是各大厂商的约定,是一种标准。
( `: J. G3 n! Z6 n0 W: Q! ]8 }5 ^  K- v% z! ^
        每个分区除了必须的引导块之外,又被分成多个块组。5 \8 U1 Y8 b! ?/ L6 ~1 p; ~) M
" a, G/ N/ d3 g9 B1 x5 T
        在每个块组中你能看到熟悉的磁盘块位图和inode位图,不用解释估计你也知道是干嘛的。还有inode表(当然是存放文件和目录的inode了)和真正的数据块。
/ e* _+ G9 v0 M. v, p, R7 v+ `
- Q& x3 R5 y5 ]2 j" G% ~3 Q        对了,我的磁盘分区表只有64个字节,而每个分区项占用16个字节,所以只能容纳4个分区。如果你想用多于4个分区,你就需要把其中一个设为扩展分区,然后在其中继续划分成逻辑分区,想划几个就划分几个。4 x3 f3 _8 i7 |8 l/ u7 i% p

5 q, E5 s1 j( t8 x' h: B        一般情况下,大家都喜欢把我划分成一个主分区+一个扩展分区,在扩展分区中再需要划分。
: ^7 J3 a/ r# L1 g8 y7 S2 [+ m' ?) w( H' h- ?) Z" y5 Y$ d; l1 U

上一篇:  一个键盘的自述

下一篇:  一个进程的自述

巴黎环抱的花海「出类拔萃」 发表于 2017-9-6 08:10:40 | 只看该作者
大师的话真如“大音希声扫阴翳”,犹如“拨开云雾见青天”,使我等网民看到了希望,看到了未来!晴天霹雳、醍醐灌顶或许不足以形容大师文章的万一;巫山行云、长江流水更难以比拟大师的文才!黄钟大吕,振聋发聩!你烛照天下,明见万里;雨露苍生,泽被万方!透过你深邃的文字,我仿佛看到了你鹰视狼顾、龙行虎步的伟岸英姿;仿佛看到了你手执如椽大笔、写天下文章的智慧神态;仿佛看见了你按剑四顾、指点江山的英武气概!
巴黎环抱的花海「出类拔萃」 发表于 2018-1-20 22:39:55 来自手机 | 只看该作者
在遇到你之前,我对人世间是否有真正的圣人是怀疑的;而现在,我终于相信了!我曾经忘情于两汉的歌赋,我曾经惊讶于李杜的诗才,我曾经流连于宋元的词曲。但现在,我才知道我有多么浅薄!楼主,你的高尚情操太让人感动了。在现在这样一个物欲横流的金钱社会里,竟然还能见到楼主这样的性情中人,无疑是我这辈子最大的幸运。让我深深感受到了人性的伟大。楼主的帖子,就好比黑暗中刺裂夜空的闪电,又好比撕开乌云的阳光.
深海里的那抹蓝「出类拔萃」 发表于 2018-1-21 10:39:27 来自手机 | 只看该作者
以前不懂 ,0 f7 r3 W: [: o' ^* C6 e
看贴总是不回 ,
2 u& o! F9 s2 @% \. n7 o) Z一直没提升等 级和增加经验 ;
( W$ r% C" ^! M现在我明白了 ,
( H4 N, V' ?& c. T4 v  `反正回贴 可以升级 ,
- Q# H$ J; J7 q) `3 F& _也可以赚经验,
- D% r5 T. V% Z- n' k. C9 _& V# ?
9 @  h( F- L+ t' R2 t) v* `
而升级又需要 经验,
' R% d$ Q  `; e+ ]' S4 {3 @, G& m' i% \1 E' m1 T4 ~
我就把这句话复制下来,
; T: Q/ W, V  z- Q1 G2 q& j- n遇贴就回 ,4 B% N* J& a1 `5 Y( [
捞经验就闪#y421:
LonelyGorge「初入古黑」 发表于 2019-3-12 21:38:27 | 只看该作者
以前不懂 ,. S# m: K; K, F, j! d% i  n4 ~1 m+ q& r/ `- W
看贴总是不回 ,3 i/ C1 y. G+ q) N7 l3 z
, v0 _* A1 H$ e一直没提升等 级和增加经验 ;$ m# h2 i. [: M! [3 a) b2 |' |! f: Z9 a, M5 h5 y! Z
现在我明白了 ,; t; M+ G4 I  D1 t: p; \; j
  ~2 r: r0 n1 j4 Q$ ^1 t6 t: C# i反正回贴 可以升级 ,  Y4 v, N6 j% l5 e) a6 ~
也可以赚经验,4 V* n* P5 l( o% T% @8 b" s2 h7 H$ T8 C: h
* f+ v! a% }6 }& ^* x# N& n# u. A4 a$ n8 z, L: Y% m' t$ y
8 w, ^1 ]" A/ `1 \' {) q5 P0 r
而升级又需要 经验,: b7 I3 r8 l. Q+ F) q2 ~
  i4 Z% E4 I' P' ?3 I# L' I8 p# v5 [" }+ c8 V: Z( A
我就把这句话复制下来,2 W6 l2 O8 n6 x# Q! g1 U4 _& M/ G, i+ W4 b! I8 C  M
遇贴就回 ,
+ Y0 E. ~2 `: A捞经验就闪#y421:
  收起(1)
您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则

关于我们|小黑屋|手机版|Archiver|古黑论

GMT+8, 2019-8-26 12:43 , Processed in 0.086666 second(s), 33 queries , Gzip On, Redis On.

© 2015-2019 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表