进程和线程是开发中极其重要的模块。
除了使用进程、线程来独立完成任务,我们也需要对他们通信的机制进行学习。
操作系统层次看进程
进程的通信方式:
管道
消息队列
共享内存
信号量
Socket
操作系统
操作系统有内核空间、用户进程空间。
所有的用户层的进程都是在用户态,操作系统是位于内核态。
结构
内核态权限高,对于一些接口设备进行管理,用户态也可以通过系统调用(获取权限提升)来访问内核提供的服务。
层次
提升权限的方法,内核空间功能触及核心
系统调用相当于是桥接用户空间和内核空间
进程在操作系统中角色
内核对进程进行管理和调度执行。
进程控制,每个进程都有的头部
组织结构,通过 pid 对进程进行调度执行和控制
资源分配
操作系统内核将一些资源分配给进程,进程又将任务拆分交给线程,不同进程和操作系统空间的关系可以对照不同线程和进程的关系。
需要我们解决 同步 异步 以及进行通信。
管道
通过在内核空间开辟一块共享的缓冲区来进行数据的写入和读取
「一切皆是文件是Linux哲学。」也可以理解管道为一个特殊的文件,通过管道我们可以实现将A进程写入的数据在B进程读取。
理解为特殊的文件,有点类似于复制粘贴的过程。
在Linux中我们获取到文件描述符后就可以打开对应的文件。
文件
消息队列
类似于管道,消息队列是一段发送数据块,另外的进程来接受数据块来进行通信。进行通信时候需要不断IO操作,在不同进程中进行拷贝粘贴。这是很浪费资源的。也是很耗时的。
共享内存
比起消息队列,共享内存的方式,是不同的进程映射到同一块内核中的内存,称之为共享内存。
但是共享内存不会对共享的资源进行访问控制。于是我们有了信号量。
信号量
和线程中的信号量是一个意思,解决的都是对于临界资源的访问控制问题,通过有限的信号量来进行访问控制。
信号量是通过PV操作来控制,P操作就是信号量的请求,V操作是对信号量的释放。
进入正题...
Binder(android中的特色进程通信机制)
原理
Binder在操作系统层面是通过共享内存的方式来进行通信的。具体来说是通过「内存映射」
Binder
理解Binder:操作系统将内存资源分配给独立的进程,每个进程之间的内存空间是独立的不可以相互访问,内核空间可以对进程进行不对称的访问。
Binder中进程都拿出一块内存来交给内核作为共享的内存,然后将这部分共享的内存来连接到进程。这样不同进程间连接到同一块内存。
映射同一块内存后就可以对内存进行一致性的访问,将需要共享的内容对象(Binder对象)放在映射的内存空间中。
常用场景:需要传输的Binder对象在B进程返回,在A端的serviceConnected中获取B的Binder实例,就可以在A端进行调用和通信。
Android中很多的机制都是通过Binder来进行的。
一些Framework层次的服务向client请求进行响应通信都是基于Binder。因为内核和用户应用就是跨进程的。
可传输的Binder对象放在映射的共享内存中,服务端提供客户端使用。
Activity等组件的启动就是在Binder机制和Handler机制的综合运用。
「ActivityThread通过ApplicationThread和AMS进行进程间通讯,AMS以进程间通信的方式完成ActivityThread的请求后会回调ApplicationThread中的Binder方法,然后ApplicationThread会向H发送消息,H收到消息后会将ApplicationThread中的逻辑切换到ActivityThread中去执行,即切换到主线程中去执行,这个过程就是。主线程的消息循环模型」
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/7347/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料