3. Android binder设计篇

  • 时间:
  • 浏览:3
  • 来源:uu快3网站_uu快3充值_玩法

binder_node底下讲过,关联了binder_proc,以及service程序运行池池底下的service组件,也本来binder本地对象。

binder 机制死亡通知的过程是一一好几只 多的:

17. binder driver通过binder_transaction找到第15点的client程序运行池池和程序运行池,通过从service manager返回的句柄值找到binder driver底下对应的service 实体对象。或者唤醒client程序运行池。

那一些同学就会问了,这里说Binder设计,为那些要提到女娲造人的故事呢?这是或者二者在源头你你这人问题图片的防止上有异曲同工之妙,嗯,底下会再做说明。

binder_proc使用了红黑树的数据内部人员来描述了它底下binder_node。

详见:

23. 或者binder实体对象有个cookie值指向用户空间service程序运行池池的的service地址,全都 service在被唤醒后,它都都还能否 找到是由哪个service组件来响应此次服务(service程序运行池池内或者不止一一好几只 service组件)。

binder driver底下的binder引用对象。

enum BinderDriverCommandProtocol {

所谓的实名和匿名是针对service manager而言的,本来service manager知告诉我你你这人binder对象的处在,或者给它一一好几只 名字相对应。

binder driver请求用户空间程序运行池池增加指定binder本地对象的强引用

2. 高效性,比如对于手机你你这人东西,亲戚大伙儿 肯定希望它反应飞快,界面流畅;

client通知binder driver对某个service程序运行池池的binder本地对象死亡通知防止完毕。

通知binder driver增加目标service 强引用,参数int表示目标service的handle值.

在用户空间程序运行池池请求BC_CLEAR_DEATH_NOTIFICATION命令后,binder driver返回你你这人命令通知用户空间程序运行池池

对于所有的binder 命令,都都还能否 用下面两张表来描述:

11. client程序运行池池启动后,也会像service和service manager一样通过open和mmap土法子请求binder driver为client程序运行池池分配一块内存用户程序运行池池间通信。

对应一一好几只 程序运行池池,当程序运行池池调用open土法子打开binder driver的本来,binder driver会保存你你这人程序运行池池的相关信息,本来用binder_proc你你这人数据内部人员。

通知binder driver此程序运行池退出

这是或者binder driver是在内核空间,binder本地对象在service程序运行池池的用户空间,只能直接引用。

在底下亲戚大伙儿 说起过,一一好几只 程序运行池池中或者有多个service组件,比如service2程序运行池池,那在binder driver底下也是你你这人关系。

没人 那些操作

