无法飞翔的翅膀也是有意义的,因为它是曾经翱翔于天空所留下的珍贵回忆。 收藏本站
登陆 / 注册 搜索

阅读: 5.2K   回复: 4

一块硬盘的自述

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

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

主题破百
        我是一个非常精密的存储介质,虽然具有坚固冰冷的外表,让人有种冷酷到底的感觉,但是你们却不知道我的内心是非常脆弱的~
, z1 z8 _" R2 H3 M0 F7 e0 D/ v        & y; X) Y* E2 M" _9 m. j. X
        我知道CPU和内存是计算机的核心,毕竟所有的运算最后都得通过他们俩来完成,CPU从内存里要取一条指令,做计算,然后再写回内存,如此周而复始。5 d% ?' T; H3 D; f) D1 a  w

3 k2 D' B2 f0 r7 h* d        但是这俩货却瞧不起我,说这是什么年代了,还在用机械式操作,读写数据的时候,还得一个磁头在多个盘片上滑来滑去,找来找去,速度慢的要死。0 d& }/ _4 T2 A

- j* w8 i" o+ o' T. ]2 Y' Y
一块硬盘的自述 GriffWason_GenericHardDrive_exploded01.jpg

! F  i. v3 g% j  n  d        内存说:“CPU比我快100倍,比你快100万倍,整个系统的速度都被你给拖慢了。”#j318:
7 Z+ {# R; V1 J# e' H. ^+ ?
! x- z% A  q3 {1 }; G) [+ t        他俩还嘲笑我很娇气,得真空、密闭、不能有浮尘、运行时不能震动,一动就坏了。但这俩二货总是会忘记他俩的最大问题,所以我只用一句就把他们俩给噎死:你们俩断电了怎么办?
9 n& s& E# N" q( l, H* K# O" }) w( M& u% k( P* d0 i
        还有我的容量都是按TB,甚至PB来算的,就你们俩那点容量,还笑我?还有,没有我来存储程序,你们从哪儿得到程序,难道要像牵牛星(如下图)一样,手工拨动一排开关来输入程序吗?1 y" ]& M* f. o* V; ^9 p" s

9 w, `; {7 e4 h% ^* u$ q" O
一块硬盘的自述 W020150927433549562851.jpg

  s/ k5 o2 N; |8 N        其实我也很纳闷,为什么你们人类造不出来一个能够断电存储的,大容量的,访问速度快的,当然还要便宜的硬盘来,你们不都上天了吗?要登陆火星了吗?这些基础的材料怎么还无法突破?#j331:
% C, W" y$ ]2 m8 I
* K9 e2 f+ n' w) e. T2 U        我憧憬着这么一天的来临,如果能制造出来了,CPU就可以直接访问硬盘了,内存就一边凉快去吧。
) ]9 `7 c. q( m( h- v8 C/ Q, y7 b. K
        在制造出来之前,你们必须得容忍CPU-内存-硬盘之间的速度不匹配,并且想出办法来解决这种速度的不匹配,比如用缓存、直接内存访问、多进程/线程切换等等方法。9 d! h  q; p7 q1 _# W7 n" O$ v# M
        
" {8 M7 z7 b( p  D5 Q
我 的 内 部 结 构
8 k5 p" @8 t" l4 ~5 z& ^& A
一块硬盘的自述 硬盘内部.jpg

3 U' g7 Z5 y, J( W" l
( ?& Z% y# E6 u) W" x, `, H6 j        看到没有,我有很多个盘片像串糖葫芦一样被串在一个主轴上,主轴带着他们疯狂的旋转。
) ?/ P* Q- z3 `
* _6 D, v" C, W5 G        每个盘片都有很多一圈一圈的磁道,每个磁道又分为一个一个的扇区。
) t) k/ M6 B$ F7 u( ^/ j9 `  Y3 |4 w; U/ o$ Z
        多个盘片上的同一位置的磁道组成了一个柱面(需要发挥一下你的想象力)5 v# a- I* c% g9 f3 Z6 ?

6 z/ C. B; y3 ?        最后每个盘片上都有可以读写数据的磁头。. E0 G( _7 j/ N0 L2 c1 t
        6 |. w( g+ o( a
        所以,如果你想访问我的数据,可以说:把0柱面,0磁头,1扇区的数据给我拿来。
- O3 h2 |$ F, ~+ Y. Y+ Q* o( j) {3 ^
        我就把磁头挪到您指定的柱面,对每个磁盘来讲其实就是指定的磁道,所以这叫“寻道时间; U! x8 l1 K* n" c9 K/ X

. m7 S+ _7 C, \% Y! g. O3 \        然后再旋转磁盘,让磁头指向您指定的扇区,这才能开始读取数据,这叫“旋转时间”,转速快的硬盘能更快的旋转到特定扇区,所以性能会更好些。
( L- Z' ~2 W& b2 W  h( _
9 `  t1 L* J1 |* |
什 么 是 文 件

, _+ g5 Y! O. [        
+ t3 q/ f2 ~: g& S7 a' J* N; j; c        当然,对于绝大部分人来说,都不想去了解什么柱面磁头扇区这些非人的术语,所以我为懒人们专门提供了一个叫做逻辑块的方式,你看到磁盘就是有一个个“块”组成的,编号为1,2,3,..n。( x5 n1 G; Y2 L2 f" Z" ^

0 ~+ r7 E) K- K; t        想取哪一块就取哪一块,比如你说:把第1024号的“块"的数据给我取过来,我在内部就把1024转化成柱面,磁头,扇区,按照上面说的方法寻道,旋转,读取数据。
% ?: b# T) L) u1 s, {3 F$ U$ M0 o& N4 B4 p2 r
        但是这还远远不够,比方说你想写个文档,输入了很多字和图片,最后想存到我这个硬盘上,你该怎么操作?#j321:
+ m1 G1 z  W, f5 C2 X/ S8 v) ^: B- a1 G' h
        一种方法是这样的:4 S0 J. M* U+ H
        
6 A6 K' }% c+ @# v0 r  H/ F        你:硬盘,给我找20个空闲的磁盘块,我想存我的文档。: r6 ^3 ]4 d3 _2 n  ]# A2 _
3 r: P$ @% U1 A$ c. ]! X3 e' z
        我:空闲的磁盘块编号是1024,2048,2049,3000,......- W- b& F! {  v9 H# R5 O/ N, J

, i5 H- z9 Q$ H4 @$ J        你:把这些文字和图片存到这些磁盘块上。
+ S6 u  F6 ]1 C& p: \$ k+ p
2 T1 E4 j3 r/ N0 ]. `# F        我:好的,存完了,你得记住这些块啊,这样下次才能读取。* f4 Z0 e6 }; z# h; v
4 o( j# b4 X) [1 S& q
        你:拿一支笔把这些磁盘块编号都记到本子上。
: D% t/ J/ e& ^- Y# ]' J- K4 W" c2 ~
        过了几天......
- Z. U) B3 H8 A3 h# V1 V
: M0 K: r/ @* P- |% [5 N) z        你:硬盘,把1024,2048,2049,3000这些数据给我取出来,我要编辑。
2 h% G! S" a; P. I  l" r
& y# S/ \' r' b& p        我:好的,这是你的数据。) t, s  t7 K, G9 a: c; C
1 ^# B. V5 Y# J0 B0 U* m  d) D
        没有人喜欢这种方式,太折磨人了!
4 y, _0 G/ g, `* x. ^& w' n" u
       所以你们更喜欢这么做:( O- a4 t; l3 i0 Q* X  y1 H, w
        
. n, Z. j$ v0 |! ^3 _& b        打开word->新建一个文件->输入文字和图片->保存到:D盘\我的文档 目录下。
2 q1 j5 m/ S. r! y
8 N2 O5 N( b- \9 V. M        这个所谓的“文件”和“目录”就是我的杰作啊,你再也不需要和烦人的磁盘块打交道,只需要记住你的文件名和路径,一切工作交由我和操作系统老大来搞定。' ]- c, G$ i- n
2 q) A3 n5 o0 R4 _: K2 K. Z( }
        我和老大商量好了,文件对人类来说是最小存储单位,你想存任何东西,无论多么小,非得建个文件不可。
! H. G  u. g3 ?2 s. w1 L) h& Z' n, ~' D/ h* k( M. k# t
        此外为了让这个世界整洁有序,多个文件可以放到一个目录(其实也是个特殊的文件)里,目录之上还可以有目录,形成一个树的结构。
8 x: u( R: P0 g* y
9 C) Y! H) a9 \( F! @# T& L        文件这个东西是个伟大的发明,我估计你们还得再用100年。#j346:
: c" w; d! d' A. D' }        
3 G( l- s& ~! c9 k
文 件 的 存 放

5 V0 k3 P( t5 u' F( N" S# g3 I5 f9 Z' M1 e& P. m" ?* n4 |, e3 M
        我日常的主要工作就是对目录和文件做操作,当然需要操作系统老大的配合,好吧,其实是老大在主导。
+ g+ ?& X- U7 q) u
6 A8 U* Y$ B6 E( L+ g& T  \9 Z        这其中最重要的一个问题怎么去记录各个文件都用到哪些磁盘块?; Z# F3 j1 l' b6 k* H+ U

- |# h1 S& s- u4 H( m6 h3 Z        内存给我支了一招:你可以采用连续记录的方式啊,就像这样。
  g+ v  N+ J' L. X2 j, ~
  |8 m1 {1 m8 o, g( w! U0 K  F7 l; Q
一块硬盘的自述 文件的存放.png
: w) P4 g+ _0 j8 a
/ d& S  d( w$ n0 [+ c
        文件1占据磁盘块1-34 t! V( e) F5 a- \4 y
        文件2占据磁盘块8-12! f5 a: J) o! L0 w* W( [; V
        文件3占据磁盘块15-20
. U# p& n$ Q/ S: @! f
  D0 n. B: k4 X6 e; f8 G
        内存说:这种方法在随机访问文件是效率极好,因为你只要知道了开头和长度,就像数组一样可以随便访问,就像CPU访问我一样,只要给出地址,立刻就能定位到指定的位置。
$ ^. U5 O3 F+ U& |' j  a3 _
# m0 w& }) @- C        我仔细想了想,内存出的是一个损招,比如说内存磁盘块4-7,以及13-14怎么没用?
1 t# L) b# {' |! ^; y  _8 i! B# C3 W9 |. g; y
        那是因为之前那里也有文件,后来被删除了,留下了空洞,如果之后没有大小合适的文件过来,他们就永远空在那里了。
; }7 m2 A8 D5 k% m# b5 y( f1 r% m, \4 j* J: u* _' t
        对我来说这是严重的浪费,这是我不能容忍的。
- F: v2 V) k4 Q7 \
- g* H: O" s* v2 t0 N2 I" t        我说:“小样你以为我看不出来啊,你不就是嫉妒我容量大,让我浪费一点嘛”!
# ~) P# X* M4 e* D% T7 y9 X, ~0 H& \
# {$ F0 Y. c4 g: Y) b7 x        内存坏笑了一下又说:不喜欢也没关系嘛,试试采用链式啊:
2 c/ Z: [; h$ a! I; a) x# n0 V2 R7 s) ^# r' T0 V) i- g2 Y
一块硬盘的自述 链式.png
9 m6 ~7 \* r7 j! d" R9 L  r
1 J+ G$ o/ J$ F7 W( ~& X; N
        这个文件从第一块磁盘开始,形成一个链1->9->18->8->3,每一块空闲的磁盘都会得到充分的利用,效率非常高。) \* r* a9 T) ?+ O5 B
$ N) J* X" T" X# P& u/ c; H
        我心想:这些码农说的数据结构和算法还真是有用啊,这里也用上链表了。可是这种方式随机的访问效果太差,每次都得从第一块开始,沿着绳子往后找,太痛苦了。
4 F4 @5 b4 [1 k3 f! O& w# y; {% \, Y& N) _! ^' y3 {/ \
        现在内存已经嘲笑我慢了,用这种很慢的办法,还不得笑死我?操作系统老大说:“别听内存在那里BB了,用索引式!”( e1 j& c0 E- t7 O

( a3 c% s% K, N, I$ \' F% h6 h
一块硬盘的自述 索引式.png

" J# v  L$ b8 @7 E8 F' T2 m& {' A. Z( A3 Q" c) [- u
        例如第16号磁盘块专门用来存放文件属性以及该文件所使用的磁盘块。
  n% l* Z3 m& s# a& N( K# D
: Y# h0 p  x& n" Y: [) m        老大把这个磁盘块叫做inode,通过它可以轻松的找到这个文件所使用的所有磁盘块,无论是顺序访问还是随机访问都很快。
; {) a& W, K: d4 r, v6 X# Z
# [: ^: A* y1 ], D# l" P        唯一的缺点是得用额外的磁盘块单独存放inode。+ t4 v5 s3 o: r

# O4 N! C( D6 \* @        我觉得挺好,没有十全十美的东西,折中达到平衡最重要!就是它了!#j325:
0 J% Y  o: A% \! I
# ]& o! |. z/ p* u7 P3 |        我问老大:每个文件都需要有个inode来描述,每个目录是不是也需要一个?* X' H4 G# I" \; h8 q1 ?5 t
% J. B- x3 {& z3 c' q: I+ x6 V/ w
        ”这是自然,和文件一样,每个目录也是一个inode,其中有目录的属性,还有存放这个目录内容的磁盘块号,在磁盘块中才真正的存放着目录下的内容“。- p' ?& i: D5 q: M$ V' @% \

4 @: _7 |( i1 G' v0 n, h$ b0 C% m
一块硬盘的自述 内容.png

- D. j! J0 w) r7 e( Q# A# r0 r- a% b
        “举个例子来说吧:有人要读取/tmp/test.log这个文件,查找次序是这样的:根目录inode->根目录磁盘块->tmp目录inode->tmp目录磁盘块->test.log的inode->读取磁盘块”
! n5 M. m* W& U9 l* ~" {) w* k8 \% ^3 D! j/ f- k; s: w, Q! p
一块硬盘的自述 读取磁盘块.jpg
/ z+ T& I4 Z, y# O6 T- K6 n4 m

" F8 a0 l( O! U        内存说:“卧槽!这也太绕了吧,比CPU访问我的数据麻烦多了,硬盘,你要小心点,这要是操作不当的很容易出乱子的。”#j340:% a6 |9 u9 J+ t4 ~

$ f  ~# T) F/ Q1 f" ^2 C; g        我心想内存这次没坑我,他提醒的对,这操作确实有点复杂,读数据的时候还行,如果是修改,尤其是删除就很容易出事,例如想删除上面的文件/tmp/test.log,需要这些步骤:( M: p5 U/ l+ d) u
        
* C2 Y3 L- Y1 |% _% b4 g+ F4 @, ^        (1)在目录中删除文件
- ?# j& N6 |9 k        (2)释放inode到空闲的节点池,这样可以复用: e" F7 j# a0 @; g* E6 G" {
        (3)将磁盘块释放到空闲的磁盘块池

( l. J" ]! a- X3 q
! p6 O4 l- u+ @6 }8 \' {( ^        在操作某一步的时候出现系统崩溃,那我这些个目录和文件就凌乱了,可能会出现空间无法释放的情况。
' ]1 l; U1 c' w4 o4 A3 B5 w2 G  w  c: |( X9 d1 C# G3 j0 v4 }
        系统老大说:“这确实比较烦,不过也能解决,听说过数据库是怎么办的吗:记录日志!”
; e' R& _! ^2 c' e% }( v' A' [" W1 u6 f6 [* O7 g, s
        ”就是把要做的事记录下来?“6 I9 Q0 x9 g* v  R  W6 x3 S

9 s4 v5 t8 C* U" x6 m" l$ l4 g        “是的,在做操作之前,记录要做的事情,形成日志,把他们成功写入磁盘以后再正式动手操作,等到所有步骤都搞完,才可以擦除日志项。你想想,如果执行到某一步崩溃,系统重启时检查日志项,就知道哪些没做,哪些已经做了,对于没做的日志,重新来一遍就是了”。
" E/ l, e: M' }8 h: G- B
3 o9 T; O: S6 e5 B        其实说的很轻松,实施起来还是挺难的,重新执行就意味着那些操作一定是可以重复执行,并且不会带来破坏才行。' ]7 g# n/ Z) B% V. |
7 T$ j7 q, B; Y9 R
管 理 空 闲 块
" B  l  N. s- R7 _4 _% A% a# \

8 b3 o* a3 N/ S( O        目录和文件的存储问题解决了,接下来我需要一个大管家,把那些没有使用的、空白的、数量上亿的磁盘块给管理起来,只有这样,新的文件来的时候,才能分配空间存储。
, q  i& r( w) M" E: p+ q8 G0 V
/ |. u3 R5 ~: O  F. I4 G        操作系统老大给我推荐了两位,第一位主张是链式大法好,无非就是把空闲磁盘块组成一个链表(又是链表!),但是我心里盘算了一下:如果磁盘块号是32位的,每个块都得花费我32位的空间,如果我有5亿个空闲块,那仅仅为了记录他们就要占用接近2G的磁盘空间!这浪费可是有点大啊。
4 p, C3 k: k# z! H
9 w8 D) Z) b/ O" Z9 `  F        还有一位主张位图法,这个方法更简单,对每个磁盘块,如果已经被使用,那就标记为1,没被使用就是0。这样整个磁盘块就形成了一个由0和1组成的一个大位图。  u6 [! R* ?2 Q* S2 d- t

6 N$ O. N! @6 H' W6 ?  S- ^
一块硬盘的自述 0和1.png
- l* J4 a0 _3 U$ x* h7 A( \; @
  U9 I% F8 J" K! ^3 }7 S
        由于每个磁盘块只用一个位来表示,非常节省空间,这个方案我喜欢!#j327:) y* l1 W/ S- o- f$ o: ~$ E8 m6 ~
        5 j. n* Z1 `  @; g
文 件 系 统

* d. [3 f9 ]& U! k
8 R# ]# C5 b" ?+ l% @/ w7 h& I9 f: g        扯了这么多,是时候看一看全局了,在你们程序员的眼中,其实我是长这个样子的(拿Linux ext2为例):
7 e( z5 v: B1 x1 e" K* h0 o& p  O$ H2 \$ k
一块硬盘的自述 linux ext2.jpg

# W' W; G( O: e, B2 k& K$ \
6 j+ b& k3 ^( A) @1 m        我这个硬盘主要由MBR(Master Boot Record)和各个磁盘分区组成。. S" S4 [( {8 V# f2 B  S' Q

& A% Z: v5 }- ^' |( Q' m        MBR中的有引导代码和磁盘分区表,分区表中记录了每个分区的起始位置,以及哪个磁盘分区是活动分区,这样系统就会找到它,然后装载这个分区中的引导块,并执行之。: c8 d+ S  T: O3 f! u! _
; \6 N: {9 ]0 [
        引导块将会装载存存储在本分区的操作系统。需要注意的是,每个分区都有一个引导块,不管这个分区有没有操作系统,这是各大厂商的约定,是一种标准。
5 r" O3 i& |6 g. O& u7 f. J5 g  `8 W; c0 L4 u5 J
        每个分区除了必须的引导块之外,又被分成多个块组。# E* `+ K) I7 A3 L5 m
8 b. ?& Q' a" Z8 z, G. o
        在每个块组中你能看到熟悉的磁盘块位图和inode位图,不用解释估计你也知道是干嘛的。还有inode表(当然是存放文件和目录的inode了)和真正的数据块。5 X. X6 @' k! k% e1 f

, z9 |" A' |5 I& b9 v5 f        对了,我的磁盘分区表只有64个字节,而每个分区项占用16个字节,所以只能容纳4个分区。如果你想用多于4个分区,你就需要把其中一个设为扩展分区,然后在其中继续划分成逻辑分区,想划几个就划分几个。& I1 P: R& R( Y0 q% L

# e/ b. ]! H  _8 P        一般情况下,大家都喜欢把我划分成一个主分区+一个扩展分区,在扩展分区中再需要划分。
8 G& B  |6 R( u6 ]' c. R
: E+ S9 }4 }+ F% W2 {

上一篇:  一个键盘的自述

下一篇:  一个进程的自述


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

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

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

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

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

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

以前不懂 ,
% j. m2 E/ o; c# N看贴总是不回 ,* k1 j; C) M+ l- n' y  p9 F4 {: ^
一直没提升等 级和增加经验 ;9 A( b1 ?" w% S' v, |1 k
现在我明白了 ,
, P: e7 V: c7 Y反正回贴 可以升级 ,
/ b* V1 ^( x2 K8 z8 w  Z/ z也可以赚经验,
0 w4 H% z1 ?( J- z: j8 p3 |* I2 t- R0 O- o, C+ r4 t  t# V" W, O
" T0 F. `1 c! y) R0 _' U+ V4 y
而升级又需要 经验,7 o% P0 M( z7 e2 }* T! |

3 U2 r# Q, n; @4 ]3 D# ^我就把这句话复制下来,
; K( L5 u% I6 r0 \遇贴就回 ,. @' R- c" L/ q) P
捞经验就闪#y421:
LonelyGorge 「初入古黑」 2019-3-12 21:38 |显示全部楼层

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

以前不懂 ,. S# m: K; K, F, j
% @; ^8 E7 }+ D9 m看贴总是不回 ,3 i/ C1 y. G+ q) N7 l3 z2 G0 X+ y' l) M/ x7 ]( v' f( h4 Z5 {
一直没提升等 级和增加经验 ;$ m# h2 i. [: M! [3 a) b2 |* K* e# a( f' ?6 }& m
现在我明白了 ,; t; M+ G4 I  D1 t: p; \; j
0 A5 M& \  G/ a1 R7 w2 D7 i7 P$ u. T反正回贴 可以升级 ,3 o* q% `& e8 `* U+ H4 N
也可以赚经验,4 V* n* P5 l( o% T8 N" E( Q! ?1 p# ^6 r4 N
* f+ v! a% }6 }& ^* x# N& n# u5 ?# o3 _; _$ e( y
; u& _- l- F# v$ ^2 I, B# {0 w' h
而升级又需要 经验,: b7 I3 r8 l. Q+ F) q2 ~: t6 \; b# M% H  B2 n* g- H) e

$ U6 V" S9 |/ q6 k. r我就把这句话复制下来,2 W6 l2 O8 n6 x# Q! g1 U  `0 |1 R: U: Y4 G) o0 D& F
遇贴就回 ,' u9 n! p- k+ k: N
捞经验就闪#y421:
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

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

GMT+8, 2020-10-30 09:17 , Processed in 0.038890 second(s), 23 queries , Redis On.

© 2015-2020 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表