有些事情本身我们无法控制,只好控制自己。 收藏本站
登陆 / 注册 搜索

阅读: 6.2K   回复: 4

一块硬盘的自述

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

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

主题破百
        我是一个非常精密的存储介质,虽然具有坚固冰冷的外表,让人有种冷酷到底的感觉,但是你们却不知道我的内心是非常脆弱的~% b) J' h' o4 j! d* k( b
        ; [' E2 z3 k+ c6 K  I& q  w
        我知道CPU和内存是计算机的核心,毕竟所有的运算最后都得通过他们俩来完成,CPU从内存里要取一条指令,做计算,然后再写回内存,如此周而复始。$ Z2 M; O3 g% ?0 K, W7 s7 c

+ C# A. i7 g% R# [5 m+ @' R        但是这俩货却瞧不起我,说这是什么年代了,还在用机械式操作,读写数据的时候,还得一个磁头在多个盘片上滑来滑去,找来找去,速度慢的要死。2 I; C; r' U+ |$ r+ a' @

/ A0 Z2 {7 m: R& x/ b
一块硬盘的自述 GriffWason_GenericHardDrive_exploded01.jpg
" A( `7 U' A; f
        内存说:“CPU比我快100倍,比你快100万倍,整个系统的速度都被你给拖慢了。”#j318:. X/ u  {% e* g) C

% G! x- I/ d, |! b) f) Y        他俩还嘲笑我很娇气,得真空、密闭、不能有浮尘、运行时不能震动,一动就坏了。但这俩二货总是会忘记他俩的最大问题,所以我只用一句就把他们俩给噎死:你们俩断电了怎么办?% ]0 Y: s3 P4 i* O) x

5 T) O3 j! a9 R  Q        还有我的容量都是按TB,甚至PB来算的,就你们俩那点容量,还笑我?还有,没有我来存储程序,你们从哪儿得到程序,难道要像牵牛星(如下图)一样,手工拨动一排开关来输入程序吗?
' ?* n8 U$ W1 x3 _+ g9 E4 A
! C: }; F- K/ u
一块硬盘的自述 W020150927433549562851.jpg

3 Y; A/ T1 J  p) J% n3 B        其实我也很纳闷,为什么你们人类造不出来一个能够断电存储的,大容量的,访问速度快的,当然还要便宜的硬盘来,你们不都上天了吗?要登陆火星了吗?这些基础的材料怎么还无法突破?#j331:& \1 R  Z5 h+ N/ ^& Y/ Z. C# ^
2 \$ ]( Q! a- A1 S& O
        我憧憬着这么一天的来临,如果能制造出来了,CPU就可以直接访问硬盘了,内存就一边凉快去吧。
6 x  o' X' I4 X5 p2 q8 B( N8 v: ], ]  w# \# a8 A; g
        在制造出来之前,你们必须得容忍CPU-内存-硬盘之间的速度不匹配,并且想出办法来解决这种速度的不匹配,比如用缓存、直接内存访问、多进程/线程切换等等方法。. G9 e3 M  `( p7 Z& k/ q4 n
        9 x! F* {, ]9 R5 `8 A$ x1 q
我 的 内 部 结 构

! X& J+ Q6 t" [
一块硬盘的自述 硬盘内部.jpg

! S$ K# `$ n& I4 B* \5 F9 S9 e+ e5 k
        看到没有,我有很多个盘片像串糖葫芦一样被串在一个主轴上,主轴带着他们疯狂的旋转。
1 y. Z  I6 u! C# v# s  W3 G+ Z3 h2 @6 [; L) n( f) S
        每个盘片都有很多一圈一圈的磁道,每个磁道又分为一个一个的扇区。
/ n) A7 e  X7 B5 u- L+ f- h1 d. s! e: Y
        多个盘片上的同一位置的磁道组成了一个柱面(需要发挥一下你的想象力)
3 j) @4 }3 X! T: x9 ^) m) m/ D' P4 ~* C' u$ M
        最后每个盘片上都有可以读写数据的磁头。