     本文转自rongwei84n 51CTO博客,原文链接:http://blog.51cto.com/483181/1744571,如需转载请自行联系原作者

2. 异常退出,比如或者程序运行池池底下的一一好几只 逻辑错误是因为程序运行池池退出

d. Binder本地对象,运行在service用户空间,对应的数据是BBinder,着实本来一一好几只 提供服务的Binder service。

client通知binder driver注销注册对某个service binder本地对象的死亡通知监听

2. 底下说的Binder代理对象,Binder引用对象,Binder实体对象,Binder本地对象是按照从client到service的顺序的,都都还能否 按个解释下这哪几只对象的含义。

就好比说人是女娲造的,那女娲又是哪里来的呢?

20. client和service通信,client使用第19步获取到的mHandle句柄值,发送给binder driver。

那何如么来管理这块内存呢?

此时,service manager的程序运行池池正在睡眠等候情况报告,于是binder driver把要防止的工作封装成一一好几只 binder_transaction丢给service manager程序运行池池,也本来把数据拷贝到binder driver为service manager分配的那块内存(也本来第2步binder driver为service manager分配的那块内存),这也是binder数据传输的唯一一次数据拷贝,或者唤醒它。

BC_ENTER_LOOPER是用户空间程序运行池池主动通知binder driver的,

3. BC_XXX

14. binder driver把从client传入的数据拷贝到为service manager分配的那块内存,生成一一好几只 binder_transaction,或者唤醒service manager程序运行池池。

一一好几只 多,client就都都还能否 向service manager通过指定的名字去查询本来注册的service,从而找到对应的Binder实体对象,再继而生成属于此人 程序运行池池的Binder 引用对象。

或者binder driver在请求service程序运行池池增加一一好几只 service组件的强引用本来,它都还能否 等候service组件增加强引用计数的结果,它都还能否 根据你你这人结果修改此人 的一些情况报告。

21. binder driver根据mHandle句柄值找到client程序运行池池内对应的binder引用对象,再根据binder引用对象找到它对应的binder实体对象,再根据binder实体对象找到其所在的binder程序运行池池。或者把数据拷贝到binder driver为service程序运行池池分配的那块内存,再唤醒service程序运行池池。

Binder作为Android底下程序运行池池间通信机制,主要一一好几只 多模块参与你你这人过程,分别是

3. 安全性,手机涉及了多量的用户隐私,比如支付宝账号,电话本联系人号码,短信记录,通话记录等等;

对于service程序运行池池死亡,一般都都还能否 分为并删剪都是情况报告:

好吧,跟神话故事一样,亲戚大伙儿 也是假设service manager是本来处在的,或者规定它的句柄值本来0。

5. 在上图中亲戚大伙儿 想看 一些service程序运行池池中或者处在多个service组件,比如service2程序运行池池。它们都通过binder driver注册到了service manager,或者它们有不同的名称对应以及不同的service组件地址,你这人个 区别分别会被service manager和binder driver(通过binder_node内部人员体的cookie数据)所记住。

3. 一一好几只 多,binder driver就记录下了与service manager 对应的binder实体对象(也本来图中的sm binder实体)。

全都 ,底下并删剪都是或者都都都还能否 在binder driver的binder_release函数中去防止。

6. binder程序运行池池,用户空间的程序运行池池有个程序运行池池来响应binder driver,或者有个上限,一般是1一好几只 程序运行池,详见

暂不支持

提供服务的service程序运行池池死亡了何如么办?

service

c. Binder实体对象,运行在Binder driver内核空间,对应的数据是binder_node内部人员体。

一. 引言--女娲造人的故事

通知binder driver增加目标service 弱引用, 参数int表示目标service的handle值,

13. binder driver接受到client的查询请求后,根据句柄值0找到service manager的binder实体对象(sm binder实体),或者通过sm binder实体对象找到service manager程序运行池池。此时,service manager程序运行池池正处在等候情况报告。

service manager提供service的注册,查询等服务,那说的再明白一些,本来service Binder本地对象把此人 和一一好几只 名字加带到service manager注册;

flat_binder_object顾名思义本来压扁了的binder_object,为那些要压扁呢?是为了传输的需求,全都 把binder对象从用户空间传输到binder driver内核空间的本来,就都还能否 用到你你这人数据内部人员,比如addService的本来。

总体来说,Binder肯定是一一好几只 不错的程序运行池池间通信机制,或者android经过没人 多年的发展,或者Binder删剪都是足够优秀话语,以google的技术实力,早就被google替换了吧!

   ...

七. binder命令

Andoid Binder从Open Binder发展而来,提供了跨程序运行池池通信机制;着实linux或者提供全都 的跨程序运行池池机制,比如管道,共享内存等等,那为那些google要使用binder呢?

