登陆 / 注册 搜索

USERCENTER

站内搜索引擎

查看:4317| 回复: 4
打印 上一主题 下一主题

一块硬盘的自述

[复制链接]
跳转到指定楼层
楼主
仗剑天涯吾是土豪 发表于 2017-6-27 22:54:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
        我是一个非常精密的存储介质,虽然具有坚固冰冷的外表,让人有种冷酷到底的感觉,但是你们却不知道我的内心是非常脆弱的~$ U6 F& ]; @& a: k3 C  w* }
        8 A4 B# q! j7 Z
        我知道CPU和内存是计算机的核心,毕竟所有的运算最后都得通过他们俩来完成,CPU从内存里要取一条指令,做计算,然后再写回内存,如此周而复始。
, u! w! n5 j4 X, D
2 s7 Z+ b% A# H6 X4 w1 ~        但是这俩货却瞧不起我,说这是什么年代了,还在用机械式操作,读写数据的时候,还得一个磁头在多个盘片上滑来滑去,找来找去,速度慢的要死。
# h) _1 I2 m+ [1 l3 v! C" }6 M
6 \) _/ c8 b( T
 GriffWason_GenericHardDrive_exploded01.jpg 一块硬盘的自述
' J5 d! X& ~9 m
        内存说:“CPU比我快100倍,比你快100万倍,整个系统的速度都被你给拖慢了。”#j318:
3 I+ l% ^; r% B" K2 E
( u4 n9 d1 g1 k, @( ^        他俩还嘲笑我很娇气,得真空、密闭、不能有浮尘、运行时不能震动,一动就坏了。但这俩二货总是会忘记他俩的最大问题,所以我只用一句就把他们俩给噎死:你们俩断电了怎么办?9 f8 l, d4 Z% f. H5 ^: G" X; ?7 t. {

: Q2 E* h' g) C: q; ~+ P        还有我的容量都是按TB,甚至PB来算的,就你们俩那点容量,还笑我?还有,没有我来存储程序,你们从哪儿得到程序,难道要像牵牛星(如下图)一样,手工拨动一排开关来输入程序吗?
+ x2 ]" V/ `6 B) S5 w- T* j$ T
/ R# N( I4 \  z5 s2 d4 G3 Z
 W020150927433549562851.jpg 一块硬盘的自述
, I3 o4 m3 u, s, {
        其实我也很纳闷,为什么你们人类造不出来一个能够断电存储的,大容量的,访问速度快的,当然还要便宜的硬盘来,你们不都上天了吗?要登陆火星了吗?这些基础的材料怎么还无法突破?#j331:# _1 Q9 f) @  b4 W  A" A3 N

+ R0 }1 }% G% o8 w' F6 ]        我憧憬着这么一天的来临,如果能制造出来了,CPU就可以直接访问硬盘了,内存就一边凉快去吧。
4 [8 j* {% X/ p" C6 j6 J6 m, _) B- D# I6 h5 J3 i
        在制造出来之前,你们必须得容忍CPU-内存-硬盘之间的速度不匹配,并且想出办法来解决这种速度的不匹配,比如用缓存、直接内存访问、多进程/线程切换等等方法。
6 m% P& u- h5 f$ ~5 }        
/ S* w" x& X& K0 |
我 的 内 部 结 构

0 h7 c; @; H& g
 硬盘内部.jpg 一块硬盘的自述
! g1 I  `$ y0 X: F7 h
- F, [! D( D* f
        看到没有,我有很多个盘片像串糖葫芦一样被串在一个主轴上,主轴带着他们疯狂的旋转。5 p! y2 D; P2 Q/ y. d: D/ Y7 M

% N) w& i, x6 h8 S3 \$ H3 w+ F2 ^        每个盘片都有很多一圈一圈的磁道,每个磁道又分为一个一个的扇区。
) W3 m# W( y: y) W- Q% o
) \: L) |. U2 k$ u  S7 K        多个盘片上的同一位置的磁道组成了一个柱面(需要发挥一下你的想象力)
) j( b, D$ p+ `
8 x* `7 ?. P: }7 z# V        最后每个盘片上都有可以读写数据的磁头。8 c& x: O7 A6 n6 \
        
5 u7 I% h8 ?* m) I2 v, }) R( y& _# r        所以,如果你想访问我的数据,可以说:把0柱面,0磁头,1扇区的数据给我拿来。
, l3 \' G* c  H! x. e
6 t1 _9 |8 [. U        我就把磁头挪到您指定的柱面,对每个磁盘来讲其实就是指定的磁道,所以这叫“寻道时间
3 j* c* l) Q, ]- Y3 F2 S5 |0 d, h! h# p- d2 \
        然后再旋转磁盘,让磁头指向您指定的扇区,这才能开始读取数据,这叫“旋转时间”,转速快的硬盘能更快的旋转到特定扇区,所以性能会更好些。$ r4 }1 y$ `3 z# F$ S+ `" b
/ e5 _6 D3 q/ e  ~; J- X
什 么 是 文 件
4 O5 E; e2 _/ e9 r) q
        
6 g9 T" Q% l7 n        当然,对于绝大部分人来说,都不想去了解什么柱面磁头扇区这些非人的术语,所以我为懒人们专门提供了一个叫做逻辑块的方式,你看到磁盘就是有一个个“块”组成的,编号为1,2,3,..n。
/ }( v$ \4 G4 ]- S- i3 k' J0 a( d; f# \
4 ~4 n. G) [; T7 z        想取哪一块就取哪一块,比如你说:把第1024号的“块"的数据给我取过来,我在内部就把1024转化成柱面,磁头,扇区,按照上面说的方法寻道,旋转,读取数据。
' u0 z' h* Y/ G$ _* ~# P' m
; m2 `* Y, c" ~, H8 p$ [        但是这还远远不够,比方说你想写个文档,输入了很多字和图片,最后想存到我这个硬盘上,你该怎么操作?#j321:
; R0 {1 }1 }4 L; c! c# f/ ]* i7 _: L1 x- n3 ?
        一种方法是这样的:9 T  m! Q! w" I4 v, n; f& b
        
6 V4 t6 S' q0 z  l        你:硬盘,给我找20个空闲的磁盘块,我想存我的文档。/ d* o* s8 m  p

! \6 [( `, a/ X, N5 T        我:空闲的磁盘块编号是1024,2048,2049,3000,......4 @  J* J1 L$ U' @8 z" m- h  L& D
! K$ k5 S" M% Q: t5 z- N9 Q  h: z
        你:把这些文字和图片存到这些磁盘块上。
