chromium系列:多进程Mojo通信

967 阅读3分钟

进程通信

我们可以看下进程间通信的大致情况 image.png

在最新chromium内,进程间的通信是用Mojo来完成的

什么是Mojo

Mojo是运行时库的集合,提供了公共IPC原语\color{#33CC99}{公共IPC原语}的平台无关抽象、消息IDL格式和绑定库\color{#33CC99}{消息IDL格式和绑定库},并为多种目标语言生成代码,以方便消息跨任意进程间和进程内边界传递。

  • 公共IPC:业务无关
  • 原语:最小粒度基础接口
  • 平台无关:可以跨平台
  • 消息IDL格式:允许为目标语言定义强类型的消息格式,弱化了消息传递的概念,做IPC调用时更像函数调用
  • 绑定库:允许为目标语言定义强类型的消息通信机制

image.png Mojo Core有以下部分:

  • MessagePipe:用于消息传递
  • DataPipie:做裸数据传递,裸buffer,通过一块共享内存在进程间传递。可以消息循环
  • SharedBuffers:共享内存
  • Signals&Traps:信号可查看消息在通道两端的状态(可读可写/开启关闭),traps类似监听器,监听状态
  • Invitations:自矩

Mojo System API:提供最原始C的API,不支持强类型数据格式,需要自己对消息进行编码解码,序列化反序列化

System:面向对象封装,还是比较基础的API

Mojo场景属于及简单举例

Message pipe成对的一组端子,每个端子拥有一个队列以存储输入的消息,它们是双向操作的
mojommojo的IDL文件类型,里面定义了消息的强类型定义集合,每个接口对应到一个消息类型定义
Remote在给定的mojom消息接口定义下,其中一个端子被认定为Remote,用于发送由接口定义的消息(也可接收答复)
Receiver在给定的mojom消息接口定义下,其中一个端子被认定为Receiver,用于接收由接口定义的消息(也可发送答复),它必须关联一个具体的mojom接口实现

Mojo实现原理

image.png

  • 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实现

image.png

  • 一个进程内所有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