wzc缩写可以起什么名字?

IPC 是 Inter-Process Communication 的缩写,含义为进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程。IPC 并不是 Android 所独有的,任何一个操作系统都需要有相应的 IPC 机制。

也可以实现任意两个终端之间的通信,以及一个设备上的两个进程之间的通信。

1.2 什么情况下需要使用到多进程?

说到 IPC 就必须提到多进程,多进程的情况分为两种:第一种情况是一个应用因为某些原因自身需要采用多进程模式来实现;另一种情况是当前应用需要向其它应用获取数据。

第一种情况的例子有:应用的某些模块由于特殊原因需要运行在单独的进程里,比如把 WebView 模块放在一个单独的进程里;为了加大一个应用可使用的内存,这是因为 Android 对单个应用可使用的最大内存作了限制。

第二种情况的例子有:两个应用通过跨进程的方式去获取所需的数据,通过系统提供的 ContentProvider 去查询数据。

2.1 如何开启多进程模式

下面的写法会输出很多进程的信息,但是会有表头信息:

在命名方式上不同:android:process=":remote": 的含义是指要在当前进程名(remote)前面附加上当前的包名(com.wzc.chapter_2),这是一种简写的方式,完整的进程名为

在进程类型上不同:进程名以 : 开头的进程属于当前应用的私有进程,其它应用的组件不可以和它跑在同一个进程中;而进程名不以 : 开头的进程属于全局进程,其它应用可以通过 ShareUID 方式和它跑在一个进程中。

需要注意的是,两个应用通过 ShareUID 跑在同一个进程中是有要求的,需要这两个应用有相同的 ShareUID 并且签名相同才可以。

2.4 多进程会造成哪些问题以及原因是什么?

Android 会给每个应用或者说每个进程分配一个独立的虚拟机,而不同的虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机上访问同一个类的对象会产生多份副本。因此,所有运行在不同进程的四大组件,只要它们之间需要通过内存来共享数据,都会共享失败。

多进程会造成的问题有:

  • 静态成员和单例模式失效:这是因为多进程下,即便是静态成员和单例,也会有多个副本;
  • 线程同步机制完全失效:这是因为多进程下,不同进程锁的不是一个对象;
  • SharedPreferences 的可靠性下降SharedPreferences 不支持两个进程同时去执行写操作,否则会有一定几率的数据丢失(SharedPreferences 底层是通过读写 xml 文件来实现的,并发写是可能出问题的);
  • Application 会多次创建:这是因为系统在创建新的进程同时会分配新的虚拟机,其实就是启动一个应用的过程,而应用启动会创建新的 Application

需要注意的一点是,在多进程下抛出的异常信息,只能在本进程下查看。

手动指定 serialVersionUIDserialVersionUID 是用来辅助序列化和反序列化过程。它的工作机制是:序列化时会把当前类的 serialVersionUID 写入到文件中(或其他中介),反序列化时会去检测文件中的 serialVersionUID 是否跟当前类的 serialVersionUID 一致,如果一致就说明序列化的类的版本和反序列化的类的版本是一致的,这个时候可以成功反序列化,否则说明当前类和序列化的类相比发生了某些变换,无法正常反序列化。为什么要手动指定 serialVersionUID 呢?如果不手动指定,那么系统会根据类结构生成一个 serialVersionUID,只要类结构发生了变化,就可能得到一个不同的 serialVersionUID。而手动指定后,程序能够最大限度地恢复数据

静态成员变量属于类不属于对象,不会参与序列化过程;

使用transient 关键字修饰的成员变量不参与序列化过程;

重写系统默认的序列化和反序列化过程,通过实现下面的方法:

从一个实际的实现了 Parcelable 接口的类来看:

Parcel 内部包装了可序列化的数据,可以在 Binder 中自由传输。

反序列化功能由 CREATOR 来完成,其内部标明了如何创建反序列化对象(createFromParcel 方法)和数组(newArray 方法),通过一系列 read 方法来完成反序列化过程。

需要说明的是,里说把 Parcel 数据放在持久化存储上是不合适的:

