前言
内存也被成为内存储器,其作用是暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换数据。内存是计算机中重要的部件之一,是用户任务与CPU处理进行沟通的桥梁。CPU会把计算机运行中需要的数据放到内存中进行运算处理,并将运算完成后的结果传送出来。
android的进程通信机制
要想实现对android系统内存的优化,需要首先了解android的内存系统,了解内存控制进程运行的机制。
IPC机制介绍
在android5.0系统中,每一个应用程序都是由一些Activity和Service组成的,一般Service运行在独立的进程中,而Activity可能运行在同一进程中,也有可能运行在不同的进程中,也有可能运行在不同的进程中。android系统通过Binder进程间通信机制来实现在不同进程的Activity或者Service之间的通信。
其实Binder并不是android提出来的一套新的进程间通信机制,它是基于OpenBinder来实现的,Binder是一种进程间通信机制,android系统的Binder机制由如下系统组件组成。
- Client
- Server
- Service Manager
- Binder驱动程序
其中,Client、Server和Service Manager在用户空间运行,Binder驱动程序在内核空间中运行。Binder就是一种把这4个组件“黏合”在一起的“黏合剂”。其中的核心组件便是Binder驱动程序,Service Manager提供了辅助管理的功能,Client和Server正是在Binder驱动和Service Manager提供的基础设施上实现Client/Server之间的通信。Service Manager和Binder驱动已经在android平台中实现完毕,开发者只需要按照规范实现自己的Client和Server组件即可。
要深入理解Binder机制,必须了解Binder在用户空间的3个组件Client、Server和Service Manager之间的相互关系,并了解内核空间中Binder驱动程序的数据结构和设计原理。具体来说,android系统Binder机制中的4个组件Client、Server、Service Manager和Binder驱动程序的关系如下图所示。
- Client、Server和Service Manager:在用户空间中实现,Binder驱动程序在内核空间中实现。
- Binder驱动程序和Service Manager:已经在android平台中实现,开发者只需要在用户空间实现自己的Client和Server即可。
- Binder驱动程序提供的设备文件/dev/binder:负责与用户空间进行交互,Client、Server和Service Manager通过文件操作函数open()和ioctl()与Binder驱动程序进行通信。
- Service Manager:是一个用来管理Server的保护进程,并向Client提供查询Server接口的能力。
Service Manager是Binder机制的上下文管理者
Service Manager是整个Binder机制的保护进程,用来管理开发者创建的各种Server,并且向Client提供查询Server远程接口的功能。因为Service Manager组件的功能是用来管理Server并且向Client提供查询Server远程接口,所以Service Manager必然要和Server以及Client进行通信。Service Manager、Client和Server三者分别是运行在独立进程当中的,这样它们之间的通信也属于进程间的通信,而且也是采用Binder机制进行进程间通信。因此,Service Manager在充当Binder机制的保护进程角色的同时,也在充当Server的角色,是一种特殊的Server。
Service Manager在Binder机制中的基本执行流程如下图所示。
下面简要总结Service Manager成为android进程间通信机制Binder保护进程的过程。
打开/dev/binder文件。
1open("/dev/binder", O_RDWR);建立128K内存映射。
1mmap(NULL, mapsize, PROT_READ, MAP_PRIVATE, bs->fd, 0);通知Binder驱动程序它是保护进程。
1binder_become_context_manager(bs);进入循环等待请求的到来。
1binder_loop(bs, svcmgr_handler);
在这个过程中,在Binder驱动程序中建立了一个struct binder_proc结构、一个struct binder_thread结构和一个struct binder_node结构,这样,Service Manager就在android系统的进程间通信机制Binder担负起保护进程的职责了。
匿名共享内存子系统
android系统提供了独特的匿名共享子系统Ashmem,以驱动程序的形式实现在内核空间中。
Ashmem系统基础
在android5.0系统中,Ashmem具有如下两个特点。
① 能够辅助内存管理系统有效地管理不再使用的内存块。
② 通过Binder进程间通信机制来实现进程间的内存共享。
对于android系统的匿名共享内存子系统来说,其主体是以驱动程序的形式实现在内核空间的,同时,在系统运行时库层和应用程序框架层提供了访问接口。其中在系统运行时库层提供了C/C++调用接口,而在应用程序框架层提供了Java调用接口。在此将直接通过应用程序框架层提供的Java调用接口来说明匿名共享内存子系统Ashmem的使用方法,毕竟在android开发应用程序时,是基于Java语言的。其实应用程序框架层的Java调用接口是通过JNI方法来调用系统运行时库层的C/C++调用接口,最后进入到内核空间的Ashmem驱动程序中的。
android系统的匿名共享内存Ashmem驱动程序利用了Linux的共享内存子系统导出的接口来实现自己的功能。在android系统匿名共享内存系统中,其核心功能是实现创建(open)、映射(mmap)、读写(read/write)以及锁定和解锁。