不相信人咬不到肚脐的,咬破肚脐去死如何? 收藏本站
登陆 / 注册 搜索

阅读: 5.6K   回复: 4

一块硬盘的自述

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

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

主题破百
        我是一个非常精密的存储介质,虽然具有坚固冰冷的外表,让人有种冷酷到底的感觉,但是你们却不知道我的内心是非常脆弱的~
. G5 ~# C; G8 o        
0 \  Y' K$ x) H  X! G        我知道CPU和内存是计算机的核心,毕竟所有的运算最后都得通过他们俩来完成,CPU从内存里要取一条指令,做计算,然后再写回内存,如此周而复始。
* Y! F. R8 e% T+ ]4 J, f
5 i) K( N* D& ~9 R        但是这俩货却瞧不起我,说这是什么年代了,还在用机械式操作,读写数据的时候,还得一个磁头在多个盘片上滑来滑去,找来找去,速度慢的要死。& g3 ]5 M1 ^$ B9 s- h3 a
# F$ A9 \2 E4 A- a# d' G
一块硬盘的自述 GriffWason_GenericHardDrive_exploded01.jpg
6 r2 Q; c- F+ G# `/ [  E( V
        内存说:“CPU比我快100倍,比你快100万倍,整个系统的速度都被你给拖慢了。”#j318:- e, S. W, E6 n
  c, g" z% p) n7 y
        他俩还嘲笑我很娇气,得真空、密闭、不能有浮尘、运行时不能震动,一动就坏了。但这俩二货总是会忘记他俩的最大问题,所以我只用一句就把他们俩给噎死:你们俩断电了怎么办?8 F% H$ ?) X3 e% I4 Y/ [

+ g' F3 N& W0 C: d+ U) p        还有我的容量都是按TB,甚至PB来算的,就你们俩那点容量,还笑我?还有,没有我来存储程序,你们从哪儿得到程序,难道要像牵牛星(如下图)一样,手工拨动一排开关来输入程序吗?
- }; {' q% _" ]" d0 `8 Q) [/ t2 G
# @) O& y$ [- F+ Q
一块硬盘的自述 W020150927433549562851.jpg
9 J, M( p: w! u8 V3 N: @
        其实我也很纳闷,为什么你们人类造不出来一个能够断电存储的,大容量的,访问速度快的,当然还要便宜的硬盘来,你们不都上天了吗?要登陆火星了吗?这些基础的材料怎么还无法突破?#j331:
5 s# S( w/ u* \/ _
3 _% L/ j3 m1 y$ O) H' m' n        我憧憬着这么一天的来临,如果能制造出来了,CPU就可以直接访问硬盘了,内存就一边凉快去吧。
: p* r5 k0 W/ p
& I2 X; A  O" B# j1 b3 k% F        在制造出来之前,你们必须得容忍CPU-内存-硬盘之间的速度不匹配,并且想出办法来解决这种速度的不匹配,比如用缓存、直接内存访问、多进程/线程切换等等方法。
9 g  ?- I* }$ l! p8 |) T        $ p9 }- u$ d6 o0 J2 F8 b
我 的 内 部 结 构
1 H0 X, b% D* I" n  A$ _
一块硬盘的自述 硬盘内部.jpg

: H/ l8 K; K( {6 f- x& H* n9 e7 K4 }% _' b# E: w: w$ W
        看到没有,我有很多个盘片像串糖葫芦一样被串在一个主轴上,主轴带着他们疯狂的旋转。
' C0 M" p! l* D' B- q, n/ I
: C; s! ^5 U! I; N% j        每个盘片都有很多一圈一圈的磁道,每个磁道又分为一个一个的扇区。
( V* c& L; A9 o. g& q
) E3 r/ }% I: K, I  V6 z2 P        多个盘片上的同一位置的磁道组成了一个柱面(需要发挥一下你的想象力)
) G" S+ q4 }3 z% ]! W! I( A6 @/ L/ f
9 ]0 e0 I# f* y( y# I- t0 V1 s0 E' Z        最后每个盘片上都有可以读写数据的磁头。2 l( E& t4 M  ?
        