相同点:它们都能实现序列化并且都用于 Intent 间的数据传递。

  • 效率不同:Serializable 开销很大,因为序列化和反序列化过程在 Java 层实现,要大量的 I/O 操作;Parcelable 内存开销小, 在 native 层实现,效率很高,是 Android 推荐的序列化方式。
  • 使用场景不同:Serializable 使用广泛,包括内存序列化,序列化到存储设备以及序列化后通过网络传输;而 Parcelable 主要用于内存序列化,对于序列化到存储设备以及序列化后通过网络传输实现有些复杂。
  • 从 IPC 角度来看,Binder 是 Android 中的一种跨进程通信方式,Binder 还可以理解为一种虚拟的物理设备,它的设备驱动是 /dev/binder,在 Linux 中没有这种通信方式;

  • 从 Android 应用层角度来看,Binder 是客户端和服务端进行通信的媒介,当 bindService 的时候,服务端会返回一个包含了服务端业务调用的 Binder 对象,客户端通过这个 Binder 对象就可以获取服务端提供的服务或者数据。

  • Binder 的唯一标识,一般用当前 Binder 的类名表示。

  • 这是个静态方法,作用是将服务端的 Binder 对象转换成客户端所需的 AIDL 接口类型的对象。需要特别注意的是,这种转换过程是区分进程的,如果客户端和服务端位于同一进程,那么此方法返回的就是服务端的 Stub 对象本身,否则返回的是系统封装后的 Stub.Proxy 对象。

  • 用于返回当前的 Binder 对象,就是在服务端的创建的 Stub 类匿名内部类,会作为 onBind() 方法的返回值返回。

  • 运行在服务端的 Binder 线程池里面,当客户端发起跨进程请求时,远程请求会通过系统底层封装后交由此方法来处理。

    服务端会通过 code 来确定客户端请求的目标方法是什么,接着从 data 里取出目标方法所需的参数,然后执行目标方法。当目标方法执行完毕后,就向 reply 中写入返回值。

    这个方法返回 false,那么客户端的请求会失败,所以可以利用这个特性来做权限验证。

  • 这个方法运行在客户端,是给客户端调用的。内部实现是:1, 先创建该方法远程调用所需要的输入型 Parcel 对象 _data,输出型 Parcel 对象 _reply 和返回值对象 List;2, 然后把方法的参数写入 过程返回后,当前线程继续执行,并从 _reply 中取出 RPC 过程的返回结果;5, 返回从 _reply 中取出的数据。

  • 这个方法运行在客户端,没有返回值,有参数,其余和 getBookList() 方法一致。

3.7 远程方法是耗时方法,客户端和服务端分别如何处理?

客户端:因为客户端发起远程请求时,当前线程会被挂起直至服务端进程返回数据,因此远程方法是耗时方法,客户端就不能在 UI 线程发起远程请求。

服务端:因为服务端的 Binder 方法运行在 Binder 的线程池里,所以 Binder 方法不管是否耗时都应该采用同步的方式实现。

采用分离的方式来写,而不是像系统生成的那样存在多层类嵌套。

手写的好处:方便通过添加日志的方式,来了解哪个方法运行在客户端进程,哪个方法运行在服务端的 Binder 线程池里面;明白了 AIDL 文件的本质是系统为我们提供的一种快速实现 Binder 的工具。

Binder 运行在服务端进程,如果服务端进程因为某种原因异常终止,这时候连接到服务端的 Binder 连接断裂(也叫 Binder 死亡),会导致我们的远程调用失败。

如果客户端不知道 Binder 已经死亡,还去执行相关业务,就会影响客户端的功能。所以,我们希望有一种方法,可以在 Binder 死亡时,通知给客户端,客户端拿到通知后,做一些处理:比如提醒用户重新发起服务绑定,或者自动再次进行服务绑定。这就是设置死亡代理的内容了。

2,在客户端绑定远程服务成功后,给 Binder 设置死亡代理:

4.1 A 进程正在进行一个计算,计算完成后需要启动 B 进程的一个组件并把计算结果传递给 B 进程,但是计算结果不支持放在 Bundle 里面,该如何处理?