   ...

换句话本来说binder driver为service manager分配了一块同時 被内核空间和用户空间映射的内存。

4. service manager请求binder driver为它分配的内存是128kb,一般程序运行运行池池(client, service)请求binder driver为它分配的内存是1MB - 8KB。

client和service作为通信的模块很容易理解,或者client都还能否 和service通信,全都 它们一一好几只 必然会成为通信的一偏离 。

全都 都都还能否 区分。

此命令和BC_REGISTER_LOOPER的区别本来

那Binder driver是做那些用的呢?

那,binder driver为那些不直接引用binder 本地对象呢?

c. 当binder driver检测到目标service程序运行池池或者死亡时,它找到你你这人程序运行池池所有binder本地对象在binder driver底下对应的binder实体对象。

一一好几只 多们都都还能否 来做一一好几只 多并删剪都是假设:

五. 实名binder对象和匿名binder对象

1. 这里说的service和android应用底下说的4大组件service并就一一好几只 多概念,这里的service指的是提供Binder服务的Binder本地对象。

19. 在client程序运行池池用户空间,把句柄值拷贝出来,封装成一一好几只 BpBinder对象,BpBinder对象底下mHandle值就保存了你你这人句柄值。

通知binder driver减少目标service弱引用,参数int表示目标service的handle值.

或者向service manager注册service;正如第2点所言,binder driver强制规定了0号句柄对应的是service manager实体对象,全都 service程序运行池池倘若传入0号句柄,或者把想注册的service同時 传入过来就都都还能否 了。

3. 或者火车票是实名制的,全都 铁道部能知道卖出的票和购买人的***一一对应;或者对于站台票,铁道部未必能知道你你这人对应关系;

4. 购买站台票删剪都是想买就都都还能否 买的,都还能否 持有火车票吃都都还能否 购买站台票;

d. 或者根据binder实体对象找到所有引用它的binder引用对象,或者发现binder引用对象有注册死亡通知,没人 就封装一一好几只 binder_work项给binder引用对象所在的程序运行池池,或者唤醒它;让那个程序运行池池去完成此人 的逻辑。

那binder_transaction_data就刚好是用来描述从用户空间到内核空间传输binder_transaction数据的。

用户空间程序运行池池创建程序运行池完毕后,会调用BC_REGISTER_LOOPER通知binder driver。

在初步了解binder机制的通信过程后,亲戚大伙儿 都还能否 更深一步的了解binder通信,全都 都还能否 简单讲解下binder通信过程中的数据内部人员。

这张图或者基本包括了binder通信过程中的所有对象,亲戚大伙儿 都都还能否 用言语来简略的描述下你你这人过程和各个对象的含义,至于更删剪的亲戚大伙儿 底下再讲。

16. service manager被唤醒后,把binder driver拷贝给它的数据读取出来,当然最重要的是从client程序运行池池传入的service 名称。通过查找,找到名称对应的句柄值。也本来第7点那个名称和句柄值。或者通过ioctl再次回到binder driver。

那在binder机制底下,删剪都是你你这人问题图片:本来client通过service manager拿到service的binder句柄值,没人 service何如么拿到service manager的句柄值呢?

全都 ,这人的,binder机制底下也采用你你这人概念。

enum BinderDriverReturnProtocol {

通知用户空间程序运行池池,binder driver防止成功

a. client程序运行池池拿到指向service程序运行池池binder本地对象的引用后,它都都还能否 向你你这人service程序运行池池binder本地对象请求注册一一好几只 死亡通知(着实本来BpBinder,或者它实现了死亡通知的接口)。

句柄值对应client底下的binder代理对象BpBinder底下的mHandle,全都 client都都还能否 根据mHandle找到内核对应的binder_ref数据。

7. service manager程序运行池池被唤醒后,回到service manager用户空间,同時 把binder driver拷贝过来的数据读取出来,把名称和从binder driver传入的句柄值保存起来,再次执行结果通过ioctl指令通知binder driver。

android_proj/framework/base/libs/binder/ProcessState.cpp

此命令是binder driver通知用户空间程序运行池池创建程序运行池后,用户空间程序运行池池创建程序运行池删剪都是调用此命令,通知binder driver此程序运行池或者准备好。

8. service manager程序运行池池回到binder driver本来,通过本来第5步产生的binder_transaction找到本来调用的binder driver的service程序运行池池和程序运行池,把第7点从service manager返回的结果读出来,或者拷贝到binder driver为service分配的内存,再唤醒service程序运行池。

通过底下几点介绍,一到七点保证了binder间程序运行池池通信,第八点保证了生命周期管理,一切看起来都没人 完美。

22. client程序运行池池的调用程序运行池进入等候情况报告。

binder driver请求用户空间程序运行池池增加指定binder本地对象的弱引用

或者是第1种情况报告,程序运行池池会此人 主动close掉此人 程序运行池池打开的binder driver;从而调用到binder driver的binder_release函数。

#define BINDER_VM_SIZE ((1*1024*1024) - (4096 *2))

2. service manager首先注册为binder driver的服务管理者,注册的过程中,service manager会调用open和mmap土法子来通知binder driver为它分配一块最大不超过4MB的内存,当然你你这人大小都都还能否 由service manager来指定,service manager指定的是128KB。这块内存同時 被一一好几只 虚拟地址应用,一一好几只 binder driver的一一好几只 是service manager的。

那对于实名binder和匿名binder也是没人 ,匿名binder删剪都是想创建就能创建的,首先都还能否 得到一一好几只 实名binder,通过实名binder得到匿名binder,具体例子都都还能否 参考bindService得到一一好几只 匿名binder的实现。

为了防止你你这人问题图片,binder机制使用了引用的概念:

或者service manager程序运行池池进入等候情况报告,等候别的程序运行池池来唤醒。比如别的程序运行池池要注册service或者查询service。

binder driver反馈目标binder对象或者死亡,返回错误。

binder driver请求用户空间程序运行池池分配一一好几只 程序运行池;你你这人情况报告一般是在用户空间程序运行池池程序运行池池无法防止binder driver间通信请求的情况报告下。

九. 死亡通知机制

通知用户空间程序运行池池所监听的binder本地对象或者销毁

binder_ref主要的作用本来拥一一好几只 多句柄值,同時 指向一一好几只 binder_node binder实体对象。

18. 在binder driver底下,client程序运行池根据service 实体对象,生成属于client程序运行池池的binder引用对象,也本来一一好几只 句柄值,再返回client程序运行池池用户空间。

12. client程序运行池池向service manager发起查询service请求,同時 传入要查询service的名称,传入的binder句柄值是0,也本来对应着service manager。

}

client

binder driver请求用户空间程序运行池池减少指定binder本地对象的强引用

或者它对于女娲你你这人service manager而言,女娲并告诉我它们的处在和名字。

通知binder driver去释放一一好几只 binder_buff的内存,参数int表示此binder_buff在用户空间程序运行池池的虚拟映射地址。

3. 或者亲戚大伙儿 想看 想看 对于service manager在binder driver中, client和并没人 binder引用对象,而一些service在client程序运行池池中却有binder 引用对象,这是为那些呢?

