Android开发Android技术知识程序员

Android I/O 知多少?

2019-06-06  本文已影响8人  Android架构

I/O 操作是编程离不开的话题,它不仅是读写那么简单,还涉及底层的文件系统和存储设备。I/O 的快慢影响程序的执行效率,这篇文章主要介绍 Android 平台 I/O 的方式和使用场景。

1. Linux I/O 的基本组成

众所周知,Android 基于 Linux 系统,先介绍一些 Linux 上 I/O 的知识。

I/O 操作由应用程序、文件系统和磁盘共同完成,应用程序将 I/O 命令发送给文件系统,文件系统在合适的时间把 I/O 指令发送给磁盘。I/O 的流程如下图:

CPU 和内存的速度比磁盘快得多,I/O 操作的瓶颈在于磁盘的性能。为了降低磁盘对应用程序的影响,文件系统要进行各种各样的优化。

文件系统

简单来说,文件系统就是存储和组织数据的方式。应用程序调用 read() 方法,系统会通过中断从用户空间进入内核空间,然后经过虚拟文件系统、具体文件系统、页缓存。

磁盘

磁盘指的是系统的存储设备,常见的有机械硬盘、固态硬盘等。如果发现应用程序要读的数据没有在页缓存中,这时候就需要真正向磁盘发起 I/O 请求。磁盘 I/O 的过程要先经过内核的通用块层、I/O 调度层、设备驱动层,最后才会交给具体的硬件设备处理。

2. Android 上的 I/O

Android 现在普遍使用的是 Linux 常用的 ext4 文件系统。F2FS(Flash-Friendly File System)是三星为闪存研发的文件系统,它针对闪存进行了大量优化,F2FS 文件系统在小文件的随机读写方面比 ext4 更快。随着 Google、华为的投入和使用,F2FS 应该会成为 Android 主流的文件系统。

Android 手机使用闪存作为存储设备,也就是我们常说的 ROM。前几年闪存通常使用 eMMC 标准,近年来采用性能更好的 UFS 2.0/2.1 标准。手机存储也朝着体积更小、功耗更低、速度更快、容量更大的方向发展,闪存的随机读写速度甚至比 SSD 还快。

手机变卡

Android 手机用久了会变卡,除了系统升级、设备折旧等因素,还和 I/O 有密切关系。I/O 操作变慢的原因有下面几条:

文件损坏

文件损坏是令人头疼的问题,大多是由不正确的操作导致的。文件损坏的原因可以从应用程序、文件系统和磁盘三个角度来分析:

3. I/O 的三种方式

I/O 有三种方式:标准 I/O、mmap 和 Direct I/O。

标准 I/O

应用程序平时用到 read/write 操作都属于标准 I/O,也就是缓存 I/O(Buffered I/O)。它的关键特性有:

缓存 I/O 可以很大程度减少真正读写磁盘的次数,从而提升性能。但是延迟写机制可能会导致数据丢失。在实际应用中,如果某些数据非常重要,我们应该采用同步写机制。

读操作时,数据会先从磁盘拷贝到 Page Cache 中,然后再从 Page Cache 拷贝到应用程序的用户空间,这样就会多一次内存拷贝。内存相对磁盘是高速设备,即使多拷贝一次,也比真正读一次硬盘要快。

mmap

mmap 把文件映射到进程的地址空间,提高了 I/O 的性能。

mmap 的优点有:

存在的缺点:

在 Android 中可以将文件通过 MemoryFile 或者 MappedByteBuffer 映射到内存,然后进行读写,使用这种方式对于小文件和频繁读写操作的文件还是有一定优势的。

mmap 比较适合对同一块区域频繁读写的情况,推荐使用 I/O 线程来操作。用户日志、数据上报都满足这种场景,另外需要跨进程同步的时候,mmap 也是一个不错的选择。Android 跨进程通信有自己独有的 Binder 机制,它内部也是使用 mmap 实现。

Direct I/O

一些数据库自己实现了数据和索引的缓存管理,对页缓存的依赖没那么强烈。它们想绕开页缓存机制,减少一次数据拷贝,它的数据也不会污染页缓存。

直接 I/O 访问文件方式减少了一次数据拷贝和一些系统调用的耗时,很大程度降低了 CPU 的使用率以及内存的占用。负面影响就是读写操作都是同步执行,导致应用程序等待。

4. 同步与异步 I/O

多线程阻塞式在 I/O 操作上的并没有优势,I/O 操作的主要瓶颈在于磁盘带宽。所以 I/O 操作不能开大量的线程。

NIO 是非阻塞 I/O,将 I/O 以事件的方式通知,可以减少线程切换的开销。NIO 的最大作用不是减少读取文件的耗时,而是最大化提升应用整体的 CPU 利用率。

另外,非常推荐 Square 的 Okio,它支持同步和异步 I/O,也做了比较多的优化。

I/O 优化对提升应用的体验非常有用,希望上面所讲的内容对你有帮助。

自己是从事了七年开发的Android工程师,不少人私下问我,2019年Android进阶该怎么学,方法有没有?

没错,年初我花了一个多月的时间整理出来的学习资料,希望能帮助那些想进阶提升Android开发,却又不知道怎么进阶学习的朋友。【包括高级UI、性能优化、架构师课程、NDK、Kotlin、混合式开发(ReactNative+Weex)、Flutter等架构技术资料】,希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

资料获取方式:加入Android架构交流QQ群聊:513088520 ,进群即领取资料!!!

点击链接加入群聊【Android移动架构总群】:加入群聊

资料大全
上一篇 下一篇

猜你喜欢

热点阅读