既然计算结果不支持放入 Bundle 里面,就无法通过 Intent 来传输。可以考虑通过 Intent 启动 B 进程的一个 Service 组件,让 Service 在后台执行计算,计算完成后再启动 B 进程中真正要启动的那个目标组件。由于 Service运行在 B 进程中,因此目标组件可以直接获取计算结果。这是采用了避免进程间通信的办法。

从本质上来说,SharedPreferences 属于文件的一种,但是系统对它的读/写有一定的缓存策略,也就是说在内存中会有一份 SharedPreferences 文件的缓存,因此在多进程模式下,系统对它的读/写就变得不可靠,当面对高并发的读/写访问时,SharedPreferences有很大几率丢失数据,因此,不建议在进程间通信中使用 SharedPreferences。可以考虑使用 mmkv。

包括客户端向服务端发送消息以及服务端向客户端回传消息的功能:


 
 
 
 
 
 
  • 在同一个进程中时,object 字段非常实用,也就是说任何对象多可以赋值给 object 对象;
  • 在进程间通信时,在 Android 2.2 之前 object 字段不支持跨进程通信,在 2.2 之后,仅仅是系统提供的实现了 Parcelable 接口的对象才能通过它来传输。因此,自定义的 Parcelable 对象无法通过 object 字段传输。解决办法是,通过

4.5 AIDL 文件支持哪些数据类型?

  • List:只支持 ArrayList,并且里面的每个元素都必须能够被 AIDL 支持;
  • AIDL:所有 AIDL 接口本身也可以在 AIDL 文件中使用。

4.6 使用 AIDL 需要注意的地方有哪些?

  1. 当定义 AIDL 文件时,对于文件需要的自定义的 Parcelable 对象和 AIDL 对象必须要显式 import 进来,不管它们是否和定义的 AIDL 文件位于同一个包内。如果要在 AIDL 文件中使用它,就新建一个 Book.aidl 文件:
  2. 对于 AIDL 中方法参数中使用到的数据类型,除了基本数据类型,其他类型必须标上方向:inoutinoutin 表示输入型参数,out 表示输出型参数,inout 表示输入输出型参数。
  3. 当定义 AIDL 文件时,只能声明方法,不能声明静态变量,这一点和传统的接口是不一样的。
  4. 在实际开发中,建议把所有和 AIDL 相关的类和文件全部放在一个包中(对于使用 AndroidStudio 开发,可以放在同一个 module 里面),这样可以方便客户端和服务端依赖使用。
  5. AIDL 文件的包结构在客户端和服务端要保持一致,否则会反序列化失败。
  6. 当需要通过 AIDL 文件中定义的方法设置监听器或取消监听器时,不能使用普通的接口,而要使用 AIDL 接口,这是因为在 AIDL 中不能使用普通接口。
  7. 如果在 AIDL 文件中定义了几个接口,即以 interface 开头的,那么就生成几套对应的 Java 类(包括接口名.java,Stub 类,以及 Proxy 类)。
  8. AIDL 文件中不能使用中文注释,如需注释请使用英文,避免出现 AIDL 生成 java 文件缺失或为空的情况。(参考:)

4.7 当客户端需要监听服务端的一些操作时,会通过注册监听器的方式来实现,那么服务端如何实现解除注册的监听器呢?

如果我们打算在服务端使用普通的 List 来保存注册的监听器对象,而在服务端解除注册时从这个集合里移除注册的监听器,这是不会成功的。但是,在解注册时,传递过来的监听器对象在集合里是不存在的,尽管客户端在注册和解注册时传递的监听器是同一个。这是因为 Binder 会把客户端传递过来的对象重新转化为一个新的对象。记住:对象是不能跨进程直接传输的,对象的跨进程传输本质上都是反序列化的过程。

我们需要使用 RemoteCallbackList,它是系统提供的专门用于管理跨进程监听器。

虽然监听器对象不是同一个了,但是它们底层的 Binder 对象是同一个,这点是非常重要的。

4.8 说一说客户端和服务端进行通信时,一些方法或回调运行的线程

4.9 如何在 AIDL 总使用权限验证功能?

