磁盘详解——电脑数据如何存储在磁盘

 

        很多人也知道数据能够保存是由于设备中有一个叫做「硬盘」的组件存在,但也有很多人不知道硬盘是怎样储存这些数据的。本着「知其然,也要知其所以然」的精神,这里给大家讲讲其中的原理。

253b6b4417cb4970a95d1476b7201ef7?_iz=31825&from=article.detail&lk3s=717a2be7&x-expires=1710122527&x-signature=sXK3%2BUTp9V31P36xIGmoNm%2BjzU8%3D

 

首先我们要明白的是,计算机中只有0和1,那么我们存入硬盘的数据,实际上也就是一堆0和1,换句话说,我们如果有办法记录0和1就可以记录数据了,比如我们有2个灯泡,一个不亮一个亮就可以表示01,即数字1,两个都亮11,即表示数字2,越大的数可以用越多的灯泡来表示。

fefb6e8b735a44cd88f71e4ac86936df?_iz=31825&from=article.detail&lk3s=717a2be7&x-expires=1710122527&x-signature=HNwK1zB7gc5Y1f3ttQm3vNC%2FqT0%3D

 

硬盘分为机械硬盘和固态硬盘,由于结构的不同它们储存数据的原理也不同。先来看机械硬盘,其最重要的结构是两面涂有磁性材料的磁盘,在工作时会以每分钟7200转的速度旋转。

7d7410f6757c4ba7b4cac42eef00c638?_iz=31825&from=article.detail&lk3s=717a2be7&x-expires=1710122527&x-signature=WtgWHGfw24hVD1GleaDaO4j4yB8%3D

 

磁盘的作用就是记录数据,在盘片上有序的排列了很多的小颗粒材料,它们都是磁性物质,可以被永久磁化和改变磁极,这两个磁极就分别表示了计算机二进制中的0和1。

f619f8702e38469bafadb9213cf0cb83?_iz=31825&from=article.detail&lk3s=717a2be7&x-expires=1710122527&x-signature=poVDTWNIZvVUhb2So76fccfl%2B9I%3D

 

写入数据时,距离盘面3纳米的磁头会利用电磁铁,改变磁盘上磁性材料的极性来记录数据,两种极性分别对应0或1。而读取数据时,旁边的读取器可以识别磁性材料的不同极性,再还原成0或1。

67121e5a10a8442fa18a81a23413a948?_iz=31825&from=article.detail&lk3s=717a2be7&x-expires=1710122527&x-signature=dDH2yRGVZfkJ1Zf0c2vxw6U7xLI%3D

 

        由于磁盘是转动后读写数据的,所以,当初设计就是在类似磁盘同心圆上面切出一个一个的小区块,这些小区块整合成一个圆形,让机器手臂上的磁头去存取。

        这个小区块就是磁盘的最小物理储存单位,称之为扇区 (sector),大小一般是512字节,而同一个扇区组合成的圆就是所谓的磁道(track)。

这里不得不说到字节知识。

        位:"位 (bit)"是电子计算机中最小的数据单位。

每一位的状态只能是0或1。 字节:8个二进制位构成1个"字节 (Byte)",它是存储空间的基本计量单位

字节:在多数的计算机系统中,一个字节是一个8位长的数据单位,大多数的计算机用一个字节表示一个字符、数字或其他字符。 一个字节也可以表示一系列二进制位。 

位(bit)字节(Byte)(这两个不能搞错)

1B=8b

1KB=1024B

1M=1024KB

1G=1024M

1TB=1024G

因此,磁头要想读取某个文件,必须在电机驱动下,先找到对应的磁道,再等磁盘转到对应扇区才行,一般会有十几毫秒的延迟,这就让机械硬盘在读取分散于磁盘各处的数据时,速度将大幅降低。

1d3c9eb831bc4dd9ae6730ad2026ac3f?_iz=31825&from=article.detail&lk3s=717a2be7&x-expires=1710122527&x-signature=lYFFScAcO8j5xVDBMCYGwkdiRjw%3D

 

相较于机械硬盘里面的复杂结构,固态硬盘就要简单许多。它主要是靠FLASH芯片来作为储存数据的介质,由主控芯片来承担数据的中转,并调配数据储存在闪存芯片上面。

713c7c9d98774becb238f2cf21df28a0?_iz=31825&from=article.detail&lk3s=717a2be7&x-expires=1710122527&x-signature=8ag1UFSw6Xm2YBsFwPa%2FNBQx2VU%3D

 

闪存的基本存储单元是浮栅晶体管,其中的浮栅被二氧化硅包裹,和上下绝缘,在断电时也能够保存电子,当电子数量高于一个中间值就表示0,低于中间值就表示1。

a2b31e83457647348746b1b4ae8b94fb?_iz=31825&from=article.detail&lk3s=717a2be7&x-expires=1710122527&x-signature=6ueX9BZBxU2Zpfiq%2BWZMtBbhaUQ%3D

 