+ g) O( a! a4 q3 N- r; Q        所以,如果你想访问我的数据,可以说:把0柱面,0磁头,1扇区的数据给我拿来。
+ Z2 M9 ?; k# ?, Q4 X1 ]8 }5 z% D6 C, z% Q  h8 c9 }
        我就把磁头挪到您指定的柱面,对每个磁盘来讲其实就是指定的磁道,所以这叫“寻道时间4 \+ V2 t0 s6 b) @9 N& V
$ j2 c9 Y% w, v& C
        然后再旋转磁盘,让磁头指向您指定的扇区,这才能开始读取数据,这叫“旋转时间”,转速快的硬盘能更快的旋转到特定扇区,所以性能会更好些。
9 G9 Z% v) b. K7 w8 `
9 a( L- n& M5 f5 m# L" c0 C
什 么 是 文 件

  I4 `: }5 n  Z3 {! R        ! R, x7 r9 B; {5 z& \6 k9 _
        当然,对于绝大部分人来说,都不想去了解什么柱面磁头扇区这些非人的术语,所以我为懒人们专门提供了一个叫做逻辑块的方式,你看到磁盘就是有一个个“块”组成的,编号为1,2,3,..n。
$ O4 e5 Y0 Z! |! S0 |! y3 @/ O/ w+ f
; W9 l* L, x" U8 d$ ~        想取哪一块就取哪一块,比如你说:把第1024号的“块"的数据给我取过来,我在内部就把1024转化成柱面,磁头,扇区,按照上面说的方法寻道,旋转,读取数据。
; f' I# ~6 c: Z  \, [" l! v8 S" t( A: _9 G( l% I! y
        但是这还远远不够,比方说你想写个文档,输入了很多字和图片,最后想存到我这个硬盘上,你该怎么操作?#j321:
2 {3 r7 X. l& B$ H' ^. Z6 y0 F4 l$ p6 [* w' x6 N% r  {% d
        一种方法是这样的:. H/ S$ d: Z  _9 A* I( l
        2 @! N! a+ y1 P
        你:硬盘,给我找20个空闲的磁盘块,我想存我的文档。% D8 f/ f& ]' b# J+ r5 J* X
9 F/ ?/ J, M$ K  U1 I/ o2 Z
        我:空闲的磁盘块编号是1024,2048,2049,3000,......! ?( u% F, C) ~% Y! t
2 @$ t* f. o  g8 W
        你:把这些文字和图片存到这些磁盘块上。
8 k8 D7 L/ F! j0 f$ N% H. v# g! M4 w( V6 k; |
        我:好的,存完了,你得记住这些块啊,这样下次才能读取。2 A# }7 ?, s& R, L+ `4 P  [9 v0 Q

) n0 L  c- x. G/ P  z$ D% o! W3 I        你:拿一支笔把这些磁盘块编号都记到本子上。
: Q) l3 M  N) }# z' \9 ?( j7 V# h  {& o5 T. ^
        过了几天......