第一种方法,在 onBind 方法中验证,验证不通过就直接返回 null,验证通过才返回 Stub 对象。
第二种方法,在服务端的 onTransact 方法中验证,验证失败就返回 false,这时服务端会终止执行 AIDL 中的方法。

4.10 ContentProvider 设置单独的进程,那么它的方法分别运行在什么线程?

Binder 线程池里。需要注意的是,queryinsertdeleteupdate 四个方法是存在多线程并发访问的,因此这些方法内部要做好线程同步。

    
    

将每个业务模块的 Binder 请求统一转发到远程 Service 中执行,从而避免重复创建 Service 的过程。

接口,可以方便地在不同进程间传输。 Bundle 不支持的类型无法通过 Bundle 来进行跨进程通信
使用方便,A 进程把数据写入文件,B 进程通过读取这个文件来获取数据;对文件格式没有具体要求,只要读/写双方约定好数据格式即可。 文件共享方式只适合在对数据同步要求不高的进程之间进行通信,并且要处理好并发读/写问题。
轻量级的 IPC 方案,它的底层实现是 AIDL 1,通过 Messenger,可以在不同进程中传递 Message对象,因此只要把要传递的数据放在 Message 中就可以轻松实现数据的进程间传递;2,一次只处理一个请求,不会造成服务端并发执行的情形,因此在服务端不用考虑线程同步的问题。 1,传输的数据类型需要是 Bundle 支持的类型,2,Messenger是以串行的方式处理客户端的消息,不适用于有大量并发请求发送到服务端的情形;3,Messenger 只实现了消息的传递,无法做到跨进程调用服务端的方法。
可以做到跨进程调用服务端的方法
使用过程比 AIDL 要简单 在数据源访问方面功能强大,支持一对多并发数据共享,可通过 call 方法扩展其他操作 可以理解为受约束的 AIDL,主要提供数据源的 CRUD 操作。
功能强大,可以通过网络传输字节流,支持一对多并发实时通信 实现细节稍微有点复杂,不支持直接的 RPC.
}

如果你用CSS,则你会有困惑:我该怎么垂直对齐容器中的元素?现在,利用CSS3Transform,可以很优雅的解决这个困惑:

2、伸展一个元素到窗口高度


在具体场景中,你可能想要将一个元素伸展到窗口高度,基本元素的调整只能调整容器的大小,因此要使一个元素伸展到窗口高度,
我们需要伸展顶层元素:htmlbody:

然后将100%应用到任何元素的高

3、基于文件格式使用不同的样式


为了更容易知道链接的目标,有时你想让一些链接看起来和其它的不同。下面的片段在文本链接前添加一个图标,对不同的资源使用不同的图标或图片:

4、创建跨浏览器的图像灰度


灰度有时看起来简约和优雅,能为网站呈现更深层次的色调。在示例中,我们将对一个SVG图像添加灰度过滤:

为了跨浏览器,会用到filter属性:


CSS中最具诱惑的一个功能是能添加动画效果,除了渐变,你可以给背景色、透明度、元素大小添加动画。目前,你不能为渐变添加动画,但下面的代码可能有帮助。它通过改变背景位置,让它看起来有动画效果。

6、CSS:表格列宽自适用


对于表格,当谈到调整列宽时,是比较痛苦的。然后,这里有一个可以使用的技巧:给td元素添加white-space: nowrap;能让文本正确的换行

7、只在一边或两边显示盒子阴影


如果你要一个盒阴影,试试这个技巧,能为任一边添加阴影。为了实现这个,首先定义一个有具体宽高的盒子,然后正确定位:after伪类。实现底边阴影的代码如下


如果你碰到一个比自身容器长的文本,这个技巧对你很有用。在这个示例中,默认时,不管容器的宽度,文本都将水平填充。


简单的CSS代码就能在容器中调整文本:



想要让文本模糊?可以使用color透明和text-shadow实现

10、用CSS动画实现省略号动画


这个片段将帮助你制造一个ellipsis的动画,对于简单的加载状态是很有用的,而不用去使用gif图像。


