当前位置: 首页 > news >正文

阿里终面:为什么SSD不能当做内存用?

在回答这个问题之前我们先去某东上逛一圈。

输入“SSD”随便找到销量比较高的一项,在商品详情页上有这样的描述:

注意图片上显示的规格,读速高达3.5GB/s,真实情况下稍差点(尤其是随机读写),但也不会很离谱,可以看到,这个速度是非常快的,基本秒传高清电影的水平。

那么问题来了,既然现在的SSD读取速度这么快,那么可以把SSD当做内存来用吗?

要想回答这个问题,我们先来看看内存的速度。

速度差异

当前采用第四代DDR技术的内存,其带宽基本上能到20GB - 30GB 左右。

怎么样,即使SSD的速度很快,但和内存相比还是有一个数量级的差异

也就是说,如果真的当把SSD当内存使用,那么你的计算机可能会比当前慢上 10 倍左右。

如果站在用户的角度你觉得慢点无所谓,那么接下来我们从计算机以及操作系统的角度来看看这样可不可行。

新建一个文件试试

如果你现在在计算机旁边可以进行一个小实验,以下以我的 Win10 机器为例。

新建一个文本文件,随便写点什么东西,然后右键打开属性,你会看到:

这个文件大小本身只有816字节,但却占据了4KB的空间。

让我们再往这个文件里加些内容,再看一下:

此时内容的大小是5.73KB,占据的空间却来到了8KB。

这说明什么呢?

很简单,这说明文件大小是按照块来分配的,但这又能说明什么问题呢?

访问内存与访问硬盘的区别

要知道内存的寻址粒度是byte级别的,也就是说每个字节都有它的内存地址,CPU可以直接通过这个地址获取到相应的内容。

但对于SSD来说就不是这样了,从上面的实验也可以看到,其实SSD是以块的粒度来管理数据的,至于块的大小各有差异,这不是重点。

这里的重点是:CPU没有办法直接访问文件中某个特定的字节

CPU没有办法直接访问存储在SSD上的任何数据。

那么CPU是怎么访问文件内容的呢?

文件系统来帮忙

一切皆文件这个概念想必大家都不陌生吧。

在现代操作中,我们以文件的形式来使用SSD,这绕不开操作系统中的文件系统。

文件系统把SSD上的数据以文件的形式呈现出来,程序直接操作文件,读写文件时把请求发送给文件系统,文件系统把请求路由给SSD,SSD处理完请求后数据会被copy到相应进程的内存中,此后程序直接操作内存。

完整的过程以及文件系统的实现可以写成一本书的完整一章,啊哈,博主的《深入理解操作系统》第八章有关于这部分的详细讲解,感兴趣的可以去看下。

从这里我们可以看出,CPU没有办法像访问内存那样直接按照字节粒度去SSD中寻址,CPU访问SSD(磁盘)通常需要借助文件系统,当然,我们也有办法绕开文件系统,但CPU依然无法直接访问SSD(磁盘)中的某个字节。

正是因为CPU无法直接按照字节粒度去访问SSD,因此CPU无法脱离内存直接在SSD中运行你写的程序。

操作系统在把SSD当内存用

当然在这里还要插个题外话,尽管操作系统不能把SSD当内存来用,但实际上操作系统在间接把你的SSD当内存来用

现代操作系统会自动在空闲内存中缓存SSD(磁盘)数据。

当你首次读取文件时,这次读请求的确需要经过慢吞吞的SSD(磁盘)来处理,但此后这块数据就被缓存在了内存当中,下次再访问这块数据时就不用访问SSD(磁盘)了。

而如果你写入数据,一般来说也是写到内存,稍后会有一个任务把内存中的数据写入磁盘。

因此从这里我们可以看出,现代操作系统基本上是在把SSD当内存来用,更不用提磁盘交换空间,是不是很聪明,关于这一部分的详细阐述请参见《深入理解操作系统》第七章。

ok,这个题外话就到这里。

让我们回到原问题来。

虚拟内存

现代操作系统的内存管理都采用虚拟内存,这会带来一个问题。

对于32位操作系统来说,其最大寻址范围只有4G,也就是说如果你把SSD当做内存,即使SSD有1T,那么操作系统真正能用到的也只有4G,剩下的就都浪费掉了。