晶体管每次写入数据前都要先擦除,在P极上加一个电压,浮栅中原有的电子会因为量子隧穿效应通过绝缘层被吸出来,让浮栅中的电子数量低于中间值,还原成1;如果要写入0,就在控制极加一个电压,让电子穿过绝缘层再注回浮栅,使电子数量高于中间值,表示0。

但在读取时,闪存无法直接得知浮栅中有多少电子。因为往控制极加一定大小的电压,会导通这两个N极。控制极上的电压越大,N极间的电流也越大。然而,存储0的浮栅,相比存储1的浮栅,有更多的电子,会抵消控制极上的电压,所以控制极需要更大的电压才能导通两个N极。

e375af5b04c44a0cac454c6863690f4a?_iz=31825&from=article.detail&lk3s=717a2be7&x-expires=1710122527&x-signature=R31BOt5LTUrCGPHvUfGtNQcOaME%3D

 

因此,当不知道浮栅中有多少电子时,就可以往控制极加一个中间值电压,如果两个N极导通,就能反推出浮栅中的电子较少,识别为1;如果没有导通,就说明浮栅中的电子较多,识别为0。

传统的单阶存储单元SLC ,电子数量只有两种状态,只能保存一比特的数据。而多阶存储单元MLC、TLC和QLC ,它们的电子数量有4~16种状态,一个单元可保存2~4比特。

4f4989b77e0a4e82a7000e65a2956f00?_iz=31825&from=article.detail&lk3s=717a2be7&x-expires=1710122527&x-signature=G5gEmWsfIq0aF3wiEyt%2FFuFfM7o%3D

 

多阶存储单元大大降低了固态硬盘单位容量的成本,但也影响了硬盘寿命和性能。这是因为晶体管擦写数据时,二氧化硅绝缘层会困住一部分电子,这些电子的累积会逐渐抵消控制极上的电压,使得控制极为了导通两个N极所需的电压越来越大,当这个偏移超过中间值,那么读取时也就无法分辨0和1。

0a09e8b3ab8349ea85fc3e3484685a8b?_iz=31825&from=article.detail&lk3s=717a2be7&x-expires=1710122527&x-signature=wguzdZCqea7ZzGQMS%2Fca2chqFNI%3D

 

而多阶存储单元由于不同状态之间分得非常细,也就更容易受这种偏移的影响,所以从SLC到QLC,它们总的擦写次数呈几何级数递减。

总结来说,机械硬盘是磁头通过磁盘旋转来读写数据的,所以磁盘读写数据的速度跟磁盘的旋转速度有很大的关系,磁盘转得越快磁头就能更快的访问到更多区域,速度自然就越快了。但也正是转速比较快,所以抗震抗摔以及抗尘能力比较差,试想每分钟几千转的磁盘震了一下或者撞上了灰尘,磁头即使只是发生了一点点小小的偏移,也会带来不可逆转的损坏。

a715f4ce605e4123a2d3fb4d0be3abdf?_iz=31825&from=article.detail&lk3s=717a2be7&x-expires=1710122527&x-signature=bh%2F4XEFPICyBAYZQz971ycjKiPs%3D

 

而固态硬盘由于没有了机械结构,完全不用担心这些的问题。但是固态硬盘也有一个硬伤就是:它是靠在存储单元里面存放电子的方式来存储数据。而电子大家知道是一个非常非常小的东西,这样如果同一个位置存放电子再擦除,如此反复长久以来就会出现不稳定的情况,比如电子会写不上。尤其是将要到来的QLC储存芯片,每个存储单元里面放了4个电子,由于电子之间也会互相影响,导致寿命大大减少。

 

相关推荐

  1. linux磁盘存储空间不足磁盘扩容

    2024-02-11 06:18:01       41 阅读
  2. 计算机基础:计算机及磁盘存储数据原理

    2024-02-11 06:18:01       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-11 06:18:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-11 06:18:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-11 06:18:01       82 阅读
  4. Python语言-面向对象

    2024-02-11 06:18:01       91 阅读

热门阅读

  1. 【sass】 中使用 /deep/ 修改 elementUI 组件样式报错

    2024-02-11 06:18:01       46 阅读
  2. redis单线程还快的原因

    2024-02-11 06:18:01       51 阅读
  3. 【讨论】C语言提高之指针表达式

    2024-02-11 06:18:01       47 阅读
  4. leetcode - 368. Largest Divisible Subset

    2024-02-11 06:18:01       42 阅读
  5. 从零开始:用 Rust 编写你的第一个 Web 服务

    2024-02-11 06:18:01       45 阅读
  6. 如何为Kafka加上账号密码(二)

    2024-02-11 06:18:01       52 阅读
  7. C#系列-C#访问MongoDB+redis+kafka(7)

    2024-02-11 06:18:01       51 阅读
  8. 最小生成树——Prim/Kruskal Python

    2024-02-11 06:18:01       51 阅读
  9. 迟旧迎新感悟

    2024-02-11 06:18:01       43 阅读