阿里终面:为什么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、操作系统、文件系统、存储设备制造原理等方方面面的问题,你需要对计算机系统有透彻的理解才能回答好这个问题。
最后,顺便不吹牛的说一下,这个问题是小风哥我自己想出来的,就问你无聊不无聊。
阿里终面:为什么SSD不能当做内存用?相关推荐
- Macbook pro md318 升级SSD以及8G内存过程以及问题总结
前几天买了intel 320 series 120G SSD和4G kingston 2条内存条,把Macbook pro md318 升级了一下,下面就记录下升级过程以及升级中遇到的小问题.方便日后 ...
- 阿里终面:每天100w次登陆请求, 8G 内存该如何设置JVM参数?
大家好,我是不才陈某~ 上周知识星球的同学在阿里云技术面终面的时候被问到这么一个问题:假设一个每天100w次登陆请求的平台,一个服务节点 8G 内存,该如何设置JVM参数? 觉得回答的不太理想,过来找 ...
- 新品体验:阿里云新一代本地SSD实例i4开放公测
近日,阿里云弹性计算宣布新一代本地SSD实例i系列规格族开放公测.i4实例规格族基于阿里云第三代神龙架构,单盘存储IOPS高达60万:搭载英特尔Ice Lake CPU处理器,较上一代本地SSD实例i ...
- 如何使用阿里云容器服务保障容器的内存资源质量
作者:韩柔刚(申信) 背景 云原生场景中,应用程序通常以容器的形式部署和分配物理资源.以 Kubernetes 集群为例,应用工作负载以 Pod 声明了资源的 Request/Limit,Kubern ...
- 阿里终面:如何设计一个高性能网关?
作者:烟味i cnblogs.com/2YSP/p/14223892.html 一.前言 最近在 github 上看了 soul 网关的设计,突然就来了兴趣准备自己从零开始写一个高性能的网关.经过两周 ...
- 升级总代分享思路_旧笔记本光驱换SSD,升级内存,改造散热还能再战5年
哈喽,大家好,我是Fanfan,今天给大家分享一下怎么升级家里的旧笔记本电脑,让旧笔记本在2020焕发第二春.这就是本次的主角DELL N4050. 背景 家里有三个笔记本电脑.xps,MacBook ...
- 4 年 Java 程序员十面阿里终拿下 offer,评级 P6+ 年薪 30-40w 无股票
前言 每个程序员都有一个大厂的梦,而互联网大厂首当其冲自然是 阿里巴巴 最吃香,今天小编就来分享一个小伙进阿里巴巴的面经! "不想进大厂的程序员不是好程序员"哈哈哈 本人也是准备了 ...
- 阿里云CentOS7挂载SSD云盘的方法
https://bbs.aliyun.com/read/151152.html 阿里云购买的第2块云盘默认是不自动挂载的,需要手动配置挂载上. 1.查看SSD云盘 [python] view plai ...
- 笔记本电脑安装固态硬盘(SSD)和内存
可以看到cpu,内存,磁盘.哪个总是很大就说明哪个性能不好. 打开多个软件(特别是大软件)很卡,说明是内存不够. 打开软件很慢说明是磁盘读取慢. 首先关机,拔掉电源,拆开电脑后面能看到的螺丝(怎样拆电 ...
最新文章
- MySql数据库操作遇到的蛋疼二三事
- ssh登录慢,等待时间长的问题
- matlab m序列,m序列(M序列与m序列区别)
- matlab2c使用c++实现matlab函数系列教程-tanh函数
- python-获取当前文件名
- 创建库文件c语言,创建自己的函数库
- integnps 数控智能编程v19.3 数控切割机编程 切割机套料编程
- 车规SoC芯片厂商征战功能安全,谁是最佳助力者?
- ArcGIS单波段影像重分类与批处理
- Frontiers of Physics中科院二区期刊,两个月内接收,无需版面费,影响因子不断上涨
- HTML+CSS基础学习笔记2
- NVIDIA Jetson TK1学习与开发——简介(针对嵌入式系统应用释放 GPU 的潜能)
- python第三项基础知识_Python学习心得——基础知识(三)
- 收单-批量支付-批量支付文件规则设计
- 油猴安装、编写及添加脚本 笔记
- Samael对决Lucifer!!! ……Dean的任务真相……
- Unity3d中渲染到RenderTexture的原理,几种方式以及一些问题
- [js点击]JavaScript之Ajax技术之02
- [随文杂记]生男好还是生女好?
- ThreeJS第一人称视角处理
热门文章
- 幂等性 第三方交易编号_java幂等性的解决方案
- mirna富集分析_2020年的3+分ceRNA分析长啥样?
- 构建DevOps功能:云计算自动化
- Spring Boot 整合 Freemarker
- java decodeurl,java decodeURIComponent
- 可持久化线段树(静态)【学习笔记】
- c1 c2在c语言中,c1和c2科目一样吗
- python统计窗口函数怎么处理_python移动窗口函数
- codeblocks安装及使用教程(手把手傻瓜式教学)
- 哈工大威海c语言实验报告 第八章 无法运行程序,哈工大(威海)c语言实验报告册答案...