" p6 j$ Z+ {& m0 C3 E
& g& K3 [, G7 u( @5 `        你:硬盘,把1024,2048,2049,3000这些数据给我取出来,我要编辑。  [; e4 }! |2 i6 s7 T0 u0 {9 l

9 X" f+ e  G% v8 R- @3 ~  N& R        我:好的,这是你的数据。: w# n9 ~  C; N6 F
& L7 I6 V/ {6 G
        没有人喜欢这种方式,太折磨人了!

: K: x) S. W4 I9 O% i       所以你们更喜欢这么做:
9 p7 C+ M$ [: B' q( B9 Q" w        
0 X% ~1 m  V2 P( G" E; v; U$ T        打开word->新建一个文件->输入文字和图片->保存到:D盘\我的文档 目录下。" f8 W# J. U1 v* o6 X7 U
- G5 \6 N6 O# T% M$ K2 R
        这个所谓的“文件”和“目录”就是我的杰作啊,你再也不需要和烦人的磁盘块打交道,只需要记住你的文件名和路径,一切工作交由我和操作系统老大来搞定。# _! l6 H( {+ \# j' o' `6 }$ V9 l
" h8 I+ b9 {4 _0 @* C0 j) F
        我和老大商量好了,文件对人类来说是最小存储单位,你想存任何东西,无论多么小,非得建个文件不可。; m" w. b8 r- Q& J4 y
4 ?( P4 @1 i& a
        此外为了让这个世界整洁有序,多个文件可以放到一个目录(其实也是个特殊的文件)里,目录之上还可以有目录,形成一个树的结构。# z2 W7 h  H: T6 {$ [; F

  v3 h2 R. I) J( j        文件这个东西是个伟大的发明,我估计你们还得再用100年。#j346:
; e6 m* S$ C, ~$ s7 N! _0 {% @9 N        
5 s  n( P3 o( w4 K0 S5 d
文 件 的 存 放

1 F7 L* R, ]6 ~5 C' f8 a
+ d3 `9 N& n" O& p        我日常的主要工作就是对目录和文件做操作,当然需要操作系统老大的配合,好吧,其实是老大在主导。* ?* P1 }( j/ F9 u' ~( {
/ \5 Q# {* e: ]5 ?! Q7 F
        这其中最重要的一个问题怎么去记录各个文件都用到哪些磁盘块?$ b' P' c% m6 N# z+ a! W) z" R

! n0 T# I9 h5 b6 z+ G& ]4 t2 s* u" q        内存给我支了一招:你可以采用连续记录的方式啊,就像这样。
! z$ T; ?3 s- g# S+ k% d' A! _+ Z. q( s9 J; x; b  m! ^/ a
一块硬盘的自述 文件的存放.png

( a5 `- ~$ p* t3 e9 l$ L
6 x& z& u( z+ \# ]4 W* y" q        文件1占据磁盘块1-3
# O5 j8 m, l, e/ |+ }+ h" o        文件2占据磁盘块8-12
" [5 s+ s9 [) b) A/ n        文件3占据磁盘块15-20
) N4 r( [+ Y, P/ D6 j
( s7 n6 c* j8 O. x7 I
        内存说:这种方法在随机访问文件是效率极好,因为你只要知道了开头和长度,就像数组一样可以随便访问,就像CPU访问我一样,只要给出地址,立刻就能定位到指定的位置。% x; c4 q+ \# D

, u  Y6 y! P) ~        我仔细想了想,内存出的是一个损招,比如说内存磁盘块4-7,以及13-14怎么没用?) T1 _; q6 C) b4 M" k

' m3 {; @3 h4 H8 }! v6 }' J        那是因为之前那里也有文件,后来被删除了,留下了空洞,如果之后没有大小合适的文件过来,他们就永远空在那里了。5 C- v0 t& d' b: ?, h
( [7 U$ B1 |# v' d/ Y5 D4 ^- b. \
        对我来说这是严重的浪费,这是我不能容忍的。- J, V! y( r9 H3 @% H4 |/ ~, t: O

: |+ }3 o& f7 x: L) b& Z, X8 ?        我说:“小样你以为我看不出来啊,你不就是嫉妒我容量大,让我浪费一点嘛”!) r6 `, a# E0 s+ i' o

6 w* h2 j1 l& C! b5 c        内存坏笑了一下又说:不喜欢也没关系嘛,试试采用链式啊:* M9 `4 _# I; W4 t
% X; u' g" s  S& t: ^3 I  h4 D+ @
一块硬盘的自述 链式.png

, t. I# Q! f+ f0 ]  L( f; G6 b% p# F- A
        这个文件从第一块磁盘开始,形成一个链1->9->18->8->3,每一块空闲的磁盘都会得到充分的利用,效率非常高。# m/ M, \, g' p0 R! I: o5 [
" u: d. ]' Z3 n5 j  u: n# b, x
        我心想:这些码农说的数据结构和算法还真是有用啊,这里也用上链表了。可是这种方式随机的访问效果太差,每次都得从第一块开始,沿着绳子往后找,太痛苦了。
( E/ J  G/ s' {3 c$ |% m9 i
% D7 o- y1 i- K+ Z# M" a5 U        现在内存已经嘲笑我慢了,用这种很慢的办法,还不得笑死我?操作系统老大说:“别听内存在那里BB了,用索引式!”
/ J2 D$ e( J8 O& P5 [/ n2 {
9 ~7 @/ Z$ m0 l, @1 j
一块硬盘的自述 索引式.png
' Y8 x, l5 e  I3 C6 F
+ W: D2 [& L7 L7 X
        例如第16号磁盘块专门用来存放文件属性以及该文件所使用的磁盘块。- P, ]3 ?0 f% J6 S9 h8 @+ W1 ]
7 ~3 b( Y- W$ E1 W
        老大把这个磁盘块叫做inode,通过它可以轻松的找到这个文件所使用的所有磁盘块,无论是顺序访问还是随机访问都很快。! F& M/ [8 p$ W7 R6 G0 w
% j) w0 y# d, M. c
        唯一的缺点是得用额外的磁盘块单独存放inode。
$ e7 H/ r' j8 y1 t7 j) N1 p5 G9 {: f4 S# c/ W
        我觉得挺好,没有十全十美的东西,折中达到平衡最重要!就是它了!#j325:# C3 ^6 t" s4 v' N1 |

7 ]) e# ?4 V. s0 Q3 d        我问老大:每个文件都需要有个inode来描述,每个目录是不是也需要一个?9 K. t4 k* D" D* Z1 D& M3 t+ F1 j4 c
# ]! x" l3 a6 Q- W( n
        ”这是自然,和文件一样,每个目录也是一个inode,其中有目录的属性,还有存放这个目录内容的磁盘块号,在磁盘块中才真正的存放着目录下的内容“。
; W6 j& p- U) T8 P
$ s/ Z( f- g0 j* l7 t
一块硬盘的自述 内容.png

3 \9 V( y* k/ p5 s# e' a9 j% R: o8 J! }9 u+ V; c1 J
        “举个例子来说吧:有人要读取/tmp/test.log这个文件,查找次序是这样的:根目录inode->根目录磁盘块->tmp目录inode->tmp目录磁盘块->test.log的inode->读取磁盘块”
! K7 m  d. z+ t- q' E9 B2 m( ~% n' {" {
一块硬盘的自述 读取磁盘块.jpg

6 S1 w, j1 q/ ^( ]3 O5 J9 }
6 v# T. H9 l: L  E# v! ?4 y; P        内存说:“卧槽!这也太绕了吧,比CPU访问我的数据麻烦多了,硬盘,你要小心点,这要是操作不当的很容易出乱子的。”#j340:
7 V: e; v* ~. F
; d+ U  G5 s: }! @, q3 f        我心想内存这次没坑我,他提醒的对,这操作确实有点复杂,读数据的时候还行,如果是修改,尤其是删除就很容易出事,例如想删除上面的文件/tmp/test.log,需要这些步骤:
$ S; E0 S. P* F' H: _6 u. X2 k        # M6 n1 Z' Q) Q1 @
        (1)在目录中删除文件
! ?& k/ h  Z' r7 M4 Z. q/ O        (2)释放inode到空闲的节点池,这样可以复用
" P3 ^) p$ O; M/ v: V3 F        (3)将磁盘块释放到空闲的磁盘块池
, }- c& c. |3 D* h: O

- F, d' }1 k. L% v% {        在操作某一步的时候出现系统崩溃,那我这些个目录和文件就凌乱了,可能会出现空间无法释放的情况。
3 W2 h, O1 z7 i2 g' n8 _( j& d2 _% N& P% B) B3 Y( M
        系统老大说:“这确实比较烦,不过也能解决,听说过数据库是怎么办的吗:记录日志!”
$ E# n8 ~6 h& N9 w; y/ ?
, L1 ~; _- y: k* [5 v; ~4 ^* G        ”就是把要做的事记录下来?“5 d# Q- N7 J+ `: t+ t

' K4 q- I9 P9 \' t        “是的,在做操作之前,记录要做的事情,形成日志,把他们成功写入磁盘以后再正式动手操作,等到所有步骤都搞完,才可以擦除日志项。你想想,如果执行到某一步崩溃,系统重启时检查日志项,就知道哪些没做,哪些已经做了,对于没做的日志,重新来一遍就是了”。, c: o; u3 R; K* y! `
/ e0 C# w: r1 P9 t
        其实说的很轻松,实施起来还是挺难的,重新执行就意味着那些操作一定是可以重复执行,并且不会带来破坏才行。
' u0 T" [$ p! [6 C3 x9 I  Q0 c- ?3 U2 w: c" y
管 理 空 闲 块

" L$ Z5 b, C1 K6 w% M; y- @# c. G1 b+ s
        目录和文件的存储问题解决了,接下来我需要一个大管家,把那些没有使用的、空白的、数量上亿的磁盘块给管理起来,只有这样,新的文件来的时候,才能分配空间存储。
/ e# ^# e0 |+ O% ?: l0 \8 U' f6 Z4 X5 b$ U. N; |! X9 c7 w
        操作系统老大给我推荐了两位,第一位主张是链式大法好,无非就是把空闲磁盘块组成一个链表(又是链表!),但是我心里盘算了一下:如果磁盘块号是32位的,每个块都得花费我32位的空间,如果我有5亿个空闲块,那仅仅为了记录他们就要占用接近2G的磁盘空间!这浪费可是有点大啊。
% e" |8 G' R0 g, q3 T# t7 s, c$ s. ~$ J- Y$ J" m0 Z
        还有一位主张位图法,这个方法更简单,对每个磁盘块,如果已经被使用,那就标记为1,没被使用就是0。这样整个磁盘块就形成了一个由0和1组成的一个大位图。, N8 p5 A: y' Z5 G0 x# q" w* M; M
$ L; ^; N3 T- @1 _
一块硬盘的自述 0和1.png
7 E9 W2 J& B9 S! M8 O) j8 j* C

' A- U4 S0 l2 U2 z6 `        由于每个磁盘块只用一个位来表示,非常节省空间,这个方案我喜欢!#j327:5 h" m& |' V0 C) q0 Z  [' r
        7 A! g. @) k9 l
文 件 系 统
) N0 S! `% r/ H' G, i; s+ g

5 o1 Z6 p  v, r. M        扯了这么多,是时候看一看全局了,在你们程序员的眼中,其实我是长这个样子的(拿Linux ext2为例):2 |7 n# z+ y5 [
/ g# o. Z/ ?1 |& J- Y
一块硬盘的自述 linux ext2.jpg

1 y, y( N2 g% _0 S# u3 \* a7 }2 y3 f
        我这个硬盘主要由MBR(Master Boot Record)和各个磁盘分区组成。/ {/ |, q" A: S, R$ o1 |* K
& k( h0 Q# A4 t8 @, l  a  J# B
        MBR中的有引导代码和磁盘分区表,分区表中记录了每个分区的起始位置,以及哪个磁盘分区是活动分区,这样系统就会找到它,然后装载这个分区中的引导块,并执行之。
% e& y! h2 e, r. [: n- ^: t
+ g; Z) G3 h+ V! T2 A0 I* D        引导块将会装载存存储在本分区的操作系统。需要注意的是,每个分区都有一个引导块,不管这个分区有没有操作系统,这是各大厂商的约定,是一种标准。
+ ~& W3 ]8 T5 X) ?, J+ _, T  A$ F2 p3 [9 J- J1 W
        每个分区除了必须的引导块之外,又被分成多个块组。
5 U: n3 f( {$ I6 Q4 Q3 }+ U( [$ Z# W
        在每个块组中你能看到熟悉的磁盘块位图和inode位图,不用解释估计你也知道是干嘛的。还有inode表(当然是存放文件和目录的inode了)和真正的数据块。7 V( ^* V1 X2 b; |( W0 F
1 H3 H$ i+ J% e$ ?% h: N2 T
        对了,我的磁盘分区表只有64个字节,而每个分区项占用16个字节,所以只能容纳4个分区。如果你想用多于4个分区,你就需要把其中一个设为扩展分区,然后在其中继续划分成逻辑分区,想划几个就划分几个。
' p' I2 u; T. q+ w, O3 f

6 t) H2 f$ \" F+ R% ?* r0 g1 K3 L        一般情况下,大家都喜欢把我划分成一个主分区+一个扩展分区,在扩展分区中再需要划分。
; j  r" a( `! D# D; c) B, `& k
  e7 w1 ^: P7 p! V
上一篇
下一篇


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

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

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

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

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

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

以前不懂 ,+ V& o3 S$ ~( T0 c8 W, c4 U
看贴总是不回 ,
1 E2 ?) H) p* c一直没提升等 级和增加经验 ;
. i/ j1 I4 n; ]. t* l- x. @' ]现在我明白了 ,3 g  w+ `  ]! {
反正回贴 可以升级 ,: N+ a, Y7 H, q" ~, z# k# v7 R
也可以赚经验,- T, N6 A4 e9 Z# E& z. Q