12、典型的CSS清除浮动


13、新版清除浮动(2011)







 
 
 
 
 
 
 
 
 
 
 

 

 
 

 
 

 
 

 
 

 

23、奇特的CSS引用

 
 

 
 
 
 
 
 
 

 
 

 

26、强制出现垂直滚动条

 
 

 
 

 
 

 
 

 
 

 
 

 
 

 
 

 
 

 

35、三角形列表项目符号

 
 

 

36、固定宽度的居中布局

 
 

 
 

 
 

 
 

 

40、跨浏览器设置最小高度

 
 

 
 

 

42、基于文件类型的链接样式

 
 

 

 
 

 

44、在可点击的项目上强制手型

 
 

 
 

 
 

 
 

 

48、纯CSS背景噪音

 
 

 
 

 

50、CSS悬浮提示文本

 
 

 

51、深灰色的圆形按钮

 
 

 

52、在可打印的网页中显示URLs

 
 

 

53、禁用移动Webkit的选择高亮

 
 

 
 

 
 

 
 

 
 
 
 
 
 

 

58、论文页面的卷曲效果

 
 

 
 

 

60、带CSS3特色的横幅显示

 
 


}

版权声明:本文为CSDN博主「北京小辉」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
———————————————————————————————————

“无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点可以跳转到教程。”。

  1. 谈谈Hadoop 序列化和反序列化及自定义bean 对象实现序列化?
    1) 序列化和反序列化
    序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储(持久化)
    反序列化就是将收到字节序列(或其他数据传输协议)或者是硬盘的持久化数据,转换成内存
    Java 的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外
    的信息(各种校验信息,header,继承体系等),不便于在网络中高效传输。所以,
    hadoop 自己开发了一套序列化机制(Writable),精简、高效。
    2) 自定义bean 对象要想序列化传输步骤及注意事项:
    (2) 反序列化时,需要反射调用空参构造函数,所以必须有空参构造
    (3) 重写序列化方法
    (4) 重写反序列化方法
    (5) 注意反序列化的顺序和序列化的顺序完全一致
    (6) 要想把结果显示在文件中,需要重写toString(),且用”\t”分开,方便后续用

    1. 请描述mapReduce 有几种排序及排序发生的阶段(☆☆☆☆☆)
      MapReduce 根据输入记录的键对数据集排序。保证输出的每个文件内部排序
      如何用Hadoop 产生一个全局排序的文件?最简单的方法是使用一个分区。但该方法在处理大型文件时效率极低, 因为一台机器必须处理所有输出文件, 从而完全丧失了MapReduce 所提供的并行架构。
             替代方案:首先创建一系列排好序的文件;其次,串联这些文件;最后,生成一个全局排序的文件。主要思路是使用一个分区来描述输出的全局排序。例如:可以为待分析文件创建3 个分区,在第一分区中,记录的单词首字母a-g,第二分区记录单词首字母h-n, 第三分区记录单词首字母o-z。
      Mapreduce 框架在记录到达reducer 之前按键对记录排序,但键所对应的值并没有被排序。甚至在不同的执行轮次中,这些值的排序也不固定,因为它们来自不同的map 任务且这些map 任务在不同轮次中完成时间各不相同。一般来说,大多数MapReduce 程序会避免让reduce

    2. Mapreduce 的工作原理,请举例子说明mapreduce 是怎么运行的?(☆☆☆☆☆)

    3.        分布式缓存一个最重要的应用就是在进行join 操作的时候,如果一个表很大,另一个表很小,我们就可以将这个小表进行广播处理,即每个计算节点上都存一份,然后进行map 端的连接操作,经过我的实验验证,这种情况下处理效率大大高于一般的reduce 端join,广播处理就运用到了分布式缓存的技术。

    4. 对于大表中的每一条记录key/value,在hash table 中查找是否有相同的key 的记录,如果有,则连接后输出即可。

    5. 什么样的计算不能用mr 来提速,举5 个例子。
      3) 索引是更好的存取机制的时候。
      5) 只有一台机器的时候。

}

我要回帖

更多关于 wzc是哪个明星的缩写啊 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信