0 c7 V) G* ~( H, \/ k4 V. x
3 D- \! g5 l* i) T        我:好的,存完了,你得记住这些块啊,这样下次才能读取。0 ]) E' J9 L) }" s  H, \
% R6 z( W: Q8 |8 I' Q
        你:拿一支笔把这些磁盘块编号都记到本子上。6 ~! I# P+ m$ i
6 o9 c; V  c, O' ~% K
        过了几天......
& N. J; ^* w; i! p) k# |1 |( O& X
        你:硬盘,把1024,2048,2049,3000这些数据给我取出来,我要编辑。) P% B  T- {: g4 W% S/ [4 q
' T/ F0 g: N3 C& m# D
        我:好的,这是你的数据。
/ P" M( ~. t% a( G1 R0 b- A
4 Z! o5 \5 q* P: J$ P/ M        没有人喜欢这种方式,太折磨人了!

. ?' S" H8 ]6 b% @6 T" i       所以你们更喜欢这么做:$ l6 t4 n2 ^5 r& q! {
        
6 D" H* z5 _$ p/ I2 V- m1 O* F        打开word->新建一个文件->输入文字和图片->保存到:D盘\我的文档 目录下。
; I. _) l3 U5 i5 D
- ^) b, N) q/ f, v5 S' A$ s- |        这个所谓的“文件”和“目录”就是我的杰作啊,你再也不需要和烦人的磁盘块打交道,只需要记住你的文件名和路径,一切工作交由我和操作系统老大来搞定。
& |$ c( ~) l8 l  S! U* G* i0 o$ v7 Q
        我和老大商量好了,文件对人类来说是最小存储单位,你想存任何东西,无论多么小,非得建个文件不可。