9 h+ q* N- n) }5 B+ p1 Y        
7 z, p- ]5 g- k4 q        所以,如果你想访问我的数据,可以说:把0柱面,0磁头,1扇区的数据给我拿来。
7 I! |0 a$ L& V; Y" M
! D: D- l$ }' Q9 c% Q        我就把磁头挪到您指定的柱面,对每个磁盘来讲其实就是指定的磁道,所以这叫“寻道时间  D; i. n5 I5 s  _! W
8 n% _8 r; @% `* A) O$ A3 y& o
        然后再旋转磁盘,让磁头指向您指定的扇区,这才能开始读取数据,这叫“旋转时间”,转速快的硬盘能更快的旋转到特定扇区,所以性能会更好些。) D$ C, |4 T' d
2 |+ ]/ ]% V& e  F
什 么 是 文 件

& i& X7 E9 U) i: O        
" ?2 T" x4 Y! K" d        当然,对于绝大部分人来说,都不想去了解什么柱面磁头扇区这些非人的术语,所以我为懒人们专门提供了一个叫做逻辑块的方式,你看到磁盘就是有一个个“块”组成的,编号为1,2,3,..n。
# u, d4 |& b0 x8 |6 A. I7 A
! @7 H$ s5 r) B8 a5 Y5 X        想取哪一块就取哪一块,比如你说:把第1024号的“块"的数据给我取过来,我在内部就把1024转化成柱面,磁头,扇区,按照上面说的方法寻道,旋转,读取数据。
7 P# ?7 b; |' t7 i2 L" Z4 y/ D" I; o% q' C8 _
        但是这还远远不够,比方说你想写个文档,输入了很多字和图片,最后想存到我这个硬盘上,你该怎么操作?#j321:1 x& D9 v; a, n
+ W2 B- I7 p* P. r
        一种方法是这样的:
# @2 V  E7 o6 Q% U3 ?  ^! {0 |7 L        
4 J9 T: j& k( \        你:硬盘,给我找20个空闲的磁盘块,我想存我的文档。
& I- \& ]1 D$ c8 S. _1 V  l* W  L
. J8 j% S3 z* q5 K" ^" I+ l* p        我:空闲的磁盘块编号是1024,2048,2049,3000,......0 g* z) Q. o  d. N5 K; _

/ H+ P- {  e7 [& ~3 p% {  }% D1 J4 Q9 b        你:把这些文字和图片存到这些磁盘块上。
  N4 ?% t9 v7 p# f8 ]4 G4 n  C
- l9 m9 Q* I- \3 K* T. C2 P1 {        我:好的,存完了,你得记住这些块啊,这样下次才能读取。
1 X* R; w& K: }$ G3 Q" D: w
2 F0 n+ D+ O- h        你:拿一支笔把这些磁盘块编号都记到本子上。) n& ?. D. e' l

$ A. m: o" ?& H( @        过了几天....../ F& [( I3 |2 {  {) T0 |6 A
5 P0 g+ |( a7 ~
        你:硬盘,把1024,2048,2049,3000这些数据给我取出来,我要编辑。
' ~6 e+ B: u& [% s1 N7 {
0 u; q1 n8 t7 o6 u: ?6 D6 X        我:好的,这是你的数据。. f1 p3 R1 |: `: M
- C9 ~" D  U8 l& R- P8 q2 d
        没有人喜欢这种方式,太折磨人了!

# h$ o' K3 E# q0 Z       所以你们更喜欢这么做:6 n' J) u, M+ {- n! R' J
        
8 Q2 R7 q' g# e        打开word->新建一个文件->输入文字和图片->保存到:D盘\我的文档 目录下。& G" w* P9 k. i- Q8 u; v1 G

