• Android


    以下资料摘录整理自老罗的Android之旅博客,是对老罗的博客关于Android底层原理的一个抽象的知识概括总结(如有错误欢迎指出)(侵删):
    http://blog.csdn.net/luoshengyang/article/details/8923485
    http://blog.csdn.net/luoshengyang/article/details/12957169

     整理by Doing
     
    匿名共享内存子系统Ashmem(Anonymous Shared Memory)
            主体是以驱动程序的形式实现在内核空间的,同时,在系统运行时库层和应用程序框架层提供了访问接口,其中,在系统运行时库层提供了C/C++调用接口,而在应用程序框架层提供了Java调用接口应用程序框架层的Java调用接口是通过JNI方法来调用系统运行时库层的C/C++调用接口,最后进入到内核空间的Ashmem驱动程序去。
            我们在这里举一个例子:一个名为Ashmem的应用程序,它包含了一个Server端和一个Client端实现,其中,Server端是以Service的形式实现的,在这里Service里面,创建一个匿名共享内存文件,而Client是一个Activity,这个Activity通过Binder进程间通信机制获得前面这个Service创建的匿名共享内存文件的句柄,从而实现共享。在Android应用程序框架层,提供了一个MemoryFile接口来封装了匿名共享内存文件的创建和使用,它实现在frameworks/base/core/java/android/os/MemoryFile.java文件中。Server端是通过MemoryFile类来创建匿名共享内存文件,Client获得这个匿名共享内存文件的句柄
     
    匿名共享内存子系统Ashmem:
    • 能够辅助Linux内核的内存管理系统来有效地管理不再使用的内存块
        Ashmem驱动程序实现:创建(open)、映射(mmap)、读写(read/write)以及锁定和解锁(pin/unpin)
        Ashmem驱动程序不提供read和write文件操作,进程若要访问这个共享内存,必须要把这个设备文件映射到自己的进程空间中,然后进行直接内存访问。MemoryFile的匿名共享内存读写操作都是通过JNI方法来实现的,读操作和写操作的JNI方法分别是native_read和native_write。
    • 通过Binder进程间通信机制来实现进程间的内存共享:
        在Linux系统中,文件描述符其实就是一个整数,它是用来索引进程保存在内核空间的打开文件数据结构的,而且,这个文件描述符只是在进程内有效,也就是说,在不同的进程中,相同的文件描述符的值,代表的可能是不同的打开文件,既然是这样,把Server进程中的文件描述符传给Client进程,似乎就没有用了,但是不用担心,在传输过程中,Binder驱动程序会帮我们处理好一切,保证Client进程拿到的文件描述符是在本进程中有效的,并且它指向就是Server进程创建的匿名共享内存文件
        可以通过Binder IPC在进程间进行传递和共享 – flat_binder_object(BINDER_TYPE_FD)。
        Binder驱动对类型BINDER_TYPE_FD 的Binder对象(flat_binder_object)的 处理:
    1. 在源进程中找到对应的struct file结构体
    2. 将上述struct file结构体 保存在目标进程的打开文件列表中
    3. 构造一个类型为BINDER_TYPE_FD的flat_binder_object
    4. 将上述flat_binder_object发送给目标进程
     
     
    Ashmem进程间共享原理--文件、文件结构体、文件描述符的关系
     
    Ashmem进程间共享原理--两个在不同进程中的文件描述符对应同一个指向设备文件/dev/ashmem的文件结构体

     
    句柄(handle)
        在程序设计中,句柄(handle)是一种特殊的智能指针。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。     句柄与普通指针的区别在于,指针包含的是引用对象的内存地址,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址上。这种间接访问对象的模式增强了系统对引用对象的控制(封装)。通俗的说就是我们调用句柄就是调用句柄所提供的服务,即句柄已经把它能做的操作都设定好了,我们只能在句柄所提供的操作范围内进行操作,但是普通指针的操作却多种多样,不受限制。
     
    文件描述符:
        文件描述符在形式上是一个非负整数。实际上,它是一个索引值指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。(在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。)
     



  • 相关阅读:
    【Nginx】基本使用
    解决Visual Studio报错 NETSDK1152: 找到了多个具有相同相对路径的发布输出文件
    可以使用vmodel的自定义radio组件(element ui实现)
    什么是走索引?
    关于 GIN 的路由树
    【实操干货】做好这 16 项优化,你的 Linux 操作系统焕然一新
    JAVA 使用HTML2IMAGE将HTML转图片
    基于EZGMAIL的谷歌邮件收发配置
    python3 plotly库笔记
    .net5 gRPC支持swagger 同时支持grpc和webapi
  • 原文地址:https://www.cnblogs.com/Doing-what-I-love/p/5530263.html
Copyright © 2020-2023  润新知