$ \( O) o8 ^, e0 J! Z# y
+ ^7 u7 A* |0 L  n: B4 K        此外为了让这个世界整洁有序,多个文件可以放到一个目录(其实也是个特殊的文件)里,目录之上还可以有目录,形成一个树的结构。
; U7 n& J5 r5 L  H- z6 K; ]% B! _$ G# J6 [# p
        文件这个东西是个伟大的发明,我估计你们还得再用100年。#j346:
) i' ~8 q# Y# C, t$ M/ c; K        - Q& O3 s7 C& t- J  k* W
文 件 的 存 放
5 ]5 Z) ?/ L; n0 ?, x

' U5 |6 d! [) `" i$ f! K( ~        我日常的主要工作就是对目录和文件做操作,当然需要操作系统老大的配合,好吧,其实是老大在主导。
! K# _8 d6 V4 w2 I' f% {
% M" Q: }7 V  |6 K8 l* u! E2 H        这其中最重要的一个问题怎么去记录各个文件都用到哪些磁盘块?. X+ ]6 {+ g! B  Y( ]
) c  G& |4 x: n1 S% ~
        内存给我支了一招:你可以采用连续记录的方式啊,就像这样。7 }$ I7 N7 p, {

6 k5 W/ V7 `' ]. x; B
 文件的存放.png 一块硬盘的自述
" G' \7 j( ]. B- C  O: W" _: p
- l* P9 \. e4 c. H
        文件1占据磁盘块1-3
. O( F% j1 E* x9 J7 [( E        文件2占据磁盘块8-12
* O) K* @) |! @1 w2 C) r7 n; \        文件3占据磁盘块15-20
9 K0 Q& \* k* q0 R: J
& i; h6 X9 P/ q7 U0 ]
        内存说:这种方法在随机访问文件是效率极好,因为你只要知道了开头和长度,就像数组一样可以随便访问,就像CPU访问我一样,只要给出地址,立刻就能定位到指定的位置。
- C5 j# q& S1 O3 j
2 c' A/ j' h* g5 @        我仔细想了想,内存出的是一个损招,比如说内存磁盘块4-7,以及13-14怎么没用?- z$ I9 {( e. n
$ V/ W. \  N  Z& W. {
        那是因为之前那里也有文件,后来被删除了,留下了空洞,如果之后没有大小合适的文件过来,他们就永远空在那里了。
' o; E# b0 {( ?8 {3 u" w8 z( v7 F2 H/ Y% j$ P
        对我来说这是严重的浪费,这是我不能容忍的。
$ J1 {3 L* k& Q1 R, X5 r8 d
! C5 U9 r" }9 O7 M- q        我说:“小样你以为我看不出来啊,你不就是嫉妒我容量大,让我浪费一点嘛”!4 s. d! l/ U& g- G2 b% B) ?6 p3 V

! N+ A* B2 M2 z3 Z4 {2 e* O4 z        内存坏笑了一下又说:不喜欢也没关系嘛,试试采用链式啊:/ o' T) O/ J" `- F) Z# p

! a; v% Y8 ^+ F& U% G
 链式.png 一块硬盘的自述
. |- Z! J# Z  j
& r6 ?4 w- w/ q" F6 }
        这个文件从第一块磁盘开始,形成一个链1->9->18->8->3,每一块空闲的磁盘都会得到充分的利用,效率非常高。
9 S" k, g. ^' g( i  a/ M
+ k9 n: R/ ?! H8 P3 @; L1 H        我心想:这些码农说的数据结构和算法还真是有用啊,这里也用上链表了。可是这种方式随机的访问效果太差,每次都得从第一块开始,沿着绳子往后找,太痛苦了。+ `: s% ~0 d' I5 m
: I. W5 y( r$ v$ ^
        现在内存已经嘲笑我慢了,用这种很慢的办法,还不得笑死我?操作系统老大说:“别听内存在那里BB了,用索引式!”: I" S. K% H! e; F. \0 ^

, A% X/ L8 H$ u8 b
 索引式.png 一块硬盘的自述

" v6 F5 S$ _: \1 f: T5 S. o) _! A+ \# n- Y  B7 S! a9 S& o
        例如第16号磁盘块专门用来存放文件属性以及该文件所使用的磁盘块。
1 a( E5 o0 E2 ^3 S, z% z0 u9 x/ z& L* w: i* `1 ]
        老大把这个磁盘块叫做inode,通过它可以轻松的找到这个文件所使用的所有磁盘块,无论是顺序访问还是随机访问都很快。# Q) d  U7 ]# c  K5 J2 h
