进程通信
我们可以看下进程间通信的大致情况
在最新chromium内,进程间的通信是用Mojo来完成的
什么是Mojo
Mojo是运行时库的集合,提供了的平台无关抽象、,并为多种目标语言生成代码,以方便消息跨任意进程间和进程内边界传递。
- 公共IPC:业务无关
- 原语:最小粒度基础接口
- 平台无关:可以跨平台
- 消息IDL格式:允许为目标语言定义强类型的消息格式,弱化了消息传递的概念,做IPC调用时更像函数调用
- 绑定库:允许为目标语言定义强类型的消息通信机制
Mojo Core有以下部分:
- MessagePipe:用于消息传递
- DataPipie:做裸数据传递,裸buffer,通过一块共享内存在进程间传递。可以消息循环
- SharedBuffers:共享内存
- Signals&Traps:信号可查看消息在通道两端的状态(可读可写/开启关闭),traps类似监听器,监听状态
- Invitations:自矩
Mojo System API:提供最原始C的API,不支持强类型数据格式,需要自己对消息进行编码解码,序列化反序列化
System:面向对象封装,还是比较基础的API
Mojo场景属于及简单举例
| Message pipe | 成对的一组端子,每个端子拥有一个队列以存储输入的消息,它们是双向操作的 |
| mojom | mojo的IDL文件类型,里面定义了消息的强类型定义集合,每个接口对应到一个消息类型定义 |
| Remote | 在给定的mojom消息接口定义下,其中一个端子被认定为Remote,用于发送由接口定义的消息(也可接收答复) |
| Receiver | 在给定的mojom消息接口定义下,其中一个端子被认定为Receiver,用于接收由接口定义的消息(也可发送答复),它必须关联一个具体的mojom接口实现 |
Mojo实现原理
- Channel:Mojo内部的实现细节,用于包装系统底层的通信通道
- Node:每个进程只有一个Node,它在Mojo中的作用相当于TCP/IP中的IP地址,支持多进程之间互联组成网络,但一个进程只能属于其中一个网络
- Port:每个进程可以有上百万个Port,它在Mojo中的作用相当于TCP/IP中的端口,每个Port都必定会对应一种API接口
- Message Pipe: System API 接口,用于进程间的双向通信,底层通过Channel实现,常用于实现接口调用
- Data Pipe:System API接口,用于进程间单向的数据传递,底层通过Shared Memory实现,支持事件通知,常用于实现生产者消费者模式
- Shared Buffer: System API接口,用于进程间双向数据传递,底层通过Shared Memory实现
- 一个进程内所有MessagePipe共享一条Channel
- 一个实例支持多个调用方,也就是多条MessagePipe
- 每个接口支持绑定多个关联接口,共用一个MessagePipe,从而保证接口调用的顺序
目录
├── core // 核心功能实现
│ ├── doc
│ ├── embedder // mojo运行时加载
│ ├── ports
│ └── test
├── docs
└── public // 对外api及实现
├── c
│ ├── system
├── cpp
│ ├── base
│ ├── bindings // C++强类型绑定API,以支持强类型方式做消息传递
│ ├── platform // 轻量跨平台抽象
│ ├── system
│ ├── test
│ └── test_support
├── interfaces
│ └── bindings
├── java
├── js
├── mojom
│ └── base
├── rust
├── tests
└── tools
├── bindings // IDL翻译器和序列化、反序列化代码生成器
│ └── generators
├── fuzzers
└── mojom