文章目录
- 前言
- 多过程是什么?
- 为什么要使用多个过程?
- 三.进程间通信(IPC)
- 四.Binder机制
- 五.各种IPC机制的对比
- 总结
前言
Android 的binder机制在面试中经常被问及,这表明它对我们有好处android开发很重要,我们Android系统的许多地方都使用过binder说到通信binder,我们必须提到进程间的通信(IPC),为什么进程间需要通信?通信在过程中处和优势是什么?读完这篇文章,我相信你会得到答案。
多过程是什么?
这个比较简单。众所周知,操作系统最初是一个过程,即操作系统只能运行一个过程。随着技术的发展,有很多过程。在使用的android手机的时候,你是不是既可以打开QQ,还可以听音乐,接收微信推送消息…QQ,微信和音乐这些都是不同的过程,这些过程的用户空间互不干扰,比如我们使用QQ,不要给微信好友发消息,在音乐上app也不能删除QQ朋友们,也就是说,他们是独立的。它们是操作系统中多个独立的过程
为什么要使用多个过程?
在Android在系统中,虚拟机分配给每个过程的运行内存是有限的,LMK(low memory killer)回收资源将优先占用更多的过程,这导致如果我们的应用程序占用的内存太大,当内存不足时,系统可能会优先杀死它。如果我们使用多个过程,将一个应用程序所需的内存分为一部分到另一个应用程序,然后通过两个过程之间的通信,将一个应用程序的功能分为两个应用程序。事实上,多工艺的使用不仅有这些好处,还有以下好处:
- 突破过程内存限制,图库等应用占用过多内存,可分解为多个过程
- 提高功能稳定性。独立通信过程可以保持长链接的稳定性,类似于推送需要过程保存的场景。
- 避免系统内存泄漏,实现webview当我们经常有很多内存泄漏问题时,我们可以webview将相关功能放置在独立的过程中webView内存泄漏不会影响主应用
- 隔离风险用两个过程来维护隔离风险app开发,主app另一个是副app在过程中,我们可以将有风险的功能放在副作用中APP在这个过程中,当有风险的功能出现问题时,它不会导致主app进程的崩溃
三.进程间通信(IPC)
当我们将app放置部分风险功能App当我们需要使用副进程的功能时,就需要副进程App建立主过程和副过程的通信,现在拿很多相机APP就我们而言,手机的像素越来越好,但每张照片占用的内存都很大。此时,应用程序很容易占用过多的内存。此外,许多手机支持夜间算法。夜间算法是一种多帧算法,也就是说,如果在这个过程中,需要通过夜景算法同时合成多张照片app这个过程显然是不合理的。这时,我们可以把它放在一个新的过程中,这个过程和相机APP在此过程中建立通信。当相机拿到照片时,将其发送到处理图片的过程中。处理后,将其调回相机APP进程。 这样的好处很明显,当用户极限操作时,比如快速拍照,快速退出,如果都在相机上APP过程处理,所以图片还没有开始处理,用户退出,可能导致图片丢失,放在另一个过程中会大大减少这种情况,因为在另一个过程中,只要确保服从HAL通过进程通信将图片数据和信息发送到算法处理过程中,相机APP由于过程不同,退出过程不会影响图像算法处理过程的处理。因此,它极大地规避了风险,优化了用户体验。
因为我们把图片处理放在另一个过程中,但我们需要将数据发送到图片处理过程中,并在另一个过程中了解图片处理过程中的信息。此时,我们需要使用过程间通信。也许你会问,直接通信是可以的。你还需要单独说什么? 但过程之间的通信不像我们在应用程序开发过程中的线程之间的通信。过程内存分为用户空间和核心空间,核心空间内存共享,用户空间内存不共享,用户空间和核心空间隔离,用户空间访问核心空间,只能通过系统呼叫,即由系统提供API 访问,系统调用API这里主要有两个,copy_from_ueser
和copy_to_user
从上图可以看出,在用户空间中,内存不共享,不能直接通信,但内存共享在核心空间中,所以我们想实现过程通信可以从过程1传输到核心空间,然后从核心空间复制到过程2,从而完成过程之间的通信。让我们来解释一下这个过程。 上图就是传统的IPC在机制上,我们可以看到,虽然进程间的通信已经实现,但数据从进程1到进程2需要复制两次。
四.Binder机制
由于传统的IPC为了提高过程间通信的效率,机制需要复制两次数据。 android提出了Binder机制,进程间的通信只能复制一次,然后binder是怎么做到的图片: binder机制的一次复制主要取决于mmap(),Linux通过将一个虚拟内存区域于一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容,整个过程称为内存映射(memory mapping),对文件进行mmap,在虚拟内存分配地址空间的过程中,建立映射关系,实现此类映射关系后,这段内存可以用指针读写,系统会自动回写到相应的文件磁盘上。
所以binder机制跨过程的实现可总结为: 流程1和流程2用户空间内存不共享,不能直接通信,但两个流程的核心空间流程可以共享,发送方可以通过copy_from_user()将数据复制到核心空间,然后核心空间和用户空间的数据接收者的虚拟地址将映射到同一物理地址,该映射技术油mmap()实现。因此,当数据到达核心空间时,由于核心空间和用户空间的接收方将被映射到相同的物理地址,因此也间接相当于将数据复制到接收方,整个过程只涉及一次内存复制。
五.各种IPC机制的对比
我们知道android是基于linux因此,在过程间的通信机制中种通信机制,还有管道socket、信号、信息队列、共享内存、binder。我们常用的其实就是binder,共享内存,以及socket,让我们来看看他们的比较:
总结
以上是今天要讨论的内容,本文只是简要介绍了android如果你想深入了解过程之间的通信原理和使用多个过程的好处binder使用机制和机制的小伙伴还需要研究binder源代码。也欢迎大家在评论区交流讨论。下次我可能会分享android使用过程间通信的方式AIDL实现细节。请期待~~~