我的终点,与幸福同在。 收藏本站
登陆 / 注册 搜索

阅读: 5.8K   回复: 4

一块硬盘的自述

仗剑天涯论坛大牛 2017-6-27 22:54 |显示全部楼层

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

主题破百
        我是一个非常精密的存储介质,虽然具有坚固冰冷的外表,让人有种冷酷到底的感觉,但是你们却不知道我的内心是非常脆弱的~
2 V+ o4 [+ e8 I. j, {        
' r9 E' ^3 D: p& w# B4 H) d6 Z        我知道CPU和内存是计算机的核心,毕竟所有的运算最后都得通过他们俩来完成,CPU从内存里要取一条指令,做计算,然后再写回内存,如此周而复始。
0 j# I. z+ w' J/ I4 h
& \+ J9 M. M3 q& Q$ W8 g        但是这俩货却瞧不起我,说这是什么年代了,还在用机械式操作,读写数据的时候,还得一个磁头在多个盘片上滑来滑去,找来找去,速度慢的要死。
7 q1 Z/ a: o5 W. C' V! z( D  P9 o9 K0 V& a0 e2 b9 O% A9 ~
一块硬盘的自述 GriffWason_GenericHardDrive_exploded01.jpg

. S% O: X/ G* b        内存说:“CPU比我快100倍,比你快100万倍,整个系统的速度都被你给拖慢了。”#j318:
( i' H" S. f# @( [0 c0 }  [, T4 p: e  o: v: C
        他俩还嘲笑我很娇气,得真空、密闭、不能有浮尘、运行时不能震动,一动就坏了。但这俩二货总是会忘记他俩的最大问题,所以我只用一句就把他们俩给噎死:你们俩断电了怎么办?
* V" Y( A6 Y& z6 R" D
' o7 s3 X8 v6 G0 ]4 Z        还有我的容量都是按TB,甚至PB来算的,就你们俩那点容量,还笑我?还有,没有我来存储程序,你们从哪儿得到程序,难道要像牵牛星(如下图)一样,手工拨动一排开关来输入程序吗?! m1 m5 F* E, }5 D
- a+ b( b0 W+ @1 b( p
一块硬盘的自述 W020150927433549562851.jpg

* I2 n4 w' a. M. a        其实我也很纳闷,为什么你们人类造不出来一个能够断电存储的,大容量的,访问速度快的,当然还要便宜的硬盘来,你们不都上天了吗?要登陆火星了吗?这些基础的材料怎么还无法突破?#j331:+ [5 M+ P6 ]5 n
7 A# R* P) n# F' R' V
        我憧憬着这么一天的来临,如果能制造出来了,CPU就可以直接访问硬盘了,内存就一边凉快去吧。' Z+ C2 ^  P8 U" w8 a  x
. |1 n) S8 I$ ?+ R
        在制造出来之前,你们必须得容忍CPU-内存-硬盘之间的速度不匹配,并且想出办法来解决这种速度的不匹配,比如用缓存、直接内存访问、多进程/线程切换等等方法。# H4 ?' x' P) _
          A1 r3 [. ]! V% d8 W
我 的 内 部 结 构
/ s, Y# A: B7 v+ H4 b  V
一块硬盘的自述 硬盘内部.jpg

/ p. w9 G2 j) }9 E! N0 l
$ B, E0 l6 ]' N3 R        看到没有,我有很多个盘片像串糖葫芦一样被串在一个主轴上,主轴带着他们疯狂的旋转。- H/ C; K: z5 W/ S
. ~7 G+ N* M* p6 ~; h7 v
        每个盘片都有很多一圈一圈的磁道,每个磁道又分为一个一个的扇区。2 Z8 a) J: ^! G0 d* x

- E2 N5 y' c& a; `, x0 {        多个盘片上的同一位置的磁道组成了一个柱面(需要发挥一下你的想象力)
: r1 Q- \  H. U8 a% j" k& I8 ?- Q7 E9 [$ a
        最后每个盘片上都有可以读写数据的磁头。# E0 l/ s. P7 ^# r
          J. Z: f' }. q) B! l: d9 v8 ?
        所以,如果你想访问我的数据,可以说:把0柱面,0磁头,1扇区的数据给我拿来。