因此,现代操作系统对内存的管理方式也无法让我们把SSD当内用,除非修改操作系统。

当然,对于64位操作系统则不存在这个问题,因为64位操作系统可寻址空间足够大,尽管这个空间足够可观也需要意识到这是有上限的。

使用寿命

SSD的制造原理决定了这类存储设备是有固定使用寿命的。

你会发现SSD这货就和车一样,当跑出一定里程后就会出问题,在SSD中的里程数就是所谓的总写入字节,TBW,全称是Max Terabytes Written,最多能写多少TB,以下是某种型号的SSD其TBW规格。

一般来说普通的 SSD 其 TBW 在几百 TB,也就是说如果你的SSD写入上百TB,那么很可能就要报废了。

有的同学可能觉得这使用寿命也太短了吧,但实际上作为普通用户,你的电脑不会有那么频繁的写SSD场景,每天写磁盘的量应该会很小,当然频繁下小电影除外,因此作为普通用户你可以不用在意SSD的使用寿命问题。

但就像刚才说的,SSD毕竟是有TBW这个限制的,内存则没有这个问题。

因此如果你把SSD当内存用的话,相信很快你的SSD就会被CPU写死。

展望未来

受限于当代的存储设备制造技术,我们还没有办法直接把SSD当做内存来用,我们的各种软件包括操作系统、文件系统以及各种硬件包括CPU等都没有做好把SSD当做内存来用的准备

但随着技术的进步,这一点未来可能会有改观。

Intel已经发布了一种存储设备,该设备就像SSD,但同时又可以支持像内存那样随机寻址。

也许在未来我们的内存也可以像SSD那样,即使断电内容也不会丢失,那样的话你的电脑就没有“关机”这种操作了,电脑加电后根本就没有“启动”一说,是不是很有趣。

如果内存和磁盘一样断电后也不丢内容,那么会带来什么有趣的新功能呢?欢迎大家在本文留言区讨论这个问题

总结

SSD能否当做内存来用?这绝不是一个简单的问题,这涉及到CPU、操作系统、文件系统、存储设备制造原理等方方面面的问题,你需要对计算机系统有透彻的理解才能回答好这个问题。

最后,顺便不吹牛的说一下,这个问题是小风哥我自己想出来的,就问你无聊不无聊。

相关文章:

  • 首发|语音信号处理免费体验营
  • 摩天大楼如何靠一颗铁球防风抗震?
  • 铁打的 Kotlin ,从来没让我失望
  • CPU 核数与线程数有什么关系?
  • Android 开发垂直领域的大佬
  • 服饰柔性3D渲染调研及实践
  • 音视频开发之旅(49)-边缓存边播放之AndroidVideoCache
  • synchronized 加锁 this 和 class 的区别!
  • 李超:WebRTC传输与服务质量
  • 干货分享 | Shader 实现 PPT 转场效果(附源码)
  • Filament 实时渲染引擎介绍~~
  • 码率直降70%,拍乐云发布国内首个 AV1 编码引擎 Venus,引领实时视频互动革新...
  • RecyclerView性能优化的最后一公里
  • 腾讯视频会议真实内部实现分享
  • Systrace 流畅性实战 1 :了解卡顿原理
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • @jsonView过滤属性
  • 【5+】跨webview多页面 触发事件(二)
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【剑指offer】让抽象问题具体化
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • HTTP 简介
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Java教程_软件开发基础
  • JAVA之继承和多态
  • Markdown 语法简单说明
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Octave 入门
  • PHP的Ev教程三(Periodic watcher)
  • Redis在Web项目中的应用与实践
  • zookeeper系列(七)实战分布式命名服务
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 技术胖1-4季视频复习— (看视频笔记)
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 在Docker Swarm上部署Apache Storm:第1部分
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • (175)FPGA门控时钟技术
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (windows2012共享文件夹和防火墙设置
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (一)Linux+Windows下安装ffmpeg
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (原創) 物件導向與老子思想 (OO)
  • (转)3D模板阴影原理
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转载)深入super,看Python如何解决钻石继承难题
  • .Net core 6.0 升8.0
  • .NET 服务 ServiceController
  • .net 验证控件和javaScript的冲突问题
  • @Conditional注解详解
  • @javax.ws.rs Webservice注解
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?