精华内容
下载资源
问答
  • CentOS 7安装教程(图文详解

    万次阅读 多人点赞 2019-03-26 20:31:55
    CentOS 7安装教程:   准备: 软件:VMware Workstation 镜像文件:CentOS-7-x86_64-bin-DVD1.iso (附:教程较为详细,注释较多,故将操作的选项进行了加粗字体显示。)   1、文件--新建虚拟机--...

    CentOS 7安装教程:

     

    准备:

    软件:VMware Workstation

    镜像文件:CentOS-7-x86_64-bin-DVD1.iso

    (附:教程较为详细,注释较多,故将操作的选项进行了加粗字体显示。)

     

    1、文件--新建虚拟机--自定义

    2、硬盘兼容性--默认

    3、稍后安装操作系统(需要在虚拟机安装完成之后,删除不需要的硬件,所以稍后安装操作系统)

    4、选择客户端操作系统:客户机操作系统--Linux

         版本--centos 64

    (注意:版本一定要对应镜像文件版本,其中centos是32位,centos   64位则就是64位,windows系统应安装64位版本)

    5、命名虚拟机(简略表示出该虚拟机的类型、版本。例如:centos-7 )

    6、处理器配置(CPU)--总处理器核心数一般为 4       

        虚拟机总核心数不能超过主机核心数。若超出则会警告提醒。

     

    7、 此虚拟机内存--一般2G                1M=1024K   E>P>T>G>M>K

    8、网络类型--桥接网络(可以使虚拟机与主机使用同一网络)

       注释:VMnet1网口对应的是仅主机模式

    VMnet8网口对应的是NAT模式

    VMnet0网口对应的是桥接模式

    查看以上对应是在VMware workstation中的编辑-虚拟网络编辑器

     

    9、选择I/O控制器类型(相对于硬盘)--默认

       从硬盘到内存是I(input) 

       从内存在硬盘是O(output)

    10、选择磁盘类型--默认     (硬盘接口,家庭个人常用SATA类型,服务器常用SCSI类型)

    11、选择磁盘--创建新的虚拟磁盘(其他两个不常用)

    12、指定磁盘容量--200G(是假的虚拟的不占主机内存)

    13、指定磁盘文件(.vmdk)文件

     

    14、完成

        删除不需要的硬件--编辑虚拟机设置--删-USB控制器、声卡、打印机(可以使虚拟器启动的快一点)

    也可以手动添加硬件,比如,一个网口不够,再添加一个。

     

    网络连接仍然选择桥接模式

    此时可以看到添加了两个网络适配器

    15、此时虚拟机中的硬件已经搭建完成

     

     

    16、继续添加映像文件,选择设备中的CD/DVD(IDE)

           在连接处选择--使用ISO映像文件--确定

     

     

     

     

    17、进入CentOS安装界面。

      --选择第一项 Install CentOS 7

    18、WELCOME TO CENTOS 7.

           设置语言--推荐使用English--点击Continue

     

    19、INSTALLATION SUMMARY 安装总览(这里可以完成centos 7 版本Linux的全部设置)

    (1)首先,设置时区--DATE & TIME

    找到Asia--Shanghai并点击--Done

    (2)KEYBOARD 键盘就默认是English(US)

     

    (3)LANGUAGE SUPPORT语言支持

    可以是默认的English 也可以自行添加Chinese简体中文的支持

     

    (4)INSTALLATION SOURCE 安装资源

      默认选择--Local media 本地媒体文件

    (5)SOFTWARE SELECTION软件安装选择

    字符界面安装--Minimal install 或者 Basic Web Server

    图形界面安装--Server with GUI 或者 GNOME Desktop

     

    字符界面与图形界面安装过程相同,只在这一步有区分。

    点击--Done进入下一步

    20、INSTALLATION DESTINATION 安装位置---即进行系统分区

         (1)首先选中我们在创建虚拟机时候的200G虚拟硬盘

    (2)下滑菜单找到Other Storage Options--Partitioning--I will configure partitioning选中

    I will configure partitioning  自定义分区

    --点击done

     

    (3)选择Standard Partition 标准分区--点击左下角+ 添加分区

    (4)分区

    creat--Standard Partition--creat--mount point(挂载点)和File System Type(系统文件类型)

    分别创建/boot区、swap交换分区、根分区/

    注释:Linux系统最简单的分区方案:

    1、分/boot区,给200M,/boot放启动文件。

    2、分交换分区(交换空间)swap,看内存总大小,如果内存足够大,这个空间就要设置太大了。如果内存小于2G。那么这个空间设置成内存的2倍大小。

    3、所有空间给/(根分区)

     

     

    (5)分区完成!

    点击Done

    点击Accept Changes

     

    21、回到 INSTALLTION SUMMARY 中

     

    22、KDUMP默认选择

    23、NETWORK & HOST NAME 设置网络连接和主机名

           在Host name处设置主机名:(例如 centos-7)

     

     

    24、这是我们已完成所有设置

           ----Begin Installation

    这时需要设置管理员Root Password务必记住密码!

    密码设置完成后,点击Done

    接下来可以创建用户(此处可以不进行创建,安装完成后进入root也可以重新创建)

    25、centos 7安装完成--点击reboot重启使用

     

    字符界面见下图

     

     

     

    图形界面见下图

     

     

     

    附:

    调出Terminal终端后,使用su root命令可以将用户切换到root管理员,后进行管理员操作:

     

     

    展开全文
  • 一、问题描述 在利用github实现多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,本文总结了两种解决方法:回退(reset)、反做(revert)。...

    2019/7/27 修改更新

    一、问题描述

    在利用github实现多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,本文总结了两种解决方法:回退(reset)、反做(revert)。

    二、背景知识

    git的版本管理,及HEAD的理解

    使用git的每次提交,Git都会自动把它们串成一条时间线,这条时间线就是一个分支。如果没有新建分支,那么只有一条时间线,即只有一个分支,在Git里,这个分支叫主分支,即master分支。有一个HEAD指针指向当前分支(只有一个分支的情况下会指向master,而master是指向最新提交)。每个版本都会有自己的版本信息,如特有的版本号、版本名等。如下图,假设只有一个分支:
    这里写图片描述

    三、解决方法

    方法一:git reset

    原理: git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本,如下图所示,假设我们要回退到版本一:
    这里写图片描述
    适用场景: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。

    具体操作:

    1. 查看版本号:
    可以使用命令“git log”查看:
    在这里插入图片描述
    也可以在github网站上查看:
    这里写图片描述
    2. 使用“git reset --hard 目标版本号”命令将版本回退:
    这里写图片描述
    再用“git log”查看版本信息,此时本地的HEAD已经指向之前的版本:
    在这里插入图片描述
    3. 使用“git push -f”提交更改:
    此时如果用“git push”会报错,因为我们本地库HEAD指向的版本比远程库的要旧:
    这里写图片描述
    所以我们要用“git push -f”强制推上去,就可以了:
    这里写图片描述
    在github图形化界面上看,远程库的HEAD也已经指向目标版本:
    这里写图片描述

    回退成功!

    方法二:git revert

    原理: git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的。比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。如下图所示:
    这里写图片描述
    适用场景: 如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。

    具体操作:

    举个例子,现在库里面有三个文件:READ.md、text.txt、text2.txt。
    在这里插入图片描述
    1. 查看版本号:
    可以通过命令行查看(输入git log):
    如图,最近的两个版本分别叫:“add text.txt”(即新增了文件text.txt)、“add text2.txt”(新增了文件text2.txt)。这个时候我们不需要text.txt这个文件了,那就是说不想要“add text.txt”那个版本的操作,那可以通过反做“add text.txt”这个版本来实现。
    在这里插入图片描述
    也可以通过github网站图形化界面查看版本号:
    在这里插入图片描述
    2.使用“git revert -n 版本号”反做,并使用“git commit -m 版本名”提交:
    (1)反做,使用“git revert -n 版本号”命令。如下命令,我们反做版本号为8b89621的版本:

    git revert -n 8b89621019c9adc6fc4d242cd41daeb13aeb9861
    

    注意: 这里可能会出现冲突,那么需要手动修改冲突的文件。而且要git add 文件名。
    (2)提交,使用“git commit -m 版本名”,如:

    git commit -m "revert add text.txt" 
    

    此时可以用“git log”查看本地的版本信息,可见多生成了一个新的版本,该版本反做了“add text.txt”版本,但是保留了“add text2.txt”版本:
    在这里插入图片描述
    3.使用“git push”推上远程库:

    git push
    

    查看github上显示的远程库版本信息:
    在这里插入图片描述
    此时查看仓库的文件,剩下两个:READ.md、text2.txt
    在这里插入图片描述

    反做成功!

    展开全文
  • SQL server 2008 r2 安装图文详解

    万次阅读 多人点赞 2018-01-13 20:17:03
    文末有官网下载地址、百度网盘下载地址和产品序列号以及密钥,中间需要用到密钥和序列号的可以到文末找 选择网盘下载的下载解压后是镜像文件,还需要解压一次直接右键点击解如图所示选项,官网下载安装包的可以跳过...

    文末有官网下载地址、百度网盘下载地址和产品序列号以及密钥,中间需要用到密钥和序列号的可以到文末找

    ###必看:安装之前如果自己已经安装过sqlServer,卸载过或者安装失败了,建议先到网上找如何干净的卸载,文末大概提了一下如何卸载,卸载干净后再来安装

    选择网盘下载的下载解压后是镜像文件,还需要解压一次直接右键点击解如图所示选项,官网下载安装包的可以跳过前两步

     

     

    等待解压完,过程可能会比较慢

    解压完后双击如图所示选项

     

    安装SQL Server 2008R2需要.NET Framework 3.5 SP1支持

    这里我们的操作系统是WindowsServer 2008 R2,已经默认自带了.NET Framework 3.5 SP1

    如果电脑没安装会提示安装

     

    选择左侧的安装,双击右边的“全新安装或向现有安装添加功能”

    确定

    输入产品密钥,下一步(产品密钥就是上面显示的,直接下一步,需要产品密钥的话文末有,可以输入试试)

    接受许可条款,下一步

    安装

    下一步

    SQL Server功能安装

    选择需要的组件,这里点全选,安装所有组件

    选择安装路径,下一步

    下一步

    默认实例,下一步

    下一步

    服务账户设置,选择对所有SQL Server服务使用相同的账户(双击打开)

    输入操作系统的账户名和密码,确定(如果用户名不是这个的话则点开用户名后面的小三角选择第一项,不需要输入密码,直接确定,然后点击下一步)

    身份验证模式:混合模式

    设置系统管理员(sa)的密码

    点添加,指定SQL Server管理员为操作系统登录账号(win10管理员账号不一样,添加就行了)

    下一步

    下一步

    默认,下一步

    下一步

    下一步

    安装

    正在安装中

    安装完成,点关闭

    Win7打开界面大同小异,这是win10打开界面

     

    把服务器类型点开,选择数据库引擎,直接Windows身份登陆,不用改成SQL server身份验证,点击登陆

     

    安装完成

     

    http://www.microsoft.com/zh-cn/download/details.aspx?id=23650 (官网下载地址)

     

    链接:https://pan.baidu.com/s/1pLp86td  密码:e1qx(百度网盘下载地址)

     

    Microsoft SQLServer 2008 R2序列号密钥

    开发版32位:MC46H-JQR3C-2JRHY-XYRKY-QWPVM
    开发版64位:FTMGC-B2J97-PJ4QG-V84YB-MTXX8

    工组版:XQ4CB-VK9P3-4WYYH-4HQX3-K2R6Q
    WEB版:FP4P7-YKG22-WGRVK-MKGMX-V9MTM

    数据中心版32位:PTTFM-X467G-P7RH2-3Q6CG-4DMYB
    数据中心版64位:DDT3B-8W62X-P9JD6-8MX7M-HWK38

    企业版32位:R88PF-GMCFT-KM2KR-4R7GB-43K4B
    企业版64位:GYF3T-H2V88-GRPPH-HWRJP-QRTYB

    标准版32位:CXTFT-74V4Y-9D48T-2DMFW-TX7CY
    标准版64位:B68Q6-KK2R7-89WGB-6Q9KR-QHFDW

    注:若中途安装错误,导致安装失败,需要到控制面板卸载,然后删除安装目录的文件夹,再删除注册表里SQL server选项,然后重新进行安装,若不删除干净,安装还是会失败

    展开全文
  • Android跨进程通信:图文详解 Binder机制 原理

    万次阅读 多人点赞 2017-06-22 10:31:24
    前言 如果你接触过 跨进程通信 (IPC),那么你对Binder一定不陌生 ...本文采用 清晰的图文讲解方式,按照 大角度 -> 小角度 去分析Binder,即: 先从 机制、模型的角度 去分析 整个B...

    前言

    • 如果你接触过 跨进程通信 (IPC),那么你对Binder一定不陌生
    • 虽然 网上有很多介绍 Binder的文章,可是存在一些问题:浅显的讨论Binder机制 或 一味讲解 Binder源码、逻辑不清楚,最终导致的是读者们还是无法形成一个完整的Binder概念
    • 本文采用 清晰的图文讲解方式,按照 大角度 -> 小角度 去分析Binder,即:
      1. 先从 机制、模型的角度 去分析 整个Binder跨进程通信机制的模型
      2. 再 从源码实现角度,分析 BinderAndroid中的具体实现

    从而全方位地介绍 Binder,希望你们会喜欢。

    请尽量在PC端而不要在移动端看,否则图片可能看不清。


    目录

    目录


    1. Binder到底是什么?

    • 中文即 粘合剂,意思为粘合了两个不同的进程

    • 网上有很多对Binder的定义,但都说不清楚:Binder是跨进程通信方式、它实现了IBinder接口,是连接 ServiceManager的桥梁blabla,估计大家都看晕了,没法很好的理解

    • 我认为:对于Binder的定义,在不同场景下其定义不同

    定义

    在本文的讲解中,按照 大角度 -> 小角度 去分析Binder,即:

    • 先从 机制、模型的角度 去分析 整个Binder跨进程通信机制的模型

    其中,会详细分析模型组成中的 Binder驱动

    • 再 从源码实现角度,分析 BinderAndroid中的具体实现

    从而全方位地介绍 Binder,希望你们会喜欢。


    2. 知识储备

    在讲解Binder前,我们先了解一些Linux的基础知识

    2.1 进程空间划分

    • 一个进程空间分为 用户空间 & 内核空间(Kernel),即把进程内 用户 & 内核 隔离开来
    • 二者区别:
      1. 进程间,用户空间的数据不可共享,所以用户空间 = 不可共享空间
      2. 进程间,内核空间的数据可共享,所以内核空间 = 可共享空间

    所有进程共用1个内核空间

    • 进程内 用户空间 & 内核空间 进行交互 需通过 系统调用,主要通过函数:
    1. copy_from_user():将用户空间的数据拷贝到内核空间
    2. copy_to_user():将内核空间的数据拷贝到用户空间

    示意图

    2.2 进程隔离 & 跨进程通信( IPC )

    • 进程隔离
      为了保证 安全性 & 独立性,一个进程 不能直接操作或者访问另一个进程,即Android的进程是相互独立、隔离的

    • 跨进程通信( IPC
      即进程间需进行数据交互、通信

    • 跨进程通信的基本原理

    示意图

    a. 而Binder的作用则是:连接 两个进程,实现了mmap()系统调用,主要负责 创建数据接收的缓存空间 & 管理数据接收缓存
    b. 注:传统的跨进程通信需拷贝数据2次,但Binder机制只需1次,主要是使用到了内存映射,具体下面会详细说明

    2.5 内存映射

    具体请看文章:操作系统:图文详解 内存映射


    3. Binder 跨进程通信机制 模型

    3.1 模型原理图

    Binder 跨进程通信机制 模型 基于 Client - Server 模式
    示意图

    3.2 模型组成角色说明

    示意图

    此处重点讲解 Binder驱动的作用 & 原理:

    • 简介

    示意图

    • 跨进程通信的核心原理

    关于其核心原理:内存映射,具体请看文章:操作系统:图文详解 内存映射

    示意图

    3.3 模型原理步骤说明

    示意图

    3.4 额外说明

    说明1:Client进程、Server进程 & Service Manager 进程之间的交互 都必须通过Binder驱动(使用 openioctl文件操作函数),而非直接交互

    原因:

    1. Client进程、Server进程 & Service Manager进程属于进程空间的用户空间,不可进行进程间交互
    2. Binder驱动 属于 进程空间的 内核空间,可进行进程间 & 进程内交互

    所以,原理图可表示为以下:

    虚线表示并非直接交互

    示意图

    说明2: Binder驱动 & Service Manager进程 属于 Android基础架构(即系统已经实现好了);而Client 进程 和 Server 进程 属于Android应用层(需要开发者自己实现)

    所以,在进行跨进程通信时,开发者只需自定义Client & Server 进程 并 显式使用上述3个步骤,最终借助 Android的基本架构功能就可完成进程间通信

    示意图

    说明3:Binder请求的线程管理
    • Server进程会创建很多线程来处理Binder请求
    • Binder模型的线程管理 采用Binder驱动的线程池,并由Binder驱动自身进行管理

    而不是由Server进程来管理的

    • 一个进程的Binder线程数默认最大是16,超过的请求会被阻塞等待空闲的Binder线程。

    所以,在进程间通信时处理并发问题时,如使用ContentProvider时,它的CRUD(创建、检索、更新和删除)方法只能同时有16个线程同时工作


    • 至此,我相信大家对Binder 跨进程通信机制 模型 已经有了一个非常清晰的定性认识
    • 下面,我将通过一个实例,分析Binder跨进程通信机制 模型在 Android中的具体代码实现方式

    即分析 上述步骤在Android中具体是用代码如何实现的


    4. Binder机制 在Android中的具体实现原理

    • Binder机制在 Android中的实现主要依靠 Binder类,其实现了IBinder 接口

    下面会详细说明

    • 实例说明:Client进程 需要调用 Server进程的加法函数(将整数a和b相加)

    即:

    1. Client进程 需要传两个整数给 Server进程
    2. Server进程 需要把相加后的结果 返回给Client进程
    • 具体步骤
      下面,我会根据Binder 跨进程通信机制 模型的步骤进行分析

    步骤1:注册服务

    • 过程描述
      Server进程 通过Binder驱动 向 Service Manager进程 注册服务
    • 代码实现
      Server进程 创建 一个 Binder 对象
    1. Binder 实体是 Server进程 在 Binder 驱动中的存在形式
    2. 该对象保存 ServerServiceManager 的信息(保存在内核空间中)
    3. Binder 驱动通过 内核空间的Binder 实体 找到用户空间的Server对象
    • 代码分析
        
        Binder binder = new Stub();
        // 步骤1:创建Binder对象 ->>分析1
    
        // 步骤2:创建 IInterface 接口类 的匿名类
        // 创建前,需要预先定义 继承了IInterface 接口的接口 -->分析3
        IInterface plus = new IPlus(){
    
              // 确定Client进程需要调用的方法
              public int add(int a,int b) {
                   return a+b;
             }
    
              // 实现IInterface接口中唯一的方法
              public IBinder asBinder(){ 
                    return null ;
               }
    };
              // 步骤3
              binder.attachInterface(plus,"add two int");
             // 1. 将(add two int,plus)作为(key,value)对存入到Binder对象中的一个Map<String,IInterface>对象中
             // 2. 之后,Binder对象 可根据add two int通过queryLocalIInterface()获得对应IInterface对象(即plus)的引用,可依靠该引用完成对请求方法的调用
            // 分析完毕,跳出
    
    
    <-- 分析1:Stub类 -->
        public class Stub extends Binder {
        // 继承自Binder类 ->>分析2
    
              // 复写onTransact()
              @Override
              boolean onTransact(int code, Parcel data, Parcel reply, int flags){
              // 具体逻辑等到步骤3再具体讲解,此处先跳过
              switch (code) { 
                    case Stub.add: { 
    
                           data.enforceInterface("add two int"); 
    
                           int  arg0  = data.readInt();
                           int  arg1  = data.readInt();
    
                           int  result = this.queryLocalIInterface("add two int") .add( arg0,  arg1); 
    
                            reply.writeInt(result); 
    
                            return true; 
                      }
               } 
          return super.onTransact(code, data, reply, flags); 
    
    }
    // 回到上面的步骤1,继续看步骤2
    
    <-- 分析2:Binder 类 -->
     public class Binder implement IBinder{
        // Binder机制在Android中的实现主要依靠的是Binder类,其实现了IBinder接口
        // IBinder接口:定义了远程操作对象的基本接口,代表了一种跨进程传输的能力
        // 系统会为每个实现了IBinder接口的对象提供跨进程传输能力
        // 即Binder类对象具备了跨进程传输的能力
    
            void attachInterface(IInterface plus, String descriptor);
            // 作用:
              // 1. 将(descriptor,plus)作为(key,value)对存入到Binder对象中的一个Map<String,IInterface>对象中
              // 2. 之后,Binder对象 可根据descriptor通过queryLocalIInterface()获得对应IInterface对象(即plus)的引用,可依靠该引用完成对请求方法的调用
    
            IInterface queryLocalInterface(Stringdescriptor) ;
            // 作用:根据 参数 descriptor 查找相应的IInterface对象(即plus引用)
    
            boolean onTransact(int code, Parcel data, Parcel reply, int flags);
            // 定义:继承自IBinder接口的
            // 作用:执行Client进程所请求的目标方法(子类需要复写)
            // 参数说明:
            // code:Client进程请求方法标识符。即Server进程根据该标识确定所请求的目标方法
            // data:目标方法的参数。(Client进程传进来的,此处就是整数a和b)
            // reply:目标方法执行后的结果(返回给Client进程)
             // 注:运行在Server进程的Binder线程池中;当Client进程发起远程请求时,远程请求会要求系统底层执行回调该方法
    
            final class BinderProxy implements IBinder {
             // 即Server进程创建的Binder对象的代理对象类
             // 该类属于Binder的内部类
            }
            // 回到分析1原处
    }
    
    <-- 分析3:IInterface接口实现类 -->
    
     public interface IPlus extends IInterface {
              // 继承自IInterface接口->>分析4
              // 定义需要实现的接口方法,即Client进程需要调用的方法
             public int add(int a,int b);
    // 返回步骤2
    }
    
    <-- 分析4:IInterface接口类 -->
    // 进程间通信定义的通用接口
    // 通过定义接口,然后再服务端实现接口、客户端调用接口,就可实现跨进程通信。
    public interface IInterface
    {
        // 只有一个方法:返回当前接口关联的 Binder 对象。
        public IBinder asBinder();
    }
      // 回到分析3原处
    

    注册服务后,Binder驱动持有 Server进程创建的Binder实体

    步骤2:获取服务

    • Client进程 使用 某个 service前(此处是 相加函数),须 通过Binder驱动 向 ServiceManager进程 获取相应的Service信息
    • 具体代码实现过程如下:

    示意图

    此时,Client进程与 Server进程已经建立了连接

    步骤3:使用服务

    Client进程 根据获取到的 Service信息(Binder代理对象),通过Binder驱动 建立与 该Service所在Server进程通信的链路,并开始使用服务

    • 过程描述

      1. Client进程 将参数(整数a和b)发送到Server进程
      2. Server进程 根据Client进程要求调用 目标方法(即加法函数)
      3. Server进程 将目标方法的结果(即加法后的结果)返回给Client进程
    • 代码实现过程

    步骤1: Client进程 将参数(整数a和b)发送到Server进程

    // 1. Client进程 将需要传送的数据写入到Parcel对象中
    // data = 数据 = 目标方法的参数(Client进程传进来的,此处就是整数a和b) + IInterface接口对象的标识符descriptor
      android.os.Parcel data = android.os.Parcel.obtain();
      data.writeInt(a); 
      data.writeInt(b); 
    
      data.writeInterfaceToken("add two int");;
      // 方法对象标识符让Server进程在Binder对象中根据"add two int"通过queryLocalIInterface()查找相应的IInterface对象(即Server创建的plus),Client进程需要调用的相加方法就在该对象中
    
      android.os.Parcel reply = android.os.Parcel.obtain();
      // reply:目标方法执行后的结果(此处是相加后的结果)
    
    // 2. 通过 调用代理对象的transact() 将 上述数据发送到Binder驱动
      binderproxy.transact(Stub.add, data, reply, 0)
      // 参数说明:
        // 1. Stub.add:目标方法的标识符(Client进程 和 Server进程 自身约定,可为任意)
        // 2. data :上述的Parcel对象
        // 3. reply:返回结果
        // 0:可不管
    
    // 注:在发送数据后,Client进程的该线程会暂时被挂起
    // 所以,若Server进程执行的耗时操作,请不要使用主线程,以防止ANR
    
    
    // 3. Binder驱动根据 代理对象 找到对应的真身Binder对象所在的Server 进程(系统自动执行)
    // 4. Binder驱动把 数据 发送到Server 进程中,并通知Server 进程执行解包(系统自动执行)
    
    

    步骤2:Server进程根据Client进要求 调用 目标方法(即加法函数)

    // 1. 收到Binder驱动通知后,Server 进程通过回调Binder对象onTransact()进行数据解包 & 调用目标方法
      public class Stub extends Binder {
    
              // 复写onTransact()
              @Override
              boolean onTransact(int code, Parcel data, Parcel reply, int flags){
              // code即在transact()中约定的目标方法的标识符
    
              switch (code) { 
                    case Stub.add: { 
                      // a. 解包Parcel中的数据
                           data.enforceInterface("add two int"); 
                            // a1. 解析目标方法对象的标识符
    
                           int  arg0  = data.readInt();
                           int  arg1  = data.readInt();
                           // a2. 获得目标方法的参数
                          
                           // b. 根据"add two int"通过queryLocalIInterface()获取相应的IInterface对象(即Server创建的plus)的引用,通过该对象引用调用方法
                           int  result = this.queryLocalIInterface("add two int") .add( arg0,  arg1); 
                          
                            // c. 将计算结果写入到reply
                            reply.writeInt(result); 
                            
                            return true; 
                      }
               } 
          return super.onTransact(code, data, reply, flags); 
          // 2. 将结算结果返回 到Binder驱动
    
    
    

    步骤3:Server进程 将目标方法的结果(即加法后的结果)返回给Client进程

      // 1. Binder驱动根据 代理对象 沿原路 将结果返回 并通知Client进程获取返回结果
      // 2. 通过代理对象 接收结果(之前被挂起的线程被唤醒)
    
        binderproxy.transact(Stub.ADD, data, reply, 0);
        reply.readException();;
        result = reply.readInt();
              }
    }
    
    • 总结
      下面,我用一个原理图 & 流程图来总结步骤3的内容

    原理图

    流程图


    5. 优点

    对比 LinuxAndroid基于Linux)上的其他进程通信方式(管道、消息队列、共享内存、
    信号量、Socket),Binder 机制的优点有:
    示意图


    6. 总结

    • 本文主要详细讲解 跨进程通信模型 Binder机制 ,总结如下:

    定义

    特别地,对于从模型结构组成的Binder驱动来说:

    示意图

    • 整个Binder模型的原理步骤 & 源码分析

    示意图

    Carson带你学Android 文章系列:
    Carson带你学Android:页面活动-Activity
    Carson带你学Android:广播-BroadcastReceiver
    Carson带你学Android:服务-Service
    Carson带你学Android:内存承载器-ContentProvider


    欢迎关注Carson_Ho的CSDN博客 与 公众号!

    博客链接:https://carsonho.blog.csdn.net/


    请帮顶 / 评论点赞!因为你的鼓励是我写作的最大动力!

    展开全文
  • CentOS 7 下使用yum安装MySQL5.7.20 最简单 图文详解

    万次阅读 多人点赞 2017-12-26 21:15:56
    CentOS7默认数据库是mariadb, 但是 好多用的都是mysql ,但是CentOS7的yum源中默认好像是没有mysql的。 上一篇安装的是5.6的但是我想安装5.7的 yum安装是最简单的 尝试过编译安装各种问题,最后就决定用yum。...
  • Dijkstra算法图文详解

    万次阅读 多人点赞 2018-11-20 09:19:59
    Dijkstra算法   Dijkstra算法算是贪心思想实现的,首先把起点到所有点的距离存下来找个最短的,然后松弛一次再找出最短的,所谓的松弛操作就是,遍历一遍看通过刚刚找到的距离最短的点作为中转站会不会更近,如果...
  • Docker图文详解

    2020-09-30 00:37:39
    今天小编就为大家分享一篇关于Docker图文详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 电脑硬件图文详解电脑硬件图文详解电脑硬件图文详解
  • centos7安装图形化界面图文详解

    万次阅读 多人点赞 2019-09-05 11:03:00
    centos7没有图形化操作可能对很多人来说都不太习惯,下面我们来为centos7安装图形化界面,本文以安装 GNOME 图形化为例 写在安装前: 如果你的centos7是最小化安装的那默认都是不带X WINDOWS的,那在安装图形化界面...
  • OsWorkflow 图文详解!javamial图文详解.docx
  • zookeeper概述图文详解

    2020-08-26 11:25:18
    今天小编就为大家分享一篇关于Zookeeper概述图文详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • vlan图文详解

    2014-09-13 20:16:50
    vlan 图文详解
  • Tensorflow安装教程详解(图文详解,深度好文)

    万次阅读 多人点赞 2020-08-10 08:01:17
    Tensorflow安装教程详解(图文详解,深度好文)前言安装前的准备工作关于python关于Anaconda开始使用Tensorflow系统内配置Anaconda使用路径Anaconda Navigator内设置路径后记 前言 本篇内容节选自本人即将出版的新书...
  • 今天小编就为大家分享一篇关于MapReduce核心思想图文详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 分区命令FDISK图文详解
  • 今天小编就为大家分享一篇关于MapTask工作机制图文详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 今天小编就为大家分享一篇关于Hadoop之NameNode Federation图文详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 今天小编就为大家分享一篇关于Springmvc的运行流程图文详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 链表(图文详解

    万次阅读 多人点赞 2019-07-10 12:49:49
    链表与数组的对比,单链表和双链表的对比,双链表性能比单链表好,为什么不经常使用?有环链表面试题?
  • ImageView是用于界面上显示图片的控件。这篇文章主要介绍了Android ImgView属性图文详解,需要的朋友参考下
  • 关于视图动画可以参见博文《Android四大视图动画图文详解》。 一、概述 视图动画局限比较大,如下所述: 1、视图动画只能使用在View上面。 2、视图动画并没有真正改变View相应的属性值,这导致了UI效果与实际View...
  • 笔记本 拆键盘 图文详解 笔记本 拆键盘 图文详解 笔记本 拆键盘 图文详解
  • java KMP算法图文详解.pdf
  • 电子基础元器件图文详解电子基础元器件图文详解电子基础元器件图文详解图文详解
  • 今天小编就为大家分享一篇关于Java LinkedList的实现原理图文详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • php环境搭建图文详解

    2015-07-20 06:34:03
    php环境搭建图文详解——图文挺详细的。
  • 惠普 CQ40 拆机 图文 详解 惠普 CQ40 拆机 图文 详解
  • IIS7配置.图文详解

    2011-04-10 00:52:38
    IIS7配置.图文详解IIS7配置.图文详解IIS7配置.图文详解IIS7配置.图文详解IIS7配置.图文详解

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,577
精华内容 10,230
关键字:

图文详解