  ...

Binder Driver

1. BC_XXX

client程序运行池池引用service程序运行池池的一一好几只 binder本地对象正在通信,或者你你这人本来service程序运行池池把你你这人binder本地对象回收了何如么办?

通知用户空间程序运行池池,binder driver防止经常出现异常

在天地混沌之际,上神女娲或者着实此人 太孤单,没人 跟它同時 嗨,决定按照此人 的模样加带一些生物;于是呢,捏泥为人,并赋予了人生育的能力,全都 女娲被称为了人类的母亲;

跟binder本地对象死亡通知有关。

二. Android Binder简介

b. binder driver记录下了这层对应关系。

或者,还是有意外情况报告处在,那本来:

BC_REGISTER_LOOPER是binder driver发现此用户空间程序运行池池的程序运行池池无法响应binder通信,都还能否 创建新程序运行池;或者向目标用户空间程序运行池池发出请求创建程序运行池命令

或者service manager程序运行池池本来会像一些service程序运行池池一样,或者处在多个service服务。

那对于service manager和实名binder,匿名binder也是你你这人关系 -- service mangager清楚的知道所有实名binder的名称,binder服务所在的程序运行池池等等信息,或者对于匿名binder却一无所知,它甚至告诉我匿名binder的处在。

ioctl指令BINDER_WRITE_READ的数据内部人员。

你你这人反衬或者难以理解话语,那再举个更加现实的栗子:

八. 引用计数

5. binder driver接到service的ioctl调用后,找到第2点描述的sm binder实体,或者通过你你这人sm binder实体找到service manager对应的程序运行池池。

6. 此时,service程序运行池池会返回service程序运行池池用户空间,然删剪都是再次进入binder driver,或者进入等候情况报告;它都还能否 等候service manager注册service的返回结果。

Binder driver提供的是桥梁的作用,比如从service注册是service manager,抑或从client到service mangager查询service,以及从client到service的通信,都都还能否 通过Binder driver。

那service manager和Binder driver起的作用是那些呢?

没人 client和service倘若传入句柄0就都都还能否 找到service manager在binder driver中的binder实体对象,自然本来都还能否 binder 引用对象了。

24. service完成此人 的逻辑后,再次通过binder_ioctl通知binder driver,告诉binder driver防止结果,或者再唤醒client程序运行池池。你你这人过程就和service manager通知service是一样的了。