; h: L6 m& k$ T' C
! O2 ]+ W2 L5 j1 w/ p        我就把磁头挪到您指定的柱面,对每个磁盘来讲其实就是指定的磁道,所以这叫“寻道时间" p& y, Y/ m" u9 g$ P9 a4 S

- K9 x4 n, V: X2 G        然后再旋转磁盘,让磁头指向您指定的扇区,这才能开始读取数据,这叫“旋转时间”,转速快的硬盘能更快的旋转到特定扇区,所以性能会更好些。
8 O" v2 z& c" u1 q  d8 J( d/ L! s+ U
什 么 是 文 件
$ j9 h4 Z% H; u8 o/ S+ q$ y
        ; H' _; y/ Q0 Z2 l* M9 j, s
        当然,对于绝大部分人来说,都不想去了解什么柱面磁头扇区这些非人的术语,所以我为懒人们专门提供了一个叫做逻辑块的方式,你看到磁盘就是有一个个“块”组成的,编号为1,2,3,..n。
$ l6 x0 ^* H' J$ E( {/ [9 L0 W, a: f' l) F' q
        想取哪一块就取哪一块,比如你说:把第1024号的“块"的数据给我取过来,我在内部就把1024转化成柱面,磁头,扇区,按照上面说的方法寻道,旋转,读取数据。5 K7 @6 N/ q0 i; F1 |/ L0 y; K2 K# [
- M" y3 l$ q& k- w! ]
        但是这还远远不够,比方说你想写个文档,输入了很多字和图片,最后想存到我这个硬盘上,你该怎么操作?#j321:3 F2 }$ ]8 r7 }% n: ]
