与其被自己的本性牵着走而痛苦,倒不如试着改变自己。 收藏本站
登陆 / 注册 搜索

阅读: 5K   回复: 4

一块硬盘的自述

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

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

主题破百
十万人都在学习的网络安全知识
        我是一个非常精密的存储介质,虽然具有坚固冰冷的外表,让人有种冷酷到底的感觉,但是你们却不知道我的内心是非常脆弱的~
3 R) {7 n% L$ G0 F: K        
& r" l. `8 |# z$ u        我知道CPU和内存是计算机的核心,毕竟所有的运算最后都得通过他们俩来完成,CPU从内存里要取一条指令,做计算,然后再写回内存,如此周而复始。; P% P; X, M. R6 j$ U5 N# x

9 L1 D% w# Z8 K" o/ I) Q$ _        但是这俩货却瞧不起我,说这是什么年代了,还在用机械式操作,读写数据的时候,还得一个磁头在多个盘片上滑来滑去,找来找去,速度慢的要死。' {' \1 r3 I8 B; c! Q! F
5 Z% k* \$ [+ N2 I  }! P* ?' j
一块硬盘的自述 GriffWason_GenericHardDrive_exploded01.jpg
0 y: s6 C9 a8 O) w" L
        内存说:“CPU比我快100倍,比你快100万倍,整个系统的速度都被你给拖慢了。”#j318:- T* G  i3 \. k7 S( H, q

: t& J- u+ f4 b) y, @7 t: c5 H; o        他俩还嘲笑我很娇气,得真空、密闭、不能有浮尘、运行时不能震动,一动就坏了。但这俩二货总是会忘记他俩的最大问题,所以我只用一句就把他们俩给噎死:你们俩断电了怎么办?
, e2 D: x6 m* z# Y* N- ^$ I6 J; ]; {
        还有我的容量都是按TB,甚至PB来算的,就你们俩那点容量,还笑我?还有,没有我来存储程序,你们从哪儿得到程序,难道要像牵牛星(如下图)一样,手工拨动一排开关来输入程序吗?
6 F- I- m- ?: n# T1 s4 ?$ N& m2 {8 |5 M% d7 w2 f7 \, t: ~; J
一块硬盘的自述 W020150927433549562851.jpg
9 P' |) W5 `; I9 \4 `% F
        其实我也很纳闷,为什么你们人类造不出来一个能够断电存储的,大容量的,访问速度快的,当然还要便宜的硬盘来,你们不都上天了吗?要登陆火星了吗?这些基础的材料怎么还无法突破?#j331:, \7 R/ v# {4 Q! t- I

