binder

首先需要清楚相关的概念,IPC是一种概念,即进程间通信;其它几个都是Android里的概念;Binder是对IPC的具体实行,是IPC的一种具体实现;AIDL是Binder机制向外提供的接口,目的就是为了方便对Binder的使用;Intent是最高层级的封装,实质是封装了对Binder的使用,当然Intent也常常在同一进程中调用,只是把两种方式封装在一起了。


binder与传统IPC优势


Binder是如何做到一次拷贝的

Linux内核实际上没有从一个用户空间到另一个用户空间直接拷贝的函数,需要先用copy_from_user()拷贝到内核空间,再用copy_to_user()拷贝到另一个用户空间。为了实现用户空间到用户空间的拷贝,mmap()分配的内存除了映射进了接收方进程里,还映射进了内核空间。所以调用copy_from_user()将数据拷贝进内核空间也相当于拷贝进了接收方的用户空间,这就是Binder只需一次拷贝的‘秘密’。

补充:内存被操作系统划分成两块:用户空间和内核空间,用户空间是用户程序代码运行的地方,内核空间是内核代码运行的地方。为了安全,它们是隔离的,即使用户的程序崩溃了,内核也不受影响。



MMAP的原理讲解

Linux通过将一个虚拟内存区域与一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射(memory mapping)。

对文件进行mmap,会在进程的虚拟内存分配地址空间,创建映射关系。

样的映射关系后,就可以采用指针的方式读写操作这一段内存,而系统会自动回写到对应的文件磁盘上


tip 所有的系统资源管理都是在内核空间中完成的。比如读写磁盘文件,分配回收内存,从网络接口读写数据等等。用户空间通过系统调用让内核空间完成这些功能。


写文件流程:

1、调用write,告诉内核需要写入数据的开始地址与长度

2、内核将数据拷贝到内核缓存

3、由操作系统调用,将数据拷贝到磁盘,完成写入

aidl

 AIDL是为了方便使用Binder框架搞的一个东西,其实不用这个也能达到目的,但是用这个就简化了操作。

       只要按照规范写一个.aidl文件,插件会帮助自动创建一个与interface同名的.java文件,里面已经帮我们自动写好一堆东东,这些标准化的东西,用模板自动生成即可,让开发者尽量关注功能实现上。 

你可能感兴趣的:(binder)