binder

service_manager.c 中的main函数首先会去调用binder.c 的函数binder_open,然后又会调用binder.c 的函数binder_loop,我们看下binder_open和binder_loop函数分别做了什么.

binder_open首先打开了binder驱动文件("/dev/binder")如下:
bs->fd = open(driver, O_RDWR | O_CLOEXEC);
然后通过mmap函数把物理内存和binder文件实现一层映射关系,如下:
bs->mapped = mmap(NULL, mapsize, PROT_READ, MAP_PRIVATE, bs->fd, 0);

binder_loop函数做了什么呢?
通过一个死循环for ( ; 😉 来循环查询驱动文件是否有内容,一旦其他进程有发消息给binder驱动,binder_loop就会把消息的内容直接读到bwr里面,然后通过函数binder_parse来解析bwr中的数据。
res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr);

Sharepreference的效率低,是因为cpu要在用户空间和内核空间进行切换,切换比较耗时,所以比MMKV效率低得多。
MMKV也是通过mmap函数和物理内存映射的,应用层的应用直接去读取物理内存,所以没有用户态和内核态的切换,所以效率就高了很多。

虚拟内存被操作系统划分成两块:用户空间和内核空间,用户空间是用户程序代码运行的地方,内核空间是内核代码运行的地方。为了安全,它们是隔离的,即使用户的程序崩溃了,内核也不受影响。
Sharepreference使用I/O写入文件的流程
1、调用write,告诉内核需要写入数据的开始地址与长度
2、内核将数据拷贝到内核缓存
3、由操作系统调用,将数据拷贝到磁盘,完成写入
可见,将数据写入文件需要将数据拷贝两次,再写入到文件中,如果数据量过大,也会有很大的性能损耗。

2、MMAP(memory mapping)
Linux通过将一个虚拟内存区域与一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射(memory mapping)
对文件进行映射,会在进程的虚拟内存分配地址空间,创建映射关系。实现这样的映射关系后,就可以采用指针的方式读写操作这一段内存,而系统会自动回写到对应的文件磁盘上。

https://www.pianshen.com/article/3284787080/
http://androidxref.com/8.1.0_r33/xref/frameworks/native/cmds/servicemanager/service_manager.c
https://www.bilibili.com/video/BV1ap4y1k7vZ?p=6&spm_id_from=pageDriver

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值