& r& T" {9 c4 L6 z2 L" M4 d' B        我憧憬着这么一天的来临,如果能制造出来了,CPU就可以直接访问硬盘了,内存就一边凉快去吧。
) s( b  l9 |& Q( f; d) R% O
$ Q# P: \- t+ _  x4 ^        在制造出来之前,你们必须得容忍CPU-内存-硬盘之间的速度不匹配,并且想出办法来解决这种速度的不匹配,比如用缓存、直接内存访问、多进程/线程切换等等方法。
! x- H# H# i5 _) p8 ^        & A: u3 Q" ^& g! [/ z- f
我 的 内 部 结 构

, H: T* R3 _( K" p/ d" o6 \# u% V
一块硬盘的自述 硬盘内部.jpg
6 A7 `! {  v" U7 B$ N- o2 f2 M$ L
' m" L  B; s) U, N  K$ ?6 q1 @# N
        看到没有,我有很多个盘片像串糖葫芦一样被串在一个主轴上,主轴带着他们疯狂的旋转。
2 y, H4 J4 [5 C# P0 b  `8 _0 P* b
9 A4 D4 ~% Q+ ]9 F        每个盘片都有很多一圈一圈的磁道,每个磁道又分为一个一个的扇区。, p, h- w1 G& @: n5 `4 _) ]" W8 ^

+ {1 R6 C8 k! W* D' ?        多个盘片上的同一位置的磁道组成了一个柱面(需要发挥一下你的想象力)
4 w! h. y1 G, ]
0 v( y" y# k7 f8 P5 m4 G+ b        最后每个盘片上都有可以读写数据的磁头。
7 D- k! m7 \* k) B4 x        8 l  V8 i. @) V. r/ h$ v. l: ?
        所以,如果你想访问我的数据,可以说:把0柱面,0磁头,1扇区的数据给我拿来。
9 }( S& a5 ]0 D$ d7 G& b. g
1 x1 n0 w) `  y" E/ V        我就把磁头挪到您指定的柱面,对每个磁盘来讲其实就是指定的磁道,所以这叫“寻道时间* j, _5 l/ X3 t9 a6 h3 m
+ W/ H2 Q( Y; L! `' R6 R
        然后再旋转磁盘,让磁头指向您指定的扇区,这才能开始读取数据,这叫“旋转时间”,转速快的硬盘能更快的旋转到特定扇区,所以性能会更好些。
7 A! |0 H6 ^3 b& p( q
+ ^8 Q0 o- i3 W0 `7 v. n
什 么 是 文 件

: C# u; L6 ^; {, q' ^( m        5 }6 I8 N1 |# q
        当然,对于绝大部分人来说,都不想去了解什么柱面磁头扇区这些非人的术语,所以我为懒人们专门提供了一个叫做逻辑块的方式,你看到磁盘就是有一个个“块”组成的,编号为1,2,3,..n。
" }; v& c" E# m$ k# v7 L
6 _, _+ |# A4 I9 Q. E4 u        想取哪一块就取哪一块,比如你说:把第1024号的“块"的数据给我取过来,我在内部就把1024转化成柱面,磁头,扇区,按照上面说的方法寻道,旋转,读取数据。
8 Y* v: ]7 @3 g" t, P/ D' D) ~. Y" ]4 }
        但是这还远远不够,比方说你想写个文档,输入了很多字和图片,最后想存到我这个硬盘上,你该怎么操作?#j321:9 t/ g1 [; ~0 O5 K7 S1 u) x* m5 [1 R

; A8 {4 j% |$ `5 l+ J. V5 u4 g        一种方法是这样的:3 a) ]9 I$ K( I; E; c  d* |
        7 Y% }/ W6 z6 R0 `! V$ p! U
        你:硬盘,给我找20个空闲的磁盘块,我想存我的文档。
; v9 O% [* j. ]/ l
$ @1 J0 ~! E  U; c/ u2 {4 l. e8 j3 a        我:空闲的磁盘块编号是1024,2048,2049,3000,......
2 Z: g* L0 z6 b: f9 q* n. A2 Q
' Z" Z& r4 t  g* o1 s- g8 N+ b1 N1 L5 k( W        你:把这些文字和图片存到这些磁盘块上。
- r9 y2 k5 @; m) z5 V. X7 S" y/ G( `% @' g6 m# M
        我:好的,存完了,你得记住这些块啊,这样下次才能读取。: ^4 V: L% w! H6 r' b8 Z
7 F% m8 g3 h; Z& w
        你:拿一支笔把这些磁盘块编号都记到本子上。
% @; h4 T/ E+ J  {8 R2 I5 [) r3 t: p
) z' ?4 z$ M+ N7 x* ]4 D        过了几天......
9 m* B- }" t  o) B& _. S6 u, ~6 Z2 P& U+ |
        你:硬盘,把1024,2048,2049,3000这些数据给我取出来,我要编辑。
& F2 {: U% n5 s% d$ L: r0 b
& n- r8 ~4 K1 o* J0 b$ t1 X) R+ A& r: R; L        我:好的,这是你的数据。
" I0 q9 U1 f2 q7 m: P& |; N8 y, n2 ]* a" f' a" m  D7 x
        没有人喜欢这种方式,太折磨人了!
