存储对手机性能的影响

前言

几年以前,我被派去厦门上门去分析一个用户的手机卡顿问题,该用户的手机经常莫名无响应,刷机,恢复出厂都没有用,经过一通分析,原来该用户从熟人店里买到了一张盗版的SD卡(这年头坑的就是朋友),该SD卡读写速度很慢,顺序读写只有20MB/s。那为什么SD卡的读写性能对手机性能影响那么大?当时我的知识水平,只能从对比测试中发现这个问题,然后更换SD卡解决了这个问题,但是无法从原理上解释这种现象。经过那么多年的学习积累,我现在终于可以解释这个问题。

一、什么叫存储设备

在电脑上,存储设备就是硬盘,一般有固态硬盘和普通机械硬盘,
在手机上,存储设备就是内部存储或者外置SD卡,有EMMC和UFS X.X等类型。

1.1 一个程序如何访问存储设备上的数据

三个重要硬件,CPU,内存,存储
三者的通信关系如下:
一个程序需要通过CPU->内存->存储设备,CPU是无法直接访问存储设备的。


1.2 三者执行速度做对比


可以很明显的看到存储的速度明显拖了CPU和内存的后腿,所以程序访问存储设备里的速度很大程度上取决于存储设备的读写速度。

有人说,怎么不把存储做的快了一点,你要知道越快的东西越贵。如果你有钱,也可以把存储都换成内存,假设1T的硬盘都换成内存,你算算需要多少钱,而且目前我们普通用户对电脑手机的性能要求,存储1毫秒响应时间足够了。

思考一个问题:存储那么慢,CPU那不是会闲,那不是浪费了吗?

答案:操作系统实现了多进程(Task),让每个进程轮流使用CPU,变相的对于单个进程来说,CPU的执行时间也就变长了。假设一个CPU,有100个进程轮流使用,那不就是变相的对于单个进程来说,CPU的执行时间不就是30纳秒了,这样子不就和内存,存储的速度匹配上了嘛。

1.3 测试存储性能的两个指标

随机读写性能
顺序读写性能
PS:通过跑分软件测试计算的速度是CPU,内存,存储设备同时作用的结果,对存储设备的速度有一定的参考意义,但是不能作为存储设备的绝对速度。

二、Android存储架构图


整个Android存储架构分为三个层

1.应用程序
2.Linux内核
3.硬件层

我们接下来从这三个方面来分析如何提升手机的存储性能。

三、硬件层

硬件层也就是块设备,例如SD卡,固态硬盘,机械硬盘,都是块设备,基本上增大块设备绝对读写速度只能通过硬件结构升级和驱动优化,硬件厂商提供存储设备硬件和驱动,对于我们OEM厂商来说,基本能优化的空间为零。前言中讲的用户问题,就是属于硬件层的问题,遇到这种问题,只能换硬件,也就是换SD卡。

手机常见的块设备速度对比

UFS 3.1 > UFS 3.0 > UFS 2.1 > EMMC

记住UFS数字越大,速度越快。

小米10的黑科技揭秘-WriteTurbo

最近小米10大肆宣传的WriteTurbo大概率属于供应商的优化,这个方案主要是增加顺序读写性能,基本原理就是在块设备内部加入一块高速缓冲区,这样子内存就是和高速缓冲区通信,提升顺序读写的响应速度。不管怎么吹,也比不过UFS 3.1。


四、Linux内核

Linux内核中主要分三层,VFS,FileSystem,Block Layer。

4.1 VFS

VFS是虚拟文件系统的缩写,属于linux内核的一个抽象层,我们能优化的机会不多,但是并不是完全没有,由于这块代码比较标准,一般也不建议去修改。想深入理解这块知识,可以看我的视频王小二图解Android【005】一切皆文件

4.2 FileSystem

FileSystem是文件系统,目前手机中常见的F2FS和EXT4,两者没有绝对的好坏,只是目前来看在相同的存储硬件下F2FS比EXT4随机读写速度更快,我们可以通过刷机修改我们存储的文件系统。

如何优化FileSystem,优化文件系统的基本思路

1.以内存换速度,提前合理的缓存可能即将打开的文件索引,文件系统发起IO请求到Block Layer的速度将会大大增快。
2.优化存储的结构,F2FS和EXT4文件系统会影响到存储设备中文件以及文件信息的存储位置,在不同场景下,两者有着不同的存储结构