( V  V7 B/ R) u# F+ R
        一种方法是这样的:# J2 f( [* n( B0 J
        5 p4 B$ N  Q# R. B, [! K
        你:硬盘,给我找20个空闲的磁盘块,我想存我的文档。* ?5 u( ]: f  H; x8 D& {

( d3 Y- l& f( t2 i        我:空闲的磁盘块编号是1024,2048,2049,3000,......
) e- ~6 k# J" ^; U1 R$ l) k
4 \8 ~+ v5 [5 l4 U( O, z        你:把这些文字和图片存到这些磁盘块上。$ ^8 G. ^7 |' A' R/ j

, G5 R2 q( g8 [7 x" A2 W        我:好的,存完了,你得记住这些块啊,这样下次才能读取。; N$ e2 N: q" }' w+ r
$ O/ d' ~0 f) v3 Z% y8 N
        你:拿一支笔把这些磁盘块编号都记到本子上。
- B1 W1 f9 U. M, O+ c9 }. M
: {; ?4 ?' U9 t8 n' l4 O5 [        过了几天......* E+ I' x% W' y; |

4 Q/ f0 c% O& v        你:硬盘,把1024,2048,2049,3000这些数据给我取出来,我要编辑。
  U& w  c, ^1 I2 y" g$ A- c. ~8 O, q) U. q) F, T9 n* M
        我:好的,这是你的数据。
% M' J; C' ?, \( o- I' ]3 }- D+ U6 `: k* w7 o. U. h8 W. K
        没有人喜欢这种方式,太折磨人了!
: ?* D7 `9 z( D( F$ a, S4 D9 d
       所以你们更喜欢这么做:
/ G! \& m; r' U. z/ j' g        
! _7 Q7 s( x: F0 ]  r        打开word->新建一个文件->输入文字和图片->保存到:D盘\我的文档 目录下。7 l; E6 t; p/ E4 g- @
4 r3 @, {3 V9 Q% N$ ^# ]
        这个所谓的“文件”和“目录”就是我的杰作啊,你再也不需要和烦人的磁盘块打交道,只需要记住你的文件名和路径,一切工作交由我和操作系统老大来搞定。
- w- s1 y5 z: A& z( v4 k) F" I' c( @0 W# l3 @( Z/ J3 J
        我和老大商量好了,文件对人类来说是最小存储单位,你想存任何东西,无论多么小,非得建个文件不可。) w7 q1 e4 L; }  E

; G' W. X0 W+ a' h, a        此外为了让这个世界整洁有序,多个文件可以放到一个目录(其实也是个特殊的文件)里,目录之上还可以有目录,形成一个树的结构。
. H3 A% R1 O* F) U0 x/ d7 L, ~6 Z8 D' _- {5 O4 j* y5 G
        文件这个东西是个伟大的发明,我估计你们还得再用100年。#j346:. z, @* H/ z: D; G1 ~7 N" H
        
3 i# @: S+ T! }. e/ [9 e  y9 b
文 件 的 存 放
- q3 w9 X. x* Q3 O- x: ~

1 \$ c3 Q3 U* ?+ h        我日常的主要工作就是对目录和文件做操作,当然需要操作系统老大的配合,好吧,其实是老大在主导。
( V" _9 x/ S' S3 l! |- {+ Y: i$ g  k1 y
        这其中最重要的一个问题怎么去记录各个文件都用到哪些磁盘块?
; }3 a/ Q! L% u2 _7 M! P, u' N$ s" y$ i. F; i  f9 G0 M
        内存给我支了一招:你可以采用连续记录的方式啊,就像这样。* V8 u6 l; c- w0 o2 o6 O" i4 _3 j
' Z7 a* W7 i" Q; f% R
一块硬盘的自述 文件的存放.png

) k+ I- a' v0 T0 C8 Y- w2 s
7 ~, L% k3 m0 }; f        文件1占据磁盘块1-3
" R' s- y  r8 M" y% p        文件2占据磁盘块8-12) |, u6 u/ U) }0 E9 W0 w
        文件3占据磁盘块15-20

, B! J! K% Q/ k0 K" g4 l& [0 N* d& q7 J% o2 A, y
        内存说:这种方法在随机访问文件是效率极好,因为你只要知道了开头和长度,就像数组一样可以随便访问,就像CPU访问我一样,只要给出地址,立刻就能定位到指定的位置。
4 J6 r) h1 [/ w5 v2 Y( k2 A6 E" g  Q( m6 F
        我仔细想了想,内存出的是一个损招,比如说内存磁盘块4-7,以及13-14怎么没用?
8 }8 Y) Y6 e! `* }/ u( T! d3 V2 D7 _( f* P' ^5 H( H+ H
        那是因为之前那里也有文件,后来被删除了,留下了空洞,如果之后没有大小合适的文件过来,他们就永远空在那里了。
$ w; ~, r$ q0 ^; Q8 U6 F7 ^# {- T/ [: t# j# l, R# S1 ~# U+ t
        对我来说这是严重的浪费,这是我不能容忍的。
4 J% L  b7 d9 h  _& C7 x# e
" C) R) I0 F. a        我说:“小样你以为我看不出来啊,你不就是嫉妒我容量大,让我浪费一点嘛”!: H' `7 c' Y9 X! c1 v- l! [$ Z
& ^$ U( S" a; T4 c) Q
        内存坏笑了一下又说:不喜欢也没关系嘛,试试采用链式啊:
# y6 C( m/ u+ ]' b! Q! r' e7 A' E) U( g8 W- i3 C
一块硬盘的自述 链式.png
* L2 q& h1 D) Y' V' B% A
& d* ?1 x. E  A* G( d
        这个文件从第一块磁盘开始,形成一个链1->9->18->8->3,每一块空闲的磁盘都会得到充分的利用,效率非常高。
1 Y. c2 I& Q6 n; @; a* A( V# N7 e* g
        我心想:这些码农说的数据结构和算法还真是有用啊,这里也用上链表了。可是这种方式随机的访问效果太差,每次都得从第一块开始,沿着绳子往后找,太痛苦了。
8 K( E9 Z+ j6 }+ }9 U  b* n! R! S
( z* Q) V: p( J" r7 K        现在内存已经嘲笑我慢了,用这种很慢的办法,还不得笑死我?操作系统老大说:“别听内存在那里BB了,用索引式!”  S, B( }) w! _7 s: Y

0 p! p6 ?( D- D5 z6 m( e
一块硬盘的自述 索引式.png
" @% ?( `' w" e3 R. \0 I# ~

1 g1 q5 y9 Z, U4 |3 U        例如第16号磁盘块专门用来存放文件属性以及该文件所使用的磁盘块。: a. ^% U! ~1 I$ G8 c

; M- q( J" p3 I! _! h& ]* x* u$ p  I        老大把这个磁盘块叫做inode,通过它可以轻松的找到这个文件所使用的所有磁盘块,无论是顺序访问还是随机访问都很快。
7 F5 _+ [; n( e3 R& d
4 a; C& _4 R, ^        唯一的缺点是得用额外的磁盘块单独存放inode。* J( d  b2 I& ~* c" L) {: T

- k, i% Z6 a2 g9 [        我觉得挺好,没有十全十美的东西,折中达到平衡最重要!就是它了!#j325:; z1 I4 \3 v* d7 x# t

+ L" h, p  R8 m- J8 V# {        我问老大:每个文件都需要有个inode来描述,每个目录是不是也需要一个?  q: ?) [) N+ P6 y& {+ j8 x) R

  U# e4 S0 U" n5 [3 Z; C        ”这是自然,和文件一样,每个目录也是一个inode,其中有目录的属性,还有存放这个目录内容的磁盘块号,在磁盘块中才真正的存放着目录下的内容“。' c2 n5 k1 G/ W- z2 k

2 {! Q9 F) j: p
一块硬盘的自述 内容.png
' v( _3 L' @  x* [
" z- q" B  z$ O
        “举个例子来说吧:有人要读取/tmp/test.log这个文件,查找次序是这样的:根目录inode->根目录磁盘块->tmp目录inode->tmp目录磁盘块->test.log的inode->读取磁盘块”* t! L( G7 W" p! }
- N/ h. I  N- g6 E" P
一块硬盘的自述 读取磁盘块.jpg

( Z* i1 J' `) B3 l/ V4 A+ h. p
. m% L, W! [. u: f$ w        内存说:“卧槽!这也太绕了吧,比CPU访问我的数据麻烦多了,硬盘,你要小心点,这要是操作不当的很容易出乱子的。”#j340:
, O& k- S' j! V; p: I
2 D6 w* [. P* Y3 z9 @        我心想内存这次没坑我,他提醒的对,这操作确实有点复杂,读数据的时候还行,如果是修改,尤其是删除就很容易出事,例如想删除上面的文件/tmp/test.log,需要这些步骤:
2 s" t2 H% `) z( @& z        
) |0 ^8 z( V% e        (1)在目录中删除文件/ f' x. C! @% o6 s' M
        (2)释放inode到空闲的节点池,这样可以复用
1 l5 s2 [+ x9 M" r  ~. t4 ^        (3)将磁盘块释放到空闲的磁盘块池
7 {0 H! i/ I( a8 a! f, l
4 x: }) s: U$ b2 Y- V, d
        在操作某一步的时候出现系统崩溃,那我这些个目录和文件就凌乱了,可能会出现空间无法释放的情况。$ x" x2 \+ I1 Z2 B5 ^5 P, l

) ^8 G3 J4 J, t: I( p9 E        系统老大说:“这确实比较烦,不过也能解决,听说过数据库是怎么办的吗:记录日志!”1 |* e; P. I% Y2 q

+ t  Q+ f! o9 C; d/ |* G- M. k        ”就是把要做的事记录下来?“
9 n! R: z: o! C" N( O% @
: F+ C, H0 r/ k* x% w        “是的,在做操作之前,记录要做的事情,形成日志,把他们成功写入磁盘以后再正式动手操作,等到所有步骤都搞完,才可以擦除日志项。你想想,如果执行到某一步崩溃,系统重启时检查日志项,就知道哪些没做,哪些已经做了,对于没做的日志,重新来一遍就是了”。
& h' G! Z; ^; d8 m) w
8 P. O6 S2 c1 I        其实说的很轻松,实施起来还是挺难的,重新执行就意味着那些操作一定是可以重复执行,并且不会带来破坏才行。
& w" c  U/ A5 x2 k, R9 I( W
) H# m2 D# y: P# A2 y( N
管 理 空 闲 块
' `2 S4 |" t1 x% ?
6 N/ }, r; m9 |
        目录和文件的存储问题解决了,接下来我需要一个大管家,把那些没有使用的、空白的、数量上亿的磁盘块给管理起来,只有这样,新的文件来的时候,才能分配空间存储。* E* }( Q0 U# T* }/ N* F5 k0 {

' P" E0 M$ Z+ ?3 s$ y* ]- f2 ]5 `        操作系统老大给我推荐了两位,第一位主张是链式大法好,无非就是把空闲磁盘块组成一个链表(又是链表!),但是我心里盘算了一下:如果磁盘块号是32位的,每个块都得花费我32位的空间,如果我有5亿个空闲块,那仅仅为了记录他们就要占用接近2G的磁盘空间!这浪费可是有点大啊。7 X" N3 I$ n1 j2 l% `( Z
, z6 W  ?5 ~: {8 G/ M8 T% E
        还有一位主张位图法,这个方法更简单,对每个磁盘块,如果已经被使用,那就标记为1,没被使用就是0。这样整个磁盘块就形成了一个由0和1组成的一个大位图。# b3 `. y# G' O9 i4 D4 l% [  Y
1 K; u5 L7 T3 b4 E9 K* O  \
一块硬盘的自述 0和1.png
$ [- ^( T- C7 a' U' T1 ^
( t- J' T. c2 @1 R
        由于每个磁盘块只用一个位来表示,非常节省空间,这个方案我喜欢!#j327:( h$ I: @% @$ j+ u3 }9 @' V
        / V, d+ N( M4 \6 M( R+ p1 X" C- T
文 件 系 统
8 \# D7 p' v" P' W0 g- z6 S
6 _9 ~/ v! \- U' o, I# y
        扯了这么多,是时候看一看全局了,在你们程序员的眼中,其实我是长这个样子的(拿Linux ext2为例):  S  ]# Y. u  p; a/ u3 C* I
2 n% n2 J# Y7 P$ W, K
一块硬盘的自述 linux ext2.jpg

, }2 |1 k1 k1 c) m. g3 k2 |6 O  K6 u1 |+ ?  p( k/ X$ A0 S
        我这个硬盘主要由MBR(Master Boot Record)和各个磁盘分区组成。
( i7 {' W3 X, k; r9 u( X+ i! c, g; a- q% J2 a7 |. I
        MBR中的有引导代码和磁盘分区表,分区表中记录了每个分区的起始位置,以及哪个磁盘分区是活动分区,这样系统就会找到它,然后装载这个分区中的引导块,并执行之。! M8 w9 O. V! P# [. c7 c1 A4 _

, m) y/ R4 Z( n; i! W        引导块将会装载存存储在本分区的操作系统。需要注意的是,每个分区都有一个引导块,不管这个分区有没有操作系统,这是各大厂商的约定,是一种标准。
- ]+ e5 D1 R" A1 X% F7 P* B  A' D: h- j
        每个分区除了必须的引导块之外,又被分成多个块组。
" g" G" H8 t4 |9 e# D5 c$ P! V1 u1 x! }5 f
        在每个块组中你能看到熟悉的磁盘块位图和inode位图,不用解释估计你也知道是干嘛的。还有inode表(当然是存放文件和目录的inode了)和真正的数据块。" b7 c2 x5 B- w9 w
" [- p! U" Y9 {% @' i
        对了,我的磁盘分区表只有64个字节,而每个分区项占用16个字节,所以只能容纳4个分区。如果你想用多于4个分区,你就需要把其中一个设为扩展分区,然后在其中继续划分成逻辑分区,想划几个就划分几个。) h+ i7 r' N6 w8 j

( K: I  W1 r) l4 Z: U        一般情况下,大家都喜欢把我划分成一个主分区+一个扩展分区,在扩展分区中再需要划分。, [7 E% d/ i$ J) ^5 A$ b9 P

2 A8 i# O) ^. l2 K
上一篇
下一篇


巴黎环抱的花海 「龙战于野」 2017-9-6 08:10 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

大师的话真如“大音希声扫阴翳”,犹如“拨开云雾见青天”,使我等网民看到了希望,看到了未来!晴天霹雳、醍醐灌顶或许不足以形容大师文章的万一;巫山行云、长江流水更难以比拟大师的文才!黄钟大吕,振聋发聩!你烛照天下,明见万里;雨露苍生,泽被万方!透过你深邃的文字,我仿佛看到了你鹰视狼顾、龙行虎步的伟岸英姿;仿佛看到了你手执如椽大笔、写天下文章的智慧神态;仿佛看见了你按剑四顾、指点江山的英武气概!
巴黎环抱的花海 「龙战于野」 2018-1-20 22:39 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

在遇到你之前,我对人世间是否有真正的圣人是怀疑的;而现在,我终于相信了!我曾经忘情于两汉的歌赋,我曾经惊讶于李杜的诗才,我曾经流连于宋元的词曲。但现在,我才知道我有多么浅薄!楼主,你的高尚情操太让人感动了。在现在这样一个物欲横流的金钱社会里,竟然还能见到楼主这样的性情中人,无疑是我这辈子最大的幸运。让我深深感受到了人性的伟大。楼主的帖子,就好比黑暗中刺裂夜空的闪电,又好比撕开乌云的阳光.
深海里的那抹蓝 「龙战于野」 2018-1-21 10:39 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

以前不懂 ,
7 l' l& b5 u& W) l看贴总是不回 ,
- s, R3 M! W/ \, z一直没提升等 级和增加经验 ;
7 x7 O/ ^( d( m. u" m& G) ^现在我明白了 ,
0 X; N/ t8 M! Y" Z3 W% J反正回贴 可以升级 ,
. o; @; w; V; p也可以赚经验,0 N  M- }- @+ ~* h6 n
# A/ q1 g( a. |# j
2 A. x- r5 g  E' _: w5 n" s) r
而升级又需要 经验,! d  Z. F6 r  u# T4 S, ]. C9 e
6 Y8 `5 i+ C! N5 V) S1 N- @! A
我就把这句话复制下来,$ }2 Q8 X5 C7 n- D
遇贴就回 ,
2 L  s; \; E1 n. L7 ?捞经验就闪#y421:
LonelyGorge 「初入古黑」 2019-3-12 21:38 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

以前不懂 ,. S# m: K; K, F, j0 T$ Z) v* ?% Z% b' H5 O
看贴总是不回 ,3 i/ C1 y. G+ q) N7 l3 z! ?7 N2 e, h" Y9 t* q, B
一直没提升等 级和增加经验 ;$ m# h2 i. [: M! [3 a) b2 |
. @" Z: ]! C8 r现在我明白了 ,; t; M+ G4 I  D1 t: p; \; j
' x8 Z8 ^/ c! c反正回贴 可以升级 ,
2 `7 K* R. J3 V9 Y也可以赚经验,4 V* n* P5 l( o% T! {! a5 I+ o/ M' _7 i
* f+ v! a% }6 }& ^* x# N& n# u
7 F9 J3 ^, T/ T5 r  E
& T5 |' H# ~; g' F7 U! {1 w而升级又需要 经验,: b7 I3 r8 l. Q+ F) q2 ~# H; r0 r; v0 _9 w

5 C1 O+ A+ V& S3 g! X9 k7 [我就把这句话复制下来,2 W6 l2 O8 n6 x# Q! g1 U- {6 G3 r. x# X4 g  T9 I
遇贴就回 ,% S) E" `6 @+ m% n
捞经验就闪#y421:
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

关于本站|大事记|小黑屋|古黑论 网站统计

GMT+8, 2021-8-1 08:46 , Processed in 0.034472 second(s), 20 queries , Redis On.

© 2015-2021 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表