$ A4 c6 Z! u$ N. T2 M
       所以你们更喜欢这么做:
4 q' h: T* ^+ K3 k, n+ i* i        
2 T6 h  Y7 E- m* N5 `" j: A8 |        打开word->新建一个文件->输入文字和图片->保存到:D盘\我的文档 目录下。2 N- n% e# }5 J

2 R1 L. M! _0 c. f1 Z, c        这个所谓的“文件”和“目录”就是我的杰作啊,你再也不需要和烦人的磁盘块打交道,只需要记住你的文件名和路径,一切工作交由我和操作系统老大来搞定。
  d, W* Y4 ~' D; m/ g
8 G1 ?* G4 w6 t        我和老大商量好了,文件对人类来说是最小存储单位,你想存任何东西,无论多么小,非得建个文件不可。
! M; T* i' V7 |+ R: F; i' |' p$ \7 Q! a, t& R+ Z
        此外为了让这个世界整洁有序,多个文件可以放到一个目录(其实也是个特殊的文件)里,目录之上还可以有目录,形成一个树的结构。# |8 }- \# o/ {6 b9 ~
+ @* y) [' E3 T- z; H- c6 O
        文件这个东西是个伟大的发明,我估计你们还得再用100年。#j346:4 M8 E8 d% i2 B# B2 [
        
4 t4 y% r) s" z
文 件 的 存 放
- s- u: e, L+ {+ W1 s

! g- i9 f& C1 W5 v# |        我日常的主要工作就是对目录和文件做操作,当然需要操作系统老大的配合,好吧,其实是老大在主导。
' f3 X( `, R# M1 B7 T2 k: j8 b( S& O4 M
        这其中最重要的一个问题怎么去记录各个文件都用到哪些磁盘块?
: \1 A& s8 Z) \+ ~: V; e5 G5 i  y
        内存给我支了一招:你可以采用连续记录的方式啊,就像这样。
. v: n4 O6 I% E8 z4 F' b
# l, K) A9 {  [" D" f* Y: V
一块硬盘的自述 文件的存放.png

5 ]7 e/ n0 Z+ Q4 k5 e' o3 ^
- X2 b9 J1 R: N: `) y+ I* W        文件1占据磁盘块1-31 S3 f% F; n5 T
        文件2占据磁盘块8-12# W! S( N3 S9 n8 j$ j, g  f* {: Y
        文件3占据磁盘块15-20
) B1 \* C7 U) Z6 F2 ]+ u" f

/ C3 U2 l- S) ?  @        内存说:这种方法在随机访问文件是效率极好,因为你只要知道了开头和长度,就像数组一样可以随便访问,就像CPU访问我一样,只要给出地址,立刻就能定位到指定的位置。
  q$ P6 T5 ?$ O! u. }6 i! P; y& Q1 A1 F7 `& w( @6 ]: y
        我仔细想了想,内存出的是一个损招,比如说内存磁盘块4-7,以及13-14怎么没用?5 W& a$ s( H1 Z$ i2 Y4 @0 v

, N& \5 ~8 f3 B& q        那是因为之前那里也有文件,后来被删除了,留下了空洞,如果之后没有大小合适的文件过来,他们就永远空在那里了。" s; A' i& P' C% o
# C  L. d! H2 M6 T
        对我来说这是严重的浪费,这是我不能容忍的。# p, q+ z$ ^( ?6 {/ Z. Y
# w0 Q( L5 E# S! q* I" s- f+ }
        我说:“小样你以为我看不出来啊,你不就是嫉妒我容量大,让我浪费一点嘛”!2 G4 x/ b4 W, T# S, h2 e

5 t3 S  K/ Q, n3 r2 i* T+ Y        内存坏笑了一下又说:不喜欢也没关系嘛,试试采用链式啊:% D# r" R/ C. c
5 h- D( m9 }4 }% ]2 d: J
一块硬盘的自述 链式.png