   size_t maxThreads = 15;  

15. client程序运行池池经过一些防止后进入等候情况报告,等候service manager来唤醒。

BpBinder(mHandle)->binder_ref->binder_node->BBinder binder本地对象。

binder_ref关联的binder_node对象,一一好几只 多,找到binder_ref后,就都都还能否 进一步找到binder_node。

}

比如addService的本来,binder driver请求service manager去注册一一好几只 service。

全都 ,binder 机制才通过你你这人通过命令调用的土法子,通知service程序运行池池为指定的binder本地对象增加/减少引用,从而达到维护用户空间service程序运行池池binder本地对象生命周期的目的。

在第七点的表中,亲戚大伙儿 提到了所有的Binder协议命令,其中包括这人BC_INCREFS,BC_ACQUIRE,BC_RELEASE,BC_DECREFS这人的命令,表中解释是维护binder对象的引用计数;那为那些要进行一一好几只 多的设计呢?

  ...

9. service manager在binder driver完成本来,会再次程序运行池池等候情况报告。

binder命令按照命令的流向性分为两大类:

四. binder机制中的数据内部人员

client程序运行池池引用service程序运行池池的一一好几只 binder本地对象正在通信,或者service程序运行池池的binder本地对象不处在了何如么办?

1. 首先这张图一一好几只 多空间,用户空间和内核空间;client, service,service manager运行在用户空间;而binder driver运行在内核空间。

b. Binder引用对象,运行在Binder driver内核空间,对应的数据是binder_ref内部人员体。

通知binder driver BR_INCREFS命令执行完毕,一般由service程序运行池池在防止完binder driver的BR_INCREFS命令后向binder driver发出。

同第2点一样,这块内存也被binder driver内核空间和service程序运行池池用户空间的虚拟地址同時 映射。

通知binder driver减少目标service强引用,参数int表示目标service的handle值.

全都 为了偏离 防止你你这人问题图片,binder或者死亡通知你你这人功能,当binder本地对象消亡本来,都还能否 通知正在监听它的binder_ref client。

2. BR_XXX

binder_transaction用来描述binder driver底下的一一好几只 事务。事务在数据库底下用的比较多,binder driver也借用了你你这人概念。

binder driver把这块内存划成一页一页来管理,那一一好几只 binder_buffer就表示一页。

binder_proc和binder_node是一对多的关系。

红黑树的数据内部人员亲戚大伙儿 有不清楚都都还能否 百度下。

三.Binder通信关系总图

全都 Binder driver提供了一一好几只 桥梁,同時 在通信的过程中记录了一些数据。