文件系统的代码一般都是开源的,而且贡献者一般都是linux大神,优化的难度挺大,但是绝对有机会的。只是我现在的水平只能看看文件系统,没有达到能优化的能力

黑科技揭秘-F2FS文件浏览器

有厂商说我们是F2FS文件浏览器,比传统的文件浏览器快,其实只不过换了文件系统成F2FS,或者对F2FS有一定的代码优化。你的硬件跟不上,就算你的文件系统再牛逼也只能一定程度提升随机读写性能。打个比方:汽车1.5T再牛逼,也比不过2.0自然吸气,UFS 3.0怎么也比不过3.1。

4.3 Block Layer

Block Layer主要是串联各个块设备驱动和文件系统,例如电脑上可能存在多块硬盘,手机上可以外置一个SD卡。

IO调度算法

Block Layer最重要的就是IO调度算法,也是比较复杂,主要任务就是合并IO请求,重新排序IO请求,转发IO请求到块设备驱动,可以通过优化或者切换调用算法,提升IO请求的效率。
目前常见的IO调度算法是:CFQ,NOOP,Deadline
有关IO调度算法的介绍和测试手段参考下面这个链接
https://blog.51cto.com/scoke/490546

如何优化

通过调整不同进程的IO优先级,提升前台进程的IO调度的效率。
通过修改IO调度算法,提升某些场景下IO整体性能。

5、应用程序

作为App开发人员,基本无法去优化平台的存储性能,但是可以优化APP的代码,减少存储设备的访问,将经常访问的数据放到内存里来,减少数据库的交互。Android官方也是警告千万不要在主线程处理复杂的IO操作。

只要所有App都乖乖地减少对存储设备的访问,这样子IO负载就不会高,手机也就越流畅。

6、总结

其实我个人认为,现在手机硬件不断升级,一台好的手机不单单是CPU内存 ,一块好的存储设备也是非常重要的,如果说CPU决定了这台手机的上限,那么存储设备算是这台手机的下限。

作为工程师,我们要做的就是将一块好的存储设备优化到极致,将差的存储设备优化到正常使用,我目前正在这个方向上努力学习,努力进步中。

7、思考

想想你们日常写的代码中有哪些属于存储设备的读写,欢迎留言。

  回复「 篮球的大肚子」进入技术群聊

回复「1024」获取1000G学习资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进阶攻略|前端最全的框架总结

前端的技术日渐更新,最近得空,花了一上午的时间,将前端常见的UI框架总结了一下,在开发的过程之中,有了这些,不断能够提高自己的工作效率,还可以在工作之余了解更多。希望大家喜欢。1.Layui官方网…

你知道char *s和char s[]的区别吗?

在一个夜深人静的晚上,有一个读者给我发了一个C语言题目。他问我,发哥,帮我看看这个代码有什么问题。我看了代码之后,心里一阵恐慌。我自认为我不是C语言高手。但我确实是一个喜欢解决问题的男人。就是在这样的背景驱使下&#xf…

上Google Adsense个人的一点体验

最近我想开通一个Google Adsense帐号,因为以前注册过一个Google帐号,所以我以为两个是可以共通的,因为很久没上Google帐号,我记不太清密码了,所以我先是登录了Google,登上去了,密码没记错。然后…

通俗易懂,嵌入式Linux驱动基础

前言上一篇分享的:《从单片机工程师的角度看嵌入式Linux》中有简单提到Linux的三大类驱动:我们学习编程的时候都会从hello程序开始。同样的,学习Linux驱动我们也从最简单的hello驱动学起。驱动层和应用层 还记得实习那会儿我第一次接触嵌入式…

记,我在深圳买房

今天晚上,有点时间,把这次买房的经历写下来。我并不是想炫耀,也不是想说明什么,只是为了记录自己的生活。这是对自己的一个阶段性总结,也希望自己的意见和想法对读者们有些帮助。再者,凭自己的努力&#xf…

tif 高程_使用ArcGIS提取高程点

地球表面形状的最常见数字化数据便是基于像元的数字高程模型(DEM),该数据可用作量化地表特征的输入。DEM属于一种连续表面的栅格制图表达,通常参考真实的地球表面,有的时候除了需要DEM还需要高程点,这里讲解一下如何使用ArcGIS从D…

你试试用心呼吸

我曾经历过掉水里,两次。第一次,是在水上乐园,不会游泳的我,从高滑梯上头朝下扎到水中。一下子,就感觉呼吸不了,非常惊恐,然后有人(救生员)揽住了我,我非常惊…