, c/ w% T: s! @; u! E        这个所谓的“文件”和“目录”就是我的杰作啊,你再也不需要和烦人的磁盘块打交道,只需要记住你的文件名和路径,一切工作交由我和操作系统老大来搞定。
, l, [  h, U7 Y3 D! X
' G( {# U6 k/ {1 I; Z3 p; r5 ]        我和老大商量好了,文件对人类来说是最小存储单位,你想存任何东西,无论多么小,非得建个文件不可。
, D) M* T+ X) r8 ]7 I9 b( y+ w9 E! h& J( w9 G
        此外为了让这个世界整洁有序,多个文件可以放到一个目录(其实也是个特殊的文件)里,目录之上还可以有目录,形成一个树的结构。
0 s, l! t, \/ U3 ^- N9 H, ?* j8 n( [
        文件这个东西是个伟大的发明,我估计你们还得再用100年。#j346:/ b8 C0 e$ N; _. A( ~
        
' ?7 Y  K# p9 h) a% f
文 件 的 存 放

, p" s& L4 f" Y+ U5 Q, W' X' y3 F, y/ F- E  z- z+ N& |! ?
        我日常的主要工作就是对目录和文件做操作,当然需要操作系统老大的配合,好吧,其实是老大在主导。# C. s5 ]/ D) S- o. N
/ X( c# S* `& G% e! h+ @. z) m
        这其中最重要的一个问题怎么去记录各个文件都用到哪些磁盘块?. P. @) U( L; L) f

9 b+ ~2 q/ M: I( I1 e1 m7 H        内存给我支了一招:你可以采用连续记录的方式啊,就像这样。1 M, V7 m9 G7 L
% `( C4 U8 O- e0 f0 S' Y, |
一块硬盘的自述 文件的存放.png
* h. |/ \: m2 h  X1 j5 I  {/ Z

$ S! H1 R& O+ S$ w        文件1占据磁盘块1-33 c% v% M# \4 R) c) C+ Q( w2 N/ Q
        文件2占据磁盘块8-12
; o: o3 {9 j0 [9 \$ u8 j7 L        文件3占据磁盘块15-20

; m' h& L0 l' r$ F& S" L9 a
; k0 x7 x2 j$ V0 j$ Z6 Z1 o5 y        内存说:这种方法在随机访问文件是效率极好,因为你只要知道了开头和长度,就像数组一样可以随便访问,就像CPU访问我一样,只要给出地址,立刻就能定位到指定的位置。
7 c# r7 r# s1 ^7 \* k$ A+ H. l0 m+ D8 u( Z4 N# o
        我仔细想了想,内存出的是一个损招,比如说内存磁盘块4-7,以及13-14怎么没用?
2 ?! X. N- Q, K3 [7 x1 M4 m& b1 y% _, Q
. X0 F+ a+ H+ \% G        那是因为之前那里也有文件,后来被删除了,留下了空洞,如果之后没有大小合适的文件过来,他们就永远空在那里了。
' w, q: q  ]4 p3 B8 N% I$ T
" y& }6 `# d6 T2 ?% A3 e* w        对我来说这是严重的浪费,这是我不能容忍的。! A/ L  g( s) e+ v  M7 c

9 _$ _1 g& i7 r0 p        我说:“小样你以为我看不出来啊,你不就是嫉妒我容量大,让我浪费一点嘛”!
0 k7 V1 O4 I' f1 x
& L- d- y" B7 H4 @) W) @        内存坏笑了一下又说:不喜欢也没关系嘛,试试采用链式啊:
* ?2 i% I( d7 p. t7 q' K4 Z' i% i- t# ]" X" U3 W+ Y
一块硬盘的自述 链式.png

" ?; g, l$ Q; T  p! c' c; K
5 w7 y  h1 G& E& V4 p        这个文件从第一块磁盘开始,形成一个链1->9->18->8->3,每一块空闲的磁盘都会得到充分的利用,效率非常高。3 O. U1 b. I$ j' k

( p* F. L" h+ `: D2 {        我心想:这些码农说的数据结构和算法还真是有用啊,这里也用上链表了。可是这种方式随机的访问效果太差,每次都得从第一块开始,沿着绳子往后找,太痛苦了。
; X% l: |& o* `' |) @1 c/ L9 ]4 P3 f9 J: s+ b: b5 G
        现在内存已经嘲笑我慢了,用这种很慢的办法,还不得笑死我?操作系统老大说:“别听内存在那里BB了,用索引式!”
/ E  f9 q8 b2 {6 J
- l( g% H$ k' p/ k) h5 ]' k7 ]- @
一块硬盘的自述 索引式.png
: V0 P! w# ]3 }7 @7 U- s: h9 _/ g

0 y/ K8 C& G3 t9 E. u; y* n        例如第16号磁盘块专门用来存放文件属性以及该文件所使用的磁盘块。
, x7 i' c3 s3 i3 s
: O8 ?+ i& N! o' L        老大把这个磁盘块叫做inode,通过它可以轻松的找到这个文件所使用的所有磁盘块,无论是顺序访问还是随机访问都很快。3 l, o; g% B3 _' Q1 |) d
( z9 m" Z6 y, }. w
        唯一的缺点是得用额外的磁盘块单独存放inode。
) j7 ~% z* l2 d0 K( M9 w* U& m7 i6 p7 n9 t7 C5 k
        我觉得挺好,没有十全十美的东西,折中达到平衡最重要!就是它了!#j325:
2 m+ h9 Q  C$ m1 D; M! Y
& S0 H+ q% |2 I8 Y+ a        我问老大:每个文件都需要有个inode来描述,每个目录是不是也需要一个?
& M8 D: D6 E* h
% a# S* p$ y1 W        ”这是自然,和文件一样,每个目录也是一个inode,其中有目录的属性,还有存放这个目录内容的磁盘块号,在磁盘块中才真正的存放着目录下的内容“。
1 Y4 U% y& ]. L. ^% [8 I; I$ _! y* q
一块硬盘的自述 内容.png

* b8 I" r% b2 g: b: h+ w1 ~) M
7 ]8 }  W$ K4 g+ C7 F        “举个例子来说吧:有人要读取/tmp/test.log这个文件,查找次序是这样的:根目录inode->根目录磁盘块->tmp目录inode->tmp目录磁盘块->test.log的inode->读取磁盘块”
* U% f& M& A  T: q4 n6 z- }6 x. Q/ f7 n: p2 O* k5 M2 i
一块硬盘的自述 读取磁盘块.jpg

% ]7 X# j1 Z( h  Z# R2 E
: [# P+ E0 _  ^' p$ H! y. M        内存说:“卧槽!这也太绕了吧,比CPU访问我的数据麻烦多了,硬盘,你要小心点,这要是操作不当的很容易出乱子的。”#j340:6 H: Y$ `! a; f) B! ~. k0 ^, x
  u! L) o1 K& F& X6 m. Z. U
        我心想内存这次没坑我,他提醒的对,这操作确实有点复杂,读数据的时候还行,如果是修改,尤其是删除就很容易出事,例如想删除上面的文件/tmp/test.log,需要这些步骤:
% J0 c: l7 m" w  k  ?        
& v) g( ?5 g3 ~  F! t        (1)在目录中删除文件
- U3 K( ^1 a9 @. x* K" m/ W        (2)释放inode到空闲的节点池,这样可以复用
0 Q, T$ R- W/ i        (3)将磁盘块释放到空闲的磁盘块池
) Z' c) b! C, L9 \

1 @, T3 y) z9 j        在操作某一步的时候出现系统崩溃,那我这些个目录和文件就凌乱了,可能会出现空间无法释放的情况。9 z3 o8 j2 T9 u/ s/ i" P
3 r6 a. c. o" l' P) q, E# X" J
        系统老大说:“这确实比较烦,不过也能解决,听说过数据库是怎么办的吗:记录日志!”9 h- j& m* P8 J* h
0 `% ~) p$ W- j0 L) F2 g
        ”就是把要做的事记录下来?“
# A* J3 j, s$ }  e3 `2 v* @' M# l5 z# y, G, l
        “是的,在做操作之前,记录要做的事情,形成日志,把他们成功写入磁盘以后再正式动手操作,等到所有步骤都搞完,才可以擦除日志项。你想想,如果执行到某一步崩溃,系统重启时检查日志项,就知道哪些没做,哪些已经做了,对于没做的日志,重新来一遍就是了”。
$ Y8 g; t+ ~( B! D; D* l( I8 l% h+ D, }/ j1 h
        其实说的很轻松,实施起来还是挺难的,重新执行就意味着那些操作一定是可以重复执行,并且不会带来破坏才行。
/ j5 R) O, w/ j/ I: a: o8 F( [" a$ J
管 理 空 闲 块

, e- X1 t8 J! Z- Z/ l3 r, ?6 F5 R, R4 `
        目录和文件的存储问题解决了,接下来我需要一个大管家,把那些没有使用的、空白的、数量上亿的磁盘块给管理起来,只有这样,新的文件来的时候,才能分配空间存储。
/ W) Z/ F5 J# V+ X' [- D7 V; L4 q% k# q, f5 G, k
        操作系统老大给我推荐了两位,第一位主张是链式大法好,无非就是把空闲磁盘块组成一个链表(又是链表!),但是我心里盘算了一下:如果磁盘块号是32位的,每个块都得花费我32位的空间,如果我有5亿个空闲块,那仅仅为了记录他们就要占用接近2G的磁盘空间!这浪费可是有点大啊。* l. x5 h" p  J( i+ V" Q! ^
0 }+ L' y, Y# J( ^  N3 W# u
        还有一位主张位图法,这个方法更简单,对每个磁盘块,如果已经被使用,那就标记为1,没被使用就是0。这样整个磁盘块就形成了一个由0和1组成的一个大位图。
) @1 x1 C' O; P$ t. B" |- m! f9 |' I' ~; }
一块硬盘的自述 0和1.png

1 u; C! [1 x9 s% r: S8 y3 D' G# g. W: `
        由于每个磁盘块只用一个位来表示,非常节省空间,这个方案我喜欢!#j327:+ m* y! d+ t1 L
        
6 g# S; B' O% k' W9 a7 q
文 件 系 统
9 ?& }! \2 J; q! i7 U6 \
2 g% O. f5 x; I
        扯了这么多,是时候看一看全局了,在你们程序员的眼中,其实我是长这个样子的(拿Linux ext2为例):" D; C; E0 x4 y; d& L  E0 D9 t- V; j
1 O  y( L! ~# i3 \) I7 g
一块硬盘的自述 linux ext2.jpg
5 p! V& m6 T# p$ E; W9 _' t0 M8 a

: A) i  q$ i! |- H4 l* G' \        我这个硬盘主要由MBR(Master Boot Record)和各个磁盘分区组成。% ]# }( R" a, T) e
9 x  I( V% ?6 L- f/ I
        MBR中的有引导代码和磁盘分区表,分区表中记录了每个分区的起始位置,以及哪个磁盘分区是活动分区,这样系统就会找到它,然后装载这个分区中的引导块,并执行之。
( I. t$ i% j" V/ \% l& r# `- I! N* e. e. s: _8 a! c$ n6 s% g
        引导块将会装载存存储在本分区的操作系统。需要注意的是,每个分区都有一个引导块,不管这个分区有没有操作系统,这是各大厂商的约定,是一种标准。' O+ a3 e1 ~( k7 k5 @) t& x% p
' K, _& q1 q+ D0 ~1 G
        每个分区除了必须的引导块之外,又被分成多个块组。: @$ N  E& e: U6 l8 p

& g3 _' Y' b  _8 {; {        在每个块组中你能看到熟悉的磁盘块位图和inode位图,不用解释估计你也知道是干嘛的。还有inode表(当然是存放文件和目录的inode了)和真正的数据块。
. N; [  X+ r2 \: @
% A6 n& E! d& |3 W% z' Z        对了,我的磁盘分区表只有64个字节,而每个分区项占用16个字节,所以只能容纳4个分区。如果你想用多于4个分区,你就需要把其中一个设为扩展分区,然后在其中继续划分成逻辑分区,想划几个就划分几个。
  s$ M1 g2 y0 D) G- _

( k* }) E; \, Z# v. f% X        一般情况下,大家都喜欢把我划分成一个主分区+一个扩展分区,在扩展分区中再需要划分。
9 m3 Y$ G/ K- V* |) I7 V
( H' a* O; i6 E  a7 B  _! }
上一篇
下一篇


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

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

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

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

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

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

以前不懂 ,6 v1 A1 L! m8 R* ~, [
看贴总是不回 ,' V* u, {. g. J6 W
一直没提升等 级和增加经验 ;
2 {/ [* z3 D7 D7 l4 k" P. p8 {现在我明白了 ,+ k# V7 o6 p4 |$ S
反正回贴 可以升级 ,
) T" Q0 A# I# @/ R/ C也可以赚经验,0 Z0 M+ P  V* ~* g2 H. m

# n3 x( e+ w. j( J- ], j
2 z% R6 i+ G. F7 p2 h而升级又需要 经验,
9 j  W1 U7 x+ H0 W; I" ]
3 x! }6 [% y" Z我就把这句话复制下来,
; S) x, r# `1 x% Q遇贴就回 ,  Y! k; A8 |# ^, M' {
捞经验就闪#y421:
LonelyGorge 「初入古黑」 2019-3-12 21:38 |显示全部楼层

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

以前不懂 ,. S# m: K; K, F, j
3 b& `# U  y1 ]* n" L0 A看贴总是不回 ,3 i/ C1 y. G+ q) N7 l3 z( B, J1 @7 j' z; _8 i* }
一直没提升等 级和增加经验 ;$ m# h2 i. [: M! [3 a) b2 |
, J+ z3 C. v# U" r+ @8 ^6 B现在我明白了 ,; t; M+ G4 I  D1 t: p; \; j/ o* D& ^+ n$ w7 k1 `6 m! v
反正回贴 可以升级 ,
4 c5 i. Z8 \' ~( t- L" k也可以赚经验,4 V* n* P5 l( o% T6 @/ X2 O2 C+ S) t: n) u1 b& l( }
* f+ v! a% }6 }& ^* x# N& n# u
+ z$ ^) j2 W# I& q- |
/ u8 F) V' Q# {' u6 U- K而升级又需要 经验,: b7 I3 r8 l. Q+ F) q2 ~* M- g" o, I/ `  W' i
6 c- `4 E* w7 x2 G
我就把这句话复制下来,2 W6 l2 O8 n6 x# Q! g1 U# o/ i+ B, G7 v$ i( |4 J+ i0 }* E' g
遇贴就回 ,
* A3 M+ s' K7 O- G0 z# \) p捞经验就闪#y421:
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

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

GMT+8, 2021-10-20 05:03 , Processed in 0.023404 second(s), 18 queries , Redis On.

© 2015-2021 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表