2 C! f) C1 U$ f2 ?9 V
; L8 ]4 q# a0 I5 ~而升级又需要 经验," ]# @% Z- X: V% [/ D

$ [& V4 Y& _. l% E我就把这句话复制下来,
6 L( m1 x- B7 A) s' b遇贴就回 ,
& ]. ^4 {: e: Z5 C/ J$ F# g9 O捞经验就闪#y421:
LonelyGorge 「初入古黑」 2019-3-12 21:38 |显示全部楼层

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

以前不懂 ,. S# m: K; K, F, j! c* U' j: A( {; K
看贴总是不回 ,3 i/ C1 y. G+ q) N7 l3 z/ m8 S% y0 \. E; p7 P
一直没提升等 级和增加经验 ;$ m# h2 i. [: M! [3 a) b2 |. V5 v* P  Z+ `* h' P: T
现在我明白了 ,; t; M+ G4 I  D1 t: p; \; j9 p9 h' e8 A2 }/ F6 W6 @
反正回贴 可以升级 ,4 U) ?8 M# l' n
也可以赚经验,4 V* n* P5 l( o% T4 v# _( Q3 y$ |2 ^7 H$ Z9 t0 w
* f+ v! a% }6 }& ^* x# N& n# u
! k0 @. @+ @+ w' g/ i$ J8 Z8 `4 y- A
而升级又需要 经验,: b7 I3 r8 l. Q+ F) q2 ~0 p4 j+ D  Q$ M7 ]; h

) U7 U* L* P- v! H6 R我就把这句话复制下来,2 W6 l2 O8 n6 x# Q! g1 U  i/ n1 i4 t+ ^2 ^( j' W
遇贴就回 ,: V) Q+ Q2 o- S+ o, g1 M. {5 M1 d
捞经验就闪#y421:
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

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

GMT+8, 2021-5-12 19:00 , Processed in 0.029412 second(s), 19 queries , Redis On.

© 2015-2021 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表