Git安装及密钥的生成并上传本地文件到GitHub上

之前用的GitHub,不太熟练,一直在上传的过程中遇到了一些问题,看了网上诸多教程,总觉得很乱,特参考一些资料,总结了一篇完整的操作步骤,从下载安装到上传文件,亲测有效1.下载Git软件&…

声明为数组定义为指针,声明为指针定义为数组

导语在这里我们做种强调的是在两个文件中,定义为数组声明为指针和定义为指声明为数组的这辆中情况。那么我们就需要两个源文件test.c和main.c。定义为数组,声明为指针test.cchar arr[] "abcdef";main.c#define _CRT_SECURE_NO_WARNINGS 1 #in…

python selenium环境配置Firefox和Chrome

1、下载Selenium库,可以使用pip install selenium https://pypi.python.org/pypi/selenium/ 2、下载驱动 Chrome: https://sites.google.com/a/chromium.org/chromedriver/downloads Firefox: https://github.com/mozilla/geckodriver/releases 3、配置环境变量 需要…

BUG_ON()、panic()、dump_stack()几种内核调试手段

Linux内核有一些方法可以用来方便标记bug,提供断言并输出信息。最常用的两个是BUG()和BUG_ON()。当被调用的时候,它们会引发oops,导致栈的回溯和错误信息的打印。这些声明会导致 oops跟硬件的体系结构是相关的。大部分体系结构把BUG()和BUG_O…

wordvba编程代码大全_这几本基础编程书籍一定要看

程序员书库(ID:OpenSourceTop) 编译书单来自:https://simpleprogrammer.com/best-programming-books-2019/关于程序员类的技术书籍有很多,但是往往没有时间阅读,下面的这些书籍,由John Sonmez精选,可以帮助…

经典DP

1.背包问题 (1)01背包 从n个重量和价值分别为wi,vi的物品,从中选出不超过W的物品,每种物品仅有一件,求所有方案中V的最大值。 最朴素最简单也最费时的方法:O(2^n) int rec(int i,int j)//从第i个开始挑选总…

C语言、嵌入式重点知识:回调函数

前言 上文分享了一个专用的双链表的基本操作示例:双链表的操作示例(附代码)这里提到了一个关键词:专用。与专用对应的词是通用。我们从字面上可以很容易理解这两个词,专用就是针对特定情况的,特点就是很有局…

今天我勇敢的点就一个gpio口

现在已经三月份了,时间过得超快,早上起来打开电脑,有点不习惯,微信群唧唧歪歪的那些股神今天不知为什么安静了。我喜欢看大家热闹的样子,更喜欢热闹的时候给我们发几个红包。我记得2015年,股市非常好&#…

数据结构(4)

文章目录栈与队列栈队列![在这里插入图片描述](https://img-blog.csdnimg.cn/20200301182116946.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzY2Mzc4MA,size_16,color_FFFFFF,t_70)栈与队列 栈 ha…

写一个公用的gpio口驱动

因为项目需要控制的GPIO口比较多,如果每个GPIO口都写一个驱动就显得比骄麻烦,所以就写了一个通用的GPIO口驱动。只要dts里面配置好设备GPIO相关信息就可以自动加载了。可以很充分的体现多个设备一个驱动的优良性。dts文件gpio_rs485: gpio_rs485 {status…

数据结构(5)

文章目录各种算法选择排序插入排序希尔排序***快速排序***归并排序二分查找各种算法 def bubble_sort(alist):"""冒泡排序"""n len(alist)for j in range(n-1):count 0for i in range(0, n-1-j):# 班长从头走到尾if alist[i] > alist[i1]:a…

大神们都应该去哪里工作?

接上一篇文章。文中提到我认识了一个做嵌入式的大神,技术真的非常厉害。我们在调试过程中,遇到问题,他总是能告诉我们排查的手段,而且针对一个问题,他能想到几种不同的解决方案。嵌入式驱动跟其他软件有点不一样&#…

大华管理平台用户名_智能财务引领商业与管理变革——浙大EMBA首席财务官研习社走进大华股份...

杭商传媒记者 周 珂/文 徐青青/摄编辑 何影丹当前经济环境和市场需求瞬息万变,企业竞争日益激烈,盈利持续下降,产品、服务同质化严重,这不仅对业务部门提出了挑战,也对传统的财务管理产生了巨大的冲击。财务不能高…