2. 火车票和站台票都都都还能否 进入候车室,也本来说实名binder和匿名binder都都都还能否 完成程序运行池池间通信功能,这点并没人 那些区别。

正如第一步底下所描述的女娲造人的故事,女娲都都还能否 造人,或者人也都都还能否 造人。或者把女娲反衬成service manager,没人 第一代人本来实名binder对象,第一代人以及底下的人造的人本来匿名binder对象;

open_driver(){

过程简短描述:

在前面描述过,binder driver会为每个程序运行池池分配一一好几只 不超过4MB的内存,用来传输数据。

}

1. 内存节省,或者移动设备的低配置,全都 都还能否 新的通信机制尽或者的节省资源,binder在跨程序运行池池数据拷贝时只进行一次;

从用户空间流向binder driver的命令被称为BC_XXX,也本来binder command的简称;相应的从binder driver流向用户空间程序运行池池的称为BR_XXX,也本来binder return的简称。如下图:

1. 正常死亡,比如程序运行池池此人 退出

亲戚大伙儿 知道binder机制是一一好几只 多的引用的。

着实,亲戚大伙儿 也都都还能否 思考下,针对于移动设备你你这人低配置的设备(相对于服务器),新的程序运行池池间通信机制都还能否 具备那些新的优点呢?

对应你你这人问题图片,client和binder driver都爱莫有益于,或者它们也无法控制service程序运行池池的生命周期。又回到了第八点阐述的那个问题图片:

六. binder ioctl指令

ps:

binder service对象描述,每个加带到binder driver的service删剪都是对应一一好几只 binder_node,包括service manager也是

1. 倘若把进入候车室你你这人功能反衬成实现binder通信你你这人功能,没人 :

这也是binder驱动的精华,通过你你这人虚拟内存双重映射,减少了binder driver和service manager之间的数据拷贝。

binder driver请求用户空间程序运行池池减少指定binder本地对象的弱引用

android_proj/framework/base/libs/binder/ProcessState.cpp

或者都还能否 说明的是这1一好几只 程序运行池指的是binder driver请求用户空间程序运行池池创建的最大程序运行池数(当程序运行运行池池程序运行池数欠缺以响应binder请求时,binder driver会请求程序运行运行池池分配程序运行池),未必包括用户空间程序运行池池主动注册到binder driver的。

你你这人问题图片就回到文章现在开始的第一些,底下在描述女娲造人关于源头你你这人问题图片上的本来,亲戚大伙儿 说神话故事底下假设女娲是本来处在的,从而弥补了你你这人故事底下的漏洞。

一一好几只 多,整个通信过程就基本现在开始了。

或者是第2种情况报告,操作系统会帮亲戚大伙儿 close,从而也都都还能否 调用binder driver的binder_release函数。

10. service程序运行池池被service manager程序运行池池唤醒本来,会回到service程序运行池池的用户空间,或者把第8步binder driver拷贝service程序运行池池内存的数据读取出来(这块内处在binder driver中,被service程序运行池池和binder driver同時 映射),再完成最后的逻辑。

神话故事很美好,解释了人类的来源,或者你你这人逻辑中着实有个欠缺,本来女娲从哪里来的?

全都 ,通过你你这人层层的关联,都连接起来了。

   result = ioctl(fd, BINDER_SET_MAX_THREADS, &maxThreads);

4. BR_XXX

a. Binder代理对象,运行在client用户空间,对应的类是BpBinder,实现的关键在于它有个句柄mHandle变量,通过你你这人变量都都还能否 在Binder driver内核空间底下找到对应的Binder引用对象。

或者一一好几只 人想进入火车候车室,没人 他都还能否 火车票或者站台票,一一好几只 多们现在来做如下反衬:

那或者binder本地对象意外的挂了呢?比如service所在程序运行池池或者程序运行池池逻辑错误异常退出了,调用它的client何如么办呢?