* w, e' x% Q) O0 w$ o3 J  V( D
        唯一的缺点是得用额外的磁盘块单独存放inode。
7 a+ y0 `( Q4 ^  C( s2 r' j8 T/ r; f* F& v( r( c
        我觉得挺好,没有十全十美的东西,折中达到平衡最重要!就是它了!#j325:3 V1 \8 S4 L* W" V5 S+ s" H
- X; m3 N+ o5 I# ~. ~* s
        我问老大:每个文件都需要有个inode来描述,每个目录是不是也需要一个?
& N( I3 X8 p& R& f  y5 k( B1 P! }; Z) C3 M
        ”这是自然,和文件一样,每个目录也是一个inode,其中有目录的属性,还有存放这个目录内容的磁盘块号,在磁盘块中才真正的存放着目录下的内容“。/ m' d9 u3 c$ q7 [( D: n
/ y& h, |  D. y- {6 X( R8 [
 内容.png 一块硬盘的自述

3 m" z* w7 f2 T. [
! @! o9 i/ i% b" l8 s, k: v$ m        “举个例子来说吧:有人要读取/tmp/test.log这个文件,查找次序是这样的:根目录inode->根目录磁盘块->tmp目录inode->tmp目录磁盘块->test.log的inode->读取磁盘块”1 Q. z& b5 W: N/ M$ {
: l6 m# F5 ]3 ?4 |6 z
 读取磁盘块.jpg 一块硬盘的自述

5 x  t) Z; k+ `3 [9 X) s5 _& ^1 D: O2 o- t( L
        内存说:“卧槽!这也太绕了吧,比CPU访问我的数据麻烦多了,硬盘,你要小心点,这要是操作不当的很容易出乱子的。”#j340:# e# E% _" H! j: _, t( m

$ s9 n/ |1 N4 ~' i) q7 d        我心想内存这次没坑我,他提醒的对,这操作确实有点复杂,读数据的时候还行,如果是修改,尤其是删除就很容易出事,例如想删除上面的文件/tmp/test.log,需要这些步骤:6 o0 s' x3 e# h5 H' v
        - n1 p9 z$ p# j
        (1)在目录中删除文件
  T& S+ W" d0 @. N+ P$ K        (2)释放inode到空闲的节点池,这样可以复用1 B- w* p9 i2 w. P
        (3)将磁盘块释放到空闲的磁盘块池
6 e0 Y0 q/ s  x9 W

  O( y- f+ U5 ]( R3 K" X6 q        在操作某一步的时候出现系统崩溃,那我这些个目录和文件就凌乱了,可能会出现空间无法释放的情况。
4 k; p0 b0 D: n7 a1 n' M* a3 a2 ?/ m' T- l/ [; B, h0 m' |
        系统老大说:“这确实比较烦,不过也能解决,听说过数据库是怎么办的吗:记录日志!”- p% T) \8 n! @

) [; L$ N6 U: b$ Z; `; a        ”就是把要做的事记录下来?“5 V3 ^: B) x& g" g3 ~

& @/ Z* p9 L  u; V7 s6 x/ r5 z' y        “是的,在做操作之前,记录要做的事情,形成日志,把他们成功写入磁盘以后再正式动手操作,等到所有步骤都搞完,才可以擦除日志项。你想想,如果执行到某一步崩溃,系统重启时检查日志项,就知道哪些没做,哪些已经做了,对于没做的日志,重新来一遍就是了”。8 A5 Z3 T5 |& w
/ d5 O* u! y) `9 L
        其实说的很轻松,实施起来还是挺难的,重新执行就意味着那些操作一定是可以重复执行,并且不会带来破坏才行。
) ^7 h1 U$ C* S3 x- g9 _
9 _4 q/ \0 f0 K
管 理 空 闲 块
) n( X( \, {& i0 U5 s2 a$ b( [. F

$ o5 \- ?% o6 h. C' R        目录和文件的存储问题解决了,接下来我需要一个大管家,把那些没有使用的、空白的、数量上亿的磁盘块给管理起来,只有这样,新的文件来的时候,才能分配空间存储。- o' {% |' X+ s8 x% f' Z2 @! M

. r0 C  ~( M, ]6 I. J5 }! T& l8 \7 D        操作系统老大给我推荐了两位,第一位主张是链式大法好,无非就是把空闲磁盘块组成一个链表(又是链表!),但是我心里盘算了一下:如果磁盘块号是32位的,每个块都得花费我32位的空间,如果我有5亿个空闲块,那仅仅为了记录他们就要占用接近2G的磁盘空间!这浪费可是有点大啊。6 e0 E+ O, D" X# p/ i0 V3 N% g
& @* }7 X  S0 r1 p- q& r7 x
        还有一位主张位图法,这个方法更简单,对每个磁盘块,如果已经被使用,那就标记为1,没被使用就是0。这样整个磁盘块就形成了一个由0和1组成的一个大位图。
) E  E- P& t$ a3 J
* e- d: |6 l3 s: C4 {# z
 0和1.png 一块硬盘的自述

" c% P  s6 r. X0 R5 U4 o# `3 k0 D/ E8 T  h- C
        由于每个磁盘块只用一个位来表示,非常节省空间,这个方案我喜欢!#j327:) _# c8 w, a& f7 G- q( H
        
; C* F* L7 N( V/ z4 r1 L
文 件 系 统

3 I* L  u) ^" m! Z" ^/ |7 b1 c& ?: y! Y3 l, g# r3 _$ ?5 Z
        扯了这么多,是时候看一看全局了,在你们程序员的眼中,其实我是长这个样子的(拿Linux ext2为例):( E: b8 \# y7 K, U- ?/ w
- \* _2 l$ q: j# B
 linux ext2.jpg 一块硬盘的自述
: ]6 u; S- ]/ w. s' _  U
& r8 S+ y( Q, R- A+ y
        我这个硬盘主要由MBR(Master Boot Record)和各个磁盘分区组成。
- v& N0 C9 T( y% d* a2 F% ]6 L3 T
        MBR中的有引导代码和磁盘分区表,分区表中记录了每个分区的起始位置,以及哪个磁盘分区是活动分区,这样系统就会找到它,然后装载这个分区中的引导块,并执行之。
& F/ S6 r8 ^* V. M
3 O% c+ q8 j; n! W        引导块将会装载存存储在本分区的操作系统。需要注意的是,每个分区都有一个引导块,不管这个分区有没有操作系统,这是各大厂商的约定,是一种标准。
7 J# O" V6 H+ L7 F. m% `# I2 T
) R4 S+ Q& y  L6 B7 O- Z2 J        每个分区除了必须的引导块之外,又被分成多个块组。
# m0 Z, ?9 Y. `. ~% e7 H% C+ H4 Y
        在每个块组中你能看到熟悉的磁盘块位图和inode位图,不用解释估计你也知道是干嘛的。还有inode表(当然是存放文件和目录的inode了)和真正的数据块。
$ l, q7 Z# z9 }- B, t* U7 Z! V3 G, R
, l1 W0 `1 u/ `2 h        对了,我的磁盘分区表只有64个字节,而每个分区项占用16个字节,所以只能容纳4个分区。如果你想用多于4个分区,你就需要把其中一个设为扩展分区,然后在其中继续划分成逻辑分区,想划几个就划分几个。+ _  N  J% X7 J! Y8 l5 U# `
3 u' [. j% f2 q( s
        一般情况下,大家都喜欢把我划分成一个主分区+一个扩展分区,在扩展分区中再需要划分。3 {8 v$ Q0 v" P" F: t. S- }# _, Y8 [; {

% J( i; Z4 ]* r% d
上一篇:一个键盘的自述摘要:我是一个键盘,和我的兄弟鼠标一样,是个典型的输入 ...
下一篇:一个进程的自述摘要:我听说我的祖先,一生只能帮助人类做一件事,如果你 ...
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2019-6-25 11:27 , Processed in 0.126487 second(s), 56 queries , Redis On.

© 2015-2019 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表