ipc(InterProcess Communication)类别
1)管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程之间使用。进程的亲缘关系通常是指父子进程关系。
关于半双工和全双工的解释见:https://blog.csdn.net/crazy_koala/article/details/54297000
2)有名管道(FIFO):有名管道也是半双工的通信方式,但是允许在没有亲缘关系的进程之间使用,管道是先进先出的通信方式。
3)信号量(Semaphore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
4)消息队列(MessageQueue):消息队列是有消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
5)信号 ( sinal ) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
Android中的Kill Process采用的signal(信号)机制
6)共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
7)套接字( socket ) :套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。
注:Android OS中的Zygote进程的IPC采用的是Socket(套接字)机制
8)Android binder机制:
Binder多用在system_server进程与上层App层的IPC交互,以及app层间,以及app内部通讯。
9)Android contentprovider:
why?Android为什么用binder
1.性能:复制1次
2.稳定:c/s 模式不容易死锁
3.语言层面,面向对象,linux是c实现的,binder面向对象
如在Android OS中的Zygote进程的IPC采用的是Socket(套接字)机制,Android中的Kill Process采用的signal(信号)机制等等。而Binder更多则用在system_server进程与上层App层的IPC交互。
4.binder场景。几乎覆盖Android进程各个方面。
在Zygote孵化出system_server进程后,在system_server进程中初始化支持整个Android framework的各种各样的Service。
Service从大的方向来划分,分为Java层Framework和Native Framework层(C++)的Service,几乎都是基于BInder IPC机制。
Java framework:作为Server端继承(或间接继承)于Binder类,Client端继承(或间接继承)于BinderProxy类。
例如 :ActivityManagerService(用于控制Activity、Service、进程等) 这个服务作为Server端,间接继承Binder类,而相应的ActivityManager作为Client端,间接继承于BinderProxy类。
还有PackageManagerService、WindowManagerService等等很多系统服务都是采用C/S架构;Native Framework层:c++实现,作为Server端继承(或间接继承)于BBinder类,Client端继承(或间接继承)于BpBinder。
例如MediaPlayService(用于多媒体相关)作为Server端,继承于BBinder类,而相应的MediaPlay作为Client端,间接继承于BpBinder类。
参考:
《Android虚拟机pdf》 7.7.1章节:进程生成流程。
进程和线程区别
答:线程是指进程内的一个执行单元,也是进程内的可调度实体。与进程的区别:
(1)名词解释:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行。
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
(4)系统开销:在创建或撤消进程时,由于线程是隶属于某个进程的,故而系统的开销明显大于创建或撤消线程时的开销。
信号量和信号的区别
1.信号量常作为一种锁机制,一般用于异步操作。
2.型号是同步的,用于通知接收进程某个事件已经发生。
linux处理大批量fd方式:epoll(防止阻塞)
1.epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
2.获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。3.epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外,还提供了边缘触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。
网友评论