最后把你你这人属于此人 程序运行池池的Binder引用对象和此人 程序运行池池内的一一好几只 Binder代理对象对应起来;一一好几只 多client就间接的拥有了service Binder本地对象的引用,进而都都还能否 和service通信。

5. 对于检票口,不管是火车票还是站台票删剪都是从检票口通过,全都 检票口都都还能否 记录一些信息;同样,对于binder driver,不管是实名binder还是匿名binder删剪都是通过binder driver,binder driver也会记录它们的信息。

为了更好的说明,先上一张整体Binder的关系图。

client请求binder driver注册目标service组件的死亡通知

ServiceManager

这是亲戚大伙儿 要求使用binder时只能传输大于1MB数据的是因为,比如通过intent传输图片,很有或者会超过binder传输上限。当然你你这人亲戚大伙儿 在底下分析代码的过删剪都是想看 。

通知binder driver此程序运行池池进入BINDER_LOOPER_STATE_REGISTERED情况报告,再经过一些防止就会进入就绪情况报告,都都还能否 防止程序运行池池的事务。

至此,binder设计篇内容删剪提供完毕,下面会写一些binder实现篇的东西,也本来从代码的深度图来分析那些内容。

在Java底下,亲戚大伙儿 知道维护一一好几只 对象的生命周期都都还能否 通过强引用,软引用,弱引用和虚引用来实现(具体的区别亲戚大伙儿 都都还能否 百度,底下一些区别和技巧还是很有用的,不得劲是软引用用来实现图片的缓存),倘若一一好几只 对象被从垃圾回收的根节点强引用所关联,没人 它是不不被回收的。

具体都都还能否 参考./working_directory/kernel/goldfish/driver/staging/android/binder.h

4. service程序运行池池启动后,同样会通过open和mmap土法子通知binder driver为service程序运行池池分配一块不超过4MB的内存,一般程序运行运行池池的是1MB左右(1mb - 8kb)。

在linux系统中对于权限安全性管理,UID是一一好几只 不得劲要的东西,全都 对于安全性,binder就在binder driver底下负责填写调用程序运行池池的UID和PID;相比一些在程序运行运行池池填写UID和PID的程序运行池池间通信机制,安全性得到了极大提高。

或者强制规定sm binder实体对象对应的是句柄值是0。也本来一些程序运行池池来访问service,倘若它传到binder driver的句柄值是0,那就是因为目标service本来service manager。

猜你喜欢

怎么做可以让自己对任何事都无所谓,自己一个人也不会感觉到孤单,

你对这些回答的评价是?展开删剪看书哪些的也行展开删剪下载百度知道APP,抢鲜体验对被委托人的回答认真,有个性的一面。性格稳重敏捷,善于倾听他人的想法,捕捉从中不适当之处展开删剪

2020-01-21

“双创”正当时 钉钉如何赋能中小企业?

风口转向企业市场红利显现进入移动时代后,传统企业的纸质化办公走到了尽头,云计算和SaaS让零成本零门槛获取高速率OA成为可能性。对于钉钉来说,需要做的可是我 将阿里的工作妙招

2020-01-21

有一个人痴心追我,但我只对他有好感,我怎么办?

追问展开完整篇  我来答不得劲推荐不会管跟他讲清楚找个大慨不可能 给他讲明白不会可能 展开完整篇 找一一两个 多喜欢此人 的比找一一两个 多此人 喜欢的要好狠

2020-01-21

SQL Server 2012列存储索引技术

首先让亲戚亲戚朋友来看看列存储索引涉及到的几个关键的概念。列存储索引所涉及到的基本概念MSSQLServer2012上列存储索引的限制列存储索引的形态MSSQLServe

2020-01-21

游客ozi3egwmsnohs的主页

文章:12丨粉丝:61109丨话题:1文章:1丨粉丝:150987丨话题:0文章:150丨粉丝:62736丨话题:0文章:2丨粉丝:61023丨话题:0MaxCompute生态

2020-01-21