# o- u3 {+ H# Z* V4 p0 y2 [- {; O+ z* k% t& ~
        这个文件从第一块磁盘开始,形成一个链1->9->18->8->3,每一块空闲的磁盘都会得到充分的利用,效率非常高。
' [6 h8 S: f9 r5 x& ^! F2 \$ L6 N3 S  T) [
        我心想:这些码农说的数据结构和算法还真是有用啊,这里也用上链表了。可是这种方式随机的访问效果太差,每次都得从第一块开始,沿着绳子往后找,太痛苦了。3 [$ A) f. P9 n, {

% H0 k% \) S& A0 t  Q        现在内存已经嘲笑我慢了,用这种很慢的办法,还不得笑死我?操作系统老大说:“别听内存在那里BB了,用索引式!”
# b( [6 b0 Q6 J: ]% c
6 ]! [3 ]$ h: ~1 O6 b3 {9 g
一块硬盘的自述 索引式.png
! p: I0 D0 E0 R( ?$ D/ c

2 \4 H; i# ^+ l' G2 S& W        例如第16号磁盘块专门用来存放文件属性以及该文件所使用的磁盘块。- |- v1 {& g0 P2 Q: R

/ z+ Y' q# _& N$ O  T5 V. q        老大把这个磁盘块叫做inode,通过它可以轻松的找到这个文件所使用的所有磁盘块,无论是顺序访问还是随机访问都很快。. ?" U! F# r3 M( k/ E
7 m- `  D9 h% f! s
        唯一的缺点是得用额外的磁盘块单独存放inode。/ p$ ]- o. Y( A; {5 u

% [5 S7 x- r: W        我觉得挺好,没有十全十美的东西,折中达到平衡最重要!就是它了!#j325:
; l' r& O1 \! X3 `8 ~% Y4 i: [, k8 e0 O3 `/ E
        我问老大:每个文件都需要有个inode来描述,每个目录是不是也需要一个?
: b/ u- O6 _, ^5 [4 ~* o! ?
( [' X' j4 h: o% w        ”这是自然,和文件一样,每个目录也是一个inode,其中有目录的属性,还有存放这个目录内容的磁盘块号,在磁盘块中才真正的存放着目录下的内容“。4 _# G* }0 R6 N; m; i/ y' @0 @7 u

, K+ P9 I- ?: \7 B
一块硬盘的自述 内容.png
4 h1 y4 b/ |- Y
. U1 r+ {& S1 G& K* ]) p0 G: J
        “举个例子来说吧:有人要读取/tmp/test.log这个文件,查找次序是这样的:根目录inode->根目录磁盘块->tmp目录inode->tmp目录磁盘块->test.log的inode->读取磁盘块”
& ?4 K4 T: {+ g& I/ s0 v; o8 w  S5 \9 l6 }
一块硬盘的自述 读取磁盘块.jpg
* j" o) ~( }' @/ V/ C) d% G
5 M/ Y9 f' t+ |# Q8 x* h
        内存说:“卧槽!这也太绕了吧,比CPU访问我的数据麻烦多了,硬盘,你要小心点,这要是操作不当的很容易出乱子的。”#j340:
# H) Z# n8 ]7 v6 A% a6 a& b: z! @  }7 \3 U/ B
        我心想内存这次没坑我,他提醒的对,这操作确实有点复杂,读数据的时候还行,如果是修改,尤其是删除就很容易出事,例如想删除上面的文件/tmp/test.log,需要这些步骤:
; D* T  s" }  _! `, }        
+ `2 D9 S& j/ W  C        (1)在目录中删除文件
' [& i/ R2 b: l0 j. c        (2)释放inode到空闲的节点池,这样可以复用6 [0 f" V9 i  z; l# {
        (3)将磁盘块释放到空闲的磁盘块池

; s: [9 o, E: g/ c9 Z9 j: @( z6 l; Z. ^
        在操作某一步的时候出现系统崩溃,那我这些个目录和文件就凌乱了,可能会出现空间无法释放的情况。1 v% t, Z# A% k( G( k6 o

; ~( N/ J+ U" u4 A! q# O& f5 r        系统老大说:“这确实比较烦,不过也能解决,听说过数据库是怎么办的吗:记录日志!”& V. G, o' ^9 B  U3 ], ?
0 Q1 \% Z1 u4 C8 W4 f- I8 L3 m
        ”就是把要做的事记录下来?“
! c# P9 H' W9 o$ A3 c
3 {3 N4 K& z, W        “是的,在做操作之前,记录要做的事情,形成日志,把他们成功写入磁盘以后再正式动手操作,等到所有步骤都搞完,才可以擦除日志项。你想想,如果执行到某一步崩溃,系统重启时检查日志项,就知道哪些没做,哪些已经做了,对于没做的日志,重新来一遍就是了”。
6 v( K3 e+ H" q/ O* D# C; b; \3 ?7 i) e0 r
        其实说的很轻松,实施起来还是挺难的,重新执行就意味着那些操作一定是可以重复执行,并且不会带来破坏才行。/ k; @) X' I5 n+ k8 @- a

7 E' N  j, V/ L
管 理 空 闲 块
$ l) L1 M9 D" w: T: o

+ I: m' Q3 u( x8 p) m6 }. `9 s        目录和文件的存储问题解决了,接下来我需要一个大管家,把那些没有使用的、空白的、数量上亿的磁盘块给管理起来,只有这样,新的文件来的时候,才能分配空间存储。
/ [- q5 L9 E+ J8 P' l3 T' y$ A' }8 e5 n9 B8 j, n1 E
        操作系统老大给我推荐了两位,第一位主张是链式大法好,无非就是把空闲磁盘块组成一个链表(又是链表!),但是我心里盘算了一下:如果磁盘块号是32位的,每个块都得花费我32位的空间,如果我有5亿个空闲块,那仅仅为了记录他们就要占用接近2G的磁盘空间!这浪费可是有点大啊。; a8 B3 h" ^, w. `2 h

3 A  v/ O5 S3 B$ ^2 H1 O        还有一位主张位图法,这个方法更简单,对每个磁盘块,如果已经被使用,那就标记为1,没被使用就是0。这样整个磁盘块就形成了一个由0和1组成的一个大位图。0 |* P2 z5 g: Z5 Q
9 N$ D  Z/ B1 f4 m! V3 c
一块硬盘的自述 0和1.png

3 l, H! A5 {% {( F! `+ l
3 [; M% k4 f  [        由于每个磁盘块只用一个位来表示,非常节省空间,这个方案我喜欢!#j327:5 m  g8 g2 d2 t. c
        
( n7 ?  O/ G8 z
文 件 系 统

' h) {# t  r$ o+ e4 r
3 l' l. `- A8 Z( D3 f! A5 a. T( b        扯了这么多,是时候看一看全局了,在你们程序员的眼中,其实我是长这个样子的(拿Linux ext2为例):, N" p  f/ q, ]4 N- I' m* i
! n3 r: O8 Z8 J. z) w7 U
一块硬盘的自述 linux ext2.jpg
6 J6 C' f$ a5 m1 z9 [. ]$ Q

$ d# [1 H1 w" w" i4 Y        我这个硬盘主要由MBR(Master Boot Record)和各个磁盘分区组成。/ i: G% X  U+ j) q( I) }5 p2 P
4 b2 T- G9 l- Y% Q+ A
        MBR中的有引导代码和磁盘分区表,分区表中记录了每个分区的起始位置,以及哪个磁盘分区是活动分区,这样系统就会找到它,然后装载这个分区中的引导块,并执行之。! [, w; C- \! L5 M

* }5 x9 e" s: k1 Y" b: A. x& {        引导块将会装载存存储在本分区的操作系统。需要注意的是,每个分区都有一个引导块,不管这个分区有没有操作系统,这是各大厂商的约定,是一种标准。+ E/ o' G5 O$ P4 _: S4 D% m
: s" E* f, D' u4 K, {  c, E# w, p
        每个分区除了必须的引导块之外,又被分成多个块组。
& w$ n% s3 M5 v, o/ m  i; X0 U4 q( t8 y
        在每个块组中你能看到熟悉的磁盘块位图和inode位图,不用解释估计你也知道是干嘛的。还有inode表(当然是存放文件和目录的inode了)和真正的数据块。
- O+ v" u3 y! c$ I& f! n+ [2 C  K. K5 _5 [9 X- w' I
        对了,我的磁盘分区表只有64个字节,而每个分区项占用16个字节,所以只能容纳4个分区。如果你想用多于4个分区,你就需要把其中一个设为扩展分区,然后在其中继续划分成逻辑分区,想划几个就划分几个。
  |: ^  {1 R9 l" m
" Y' D: k! u% }6 z% i3 {
        一般情况下,大家都喜欢把我划分成一个主分区+一个扩展分区,在扩展分区中再需要划分。. `# {0 L3 i! p4 s* B1 D/ k* U9 `5 M
8 e; T$ U7 I2 B

上一篇:  一个键盘的自述

下一篇:  一个进程的自述


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

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

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

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

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

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

以前不懂 ,3 A+ T6 R, K; ?! C/ O
看贴总是不回 ,
9 }" Z. ]" R' ^7 J- [. a! c一直没提升等 级和增加经验 ;
# c+ n7 r. D- [/ @& }) |现在我明白了 ,. m/ b5 v; m5 t7 `
反正回贴 可以升级 ,( _/ [+ C/ n1 F' _! o
也可以赚经验,
- G% O; X% b. l4 i7 D) J
- \! c  ?4 k9 }/ ?* w
' y# P! \8 n$ ]) E  c+ y* ~% S而升级又需要 经验,
6 \1 o: ^. W+ i6 r- B, |6 w
* e% I: ?- `+ v' X# j我就把这句话复制下来,
  i  j' k3 F) [6 e$ z* n4 ?( e  \遇贴就回 ,( ~) N$ ^* G5 h7 Z9 k0 F2 q8 A- w
捞经验就闪#y421:
LonelyGorge「初入古黑」 2019-3-12 21:38 |显示全部楼层

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

以前不懂 ,. S# m: K; K, F, j
& |6 B, ^7 s. Y. f. A3 ~/ N看贴总是不回 ,3 i/ C1 y. G+ q) N7 l3 z
  D2 _( n) W3 Y: r: [1 \一直没提升等 级和增加经验 ;$ m# h2 i. [: M! [3 a) b2 |2 N  S# h0 X7 i, [% j* @- ~
现在我明白了 ,; t; M+ G4 I  D1 t: p; \; j
  C: Y1 l+ ?* D6 {! A反正回贴 可以升级 ,
- M% ]0 j0 o6 d  Y; [也可以赚经验,4 V* n* P5 l( o% T
6 o; |7 |; h- W- `9 m. ?! [; I* f+ v! a% }6 }& ^* x# N& n# u# s$ N: D. X- J3 _  Q5 ^2 \
& F  s& E4 ~7 a# n2 v) p, i
而升级又需要 经验,: b7 I3 r8 l. Q+ F) q2 ~
+ a, g. h" J' T7 e3 a1 j2 a! O! S
! w  N. I+ a+ b我就把这句话复制下来,2 W6 l2 O8 n6 x# Q! g1 U* Q2 y, z7 W* W* d
遇贴就回 ,
. H2 s/ C0 R/ r  t捞经验就闪#y421:
您需要登录后才可以回帖 登录 | 注册账号  

本版积分规则

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

GMT+8, 2020-6-1 20:13 , Processed in 0.029956 second(s), 21 queries , Redis On.

© 2015-2020 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表