chromium通信系统-ipcz系统(四)-ipcz-分层、和mojo的关系以及handle

在只有mojo的情况下, 进程间通信都是靠unix 域套接字来完成了,由于这种方式比较低效,并且不够灵活,后来引入了ipcz。 但是系统中基本上使用mojo做进程间通信,想要一步到位迁移到ipcz系统是比较困难的。 所以chrome团队采用了一种折中的方法,利用原来mojo的channel进行socket通信,作为控制消息和唤醒机制。 使用ipcz 来实现共享内存和路由机制。另外由于chrome是一个面向多操作系统的任务,对于不同操作系统使用不同的代码实现,这样就要求抽取出操作系统相关的实现。这样使得现有代码非常混乱。另外ipcz系统希望减少耦合,尽量少的暴露实现细节,以及方便序列化,使用handle(句柄)代理不同层的对象。

ipcz主要有四个模块:
1、ipcz上层:third_party/ipcz 目录。 handle 为IpczHandle。 实现Node、NodeLink、RouterLink、Portal、NodeConnector、Router、Parcle 等对象。架空mojo的Node 和Port
2、ipcz driver层:mojo/core/ipcz_driver目录。handle 为 IpczDriverHandle。 实现Transport,ipcz层和mojo层的粘合剂,利用mojo层的通信能力服务ipcz层。序列化传输能力。
3、mojo 层:mojo/core目录。handle 为 MojoHandle。 实现Channel,进程间通信能力。
4、Platform层/mojo/public/cpp/platform目录。 handle 为PlatformHandle。 系统层面的实现,主要是对Socket文件描述的包装。

下面我们具体分析一下每一层handle的实现。

ipcz 层 IpczHandle实现

third_party/ipcz/src/ipcz/api_object.h

class APIObject : public RefCounted {public:enum ObjectType {kNode,kPortal,kBox,kTransport,kParcel,};static APIObject* FromHandle(IpczHandle handle) {return reinterpret_cast<APIObject*>(static_cast<uintptr_t>(handle));}// Takes ownership of an APIObject from an existing `handle`.static Ref<APIObject> TakeFromHandle(IpczHandle handle) {return AdoptRef(reinterpret_cast<APIObject*>(static_cast<uintptr_t>(handle)));}// Returns an IpczHandle which can be used to reference this object. The// reference is not owned by the caller.IpczHandle handle() const { return reinterpret_cast<uintptr_t>(this); }// Releases ownership of a Ref<APIObject> to produce a new IpczHandle which// implicilty owns the released reference.static IpczHandle ReleaseAsHandle(Ref<APIObject> object) {return static_cast<IpczHandle>(reinterpret_cast<uintptr_t>(object.release()));}
......  
}

ipcz层对应的对象基类为APIObject,APIObject 提供四个方法,FromHandle() 和 TakeFromHandle() 方法用于将IpczHandle() 转化为具体对象。handle() 和 ReleaseAsHandle() 方法用于将对象转成IpczHandle句柄。这里我们还可以看到系统里有5种类型的APIObject,分别是:

  • kNode 代表IPCZ Node(节点)对象
  • kPortal 代表ipcz Portal(端口)对象
  • kBox 用于其他可传输的ipcz对象
  • kTransport 代表ipcz Transport(传输点)对象
  • kParcel 代表ipcz Parcel(消息)对象

ipcz driver 层 IpczDriverHandle实现

typedef uintptr_t IpczDriverHandle;

mojo/core/ipcz_driver/object.h

// Common base class for objects managed by Mojo's ipcz driver.
class MOJO_SYSTEM_IMPL_EXPORT ObjectBase: public base::RefCountedThreadSafe<ObjectBase> {public:REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE();enum Type : uint32_t {// An ipcz transport endpoint.kTransport,// A wrapped shared memory region.kSharedBuffer,// An active mapping for a shared memory region. These objects are not// serializable and cannot be transmitted over a Transport.kSharedBufferMapping,// A PlatformHandle which can be transmitted as-is by the platform's Channel// implementation, out-of-band from message data. This is the only type of// driver object which can be emitted by the driver's Serialize(), and it's// the only type accepted by its Transmit(). This type is unused on Windows,// where all platform handles are encoded as inline message data during// serialization.kTransmissiblePlatformHandle,// A PlatformHandle which may or may not be transmissible by the platform's// Channel implementation, but which can at least be transformed into// something transmissible during serialization.kWrappedPlatformHandle,// A DataPipe instance used to emulate Mojo data pipes over ipcz portals.kDataPipe,// A MojoTrap instance used to emulate a Mojo trap. These objects are not// serializable and cannot be transmitted over a Transport.kMojoTrap,// An Invitation instance used to emulate Mojo process invitations. These// objects are not serializable and cannot be transmitted over a Transport.kInvitation,};explicit ObjectBase(Type type);Type type() const { return type_; }IpczDriverHandle handle() const {return reinterpret_cast<IpczDriverHandle>(this);}static ObjectBase* FromHandle(IpczDriverHandle handle) {return reinterpret_cast<ObjectBase*>(handle);}static IpczDriverHandle ReleaseAsHandle(scoped_refptr<ObjectBase> object) {return reinterpret_cast<IpczDriverHandle>(object.release());}static scoped_refptr<ObjectBase> TakeFromHandle(IpczDriverHandle handle) {scoped_refptr<ObjectBase> object(FromHandle(handle));if (object) {// We're inheriting a ref previously owned by `handle`, so drop the extra// ref we just added.object->Release();}return object;}......
// Computes the number of bytes and platform handles required to serialize// this object for transmission through `transmitter`. Returns false if the// object cannot be serialized or transmitted as such.virtual bool GetSerializedDimensions(Transport& transmitter,size_t& num_bytes,size_t& num_handles);// Attempts to serialize this object into `data` and `handles` which are// already sufficiently sized according to GetSerializedDimensions(). Returns// false if serialization fails.virtual bool Serialize(Transport& transmitter,base::span<uint8_t> data,base::span<PlatformHandle> handles);

ipcz driver层对应的对象基类为ObjectBase,ObjectBase 提供的方法包括: type方法返回对象的类型,FromHandle() 和 TakeFromHandle() 方法用于将IpczHandle() 转化为具体对象。handle() 和 ReleaseAsHandle() 方法用于将对象转成IpczHandle句柄。GetSerializedDimensions方法用来序列化过程中返回需要的内存空间和hanlde空间。 Serialize函数用于跨进程序列化传输。

这里我们还可以看到系统里有8种类型的ObjectBase,分别是:

  • kTransport 代表传输点对象
  • kSharedBuffer 代表共享内存(端口)对象
  • kSharedBufferMapping 映射后的共享内存对象
  • kTransmissiblePlatformHandle 可传输的PlatformHandle对象
  • kWrappedPlatformHandle 包装的PlatformHandle对象
  • kDataPipe 数据管道
  • kMojoTrap Trap监听对象
  • kInvitation 链接邀请对象。

Mojo层 MojoHandle实现

typedef uintptr_t MojoHandle;

mojo层名没有对应的对象。可以和ipcz driver handle 和 ipcz handle强转。

Platform层 PlatformHandle实现

class COMPONENT_EXPORT(MOJO_CPP_PLATFORM) PlatformHandle {public:enum class Type {kNone,
#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA)kHandle,
#elif BUILDFLAG(IS_APPLE)kMachSend,kMachReceive,
#endif
#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)kFd,
#endif};private:Type type_ = Type::kNone;#if BUILDFLAG(IS_WIN)base::win::ScopedHandle handle_;
#elif BUILDFLAG(IS_FUCHSIA)zx::handle handle_;
#elif BUILDFLAG(IS_APPLE)base::mac::ScopedMachSendRight mach_send_;base::mac::ScopedMachReceiveRight mach_receive_;
#endif#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)base::ScopedFD fd_;
#endif
};

对于linux系统, type为kFd, fd_变量保存文件描述符。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/197103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GEE:使用拉普拉斯(Laplacian)算子对遥感图像进行卷积操作

作者:CSDN @ _养乐多_ 本文记录了使用拉普拉斯(Laplacian)算子对遥感图像进行卷积操作的代码。并以试验区NDVI图像为例。 研究区真彩色影像、NDVI图像以及Sobel卷积结果如下所示, 文章目录 一、拉普拉斯算子二、完整代码三、代码链接一、拉普拉斯算子 详细介绍参考《遥感…

决策树 算法原理

决策树 算法原理 决策树的原理 决策树: 从训练数据中学习得出一个树状结构的模型 决策树属于判别模型 决策树是一种树状结构&#xff0c;通过做出一系列决策 (选择) 来对数据进行划分&#xff0c;这类似于针对一系列问题进行选择。 决策树的决策过程就是从根节点开始&#…

【halcon】halcon 函数文件 以及 脚本引擎如何调用外部函数文件 下篇

前言 上次在文章《halcon 函数文件 以及 脚本引擎如何调用外部函数文件 上篇》 中讲到如何halcon去封装一个算子。 这篇下篇&#xff0c;承接上篇讲述C#如何使用halcon引擎调用自己封装好算子。 这样的好处很明显&#xff1a; 1 不用修改C#代码&#xff0c;更新脚本就能改变算…

不再只是android,华为自爆Harmony将对标iOS

今年10月&#xff0c;华为官方宣布&#xff0c;鸿蒙OS 4升级设备数量已突破1亿&#xff0c;成为史上升级最快的鸿蒙OS版本。 日前&#xff0c;据数码博主“定焦数码”消息&#xff0c;大厂技术员工做适配&#xff0c;通过线下沟通时&#xff0c;华为反复提到一个问题&#xff…

基于stm32的LCD1602与无线蓝牙温湿度显示

这一篇博客是为了实现温湿度的显示&#xff0c;温湿度传感器将数据穿给单片机&#xff0c;单片机又把数据送给LCD1602和蓝牙&#xff0c;让温度和湿度可以再LCD1602显示屏和手机上显示&#xff0c;它的执行逻辑和C51那里基本一样&#xff0c;就是要修改程序&#xff0c;在程序上…

Windows server——部署DHCP服务(2)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.配置DHCP服务 1.DHCP安装的要求 安装DHCP服务器需要满足如下要求&#…

计算社会学发展

▶1.社会可计算吗 一些观点认为&#xff0c;个体行为与社会活动规律如此复杂&#xff0c;很难运用严谨的科学方法进行逻辑推理或精确的定量计算。社会可以计算吗?2009年2月&#xff0c;以哈佛大学教授大卫拉泽尔(David Lazer)为首的15位来自美国不同学科的教授联名在《科学》…

python pyaudio显示音频波形图

python pyaudio显示音频波形图 代码如下&#xff1a; import numpy as np import matplotlib.pylab as plb import wave# 读取 wav wf wave.open("./output.wav", "rb")# 获取音频相关参数&#xff1a;声道数、量化位数、采样频率、采样帧数 nchannels,…

【2024秋招】2023-10-17 金山云文档服务端二面

1 实习 1.1 讲解一下curd启动器 1.2 数据同步的过程是怎么实现的&#xff0c;同步过程中的数据一致性怎么保证的 答&#xff1a;同步过程中会记录断点&#xff0c;表示每一批同步成功时的位置&#xff0c;如果对端出现问题&#xff0c;则下一次同步会继续从这个断点后开始同…

大于2T磁盘划分并挂接

需要挂接9T多的磁盘做数据磁盘&#xff0c;记录下操作过程 1、使用fdisk -l识别到磁盘 # fdisk -l|grep 9.5 TiB Disk /dev/sdd: 9.5 TiB, 10453950398464 bytes, 20417871872 sectors Disk /dev/sdf: 9.5 TiB, 10453950398464 bytes, 20417871872 sectors Disk /dev/sdh: 9.…

CentOS7下安装Docker与Docker Compose

目录 Docker简介 Docker安装 Docker Compose简介 Docker Compose安装 Docker简介 Docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的Linux或Windows操作系统的机器上&#xff0c;也…

2023全网最新-免杀方法大集结

目录 00. 概述 01. 简介 02. 静态免杀 1. 怎么找特征码 工具查找 手工查找 其他 2. 怎么免杀&#xff1f; 手工修改 非源码 工具免杀&#xff08;盲免杀&#xff09; 03. 行为动态免杀 行为拦截原理 如何进行行为免杀呢&#xff1f; 总结 注意/技巧 00. 概述 …

分享全球顶尖的AIGC文生图资源

1 引言 人工智能正在改变许多行业的格局&#xff0c;而其中改变最直观和影响最大的就是AIGC领域的图像创作。文生图技术作为AIGC的一个重要分支&#xff0c;展现了人工智能在视觉创作领域的巨大潜力。发展至今已经有很多AI文生图平台&#xff0c;这是一次革命性的突破&#xf…

ENVI植被指数阈值法

植被指数阈值法提取纯净像元 首先用ENVI打开无人机遥感影像 1. 假彩色显示 打开数据管理工具&#xff0c;无人机的4波段为红边波段 2. 波段计算 打开band math&#xff0c;输入 float(b1-b2)/(b1b2) 选择对应波段 3. 阈值筛选 阈值按经验值选的0.7&#xff0c;ndvi…

Vue3引入markdown编辑器--Bytemd

字节跳动开源了一款markdown编辑器&#xff0c;bytemd&#xff0c;项目地址&#xff1a;GitHub - bytedance/bytemd: ByteMD v1 repository 安装 npm i bytemd/vue-next 引入方式如下&#xff0c;再main.js中引入样式 import bytemd/dist/index.css 直接封装一个Markdown编…

Windows 10安装FFmpeg详细教程

Windows 10安装FFmpeg详细教程 0. 背景 在搭建之前的项目环境时&#xff0c;需要安装ffmpeg&#xff0c;在此记录下过程 1. 官网下载 点击进入官网&#xff1a;ffmpeg&#xff0c;官网地址&#xff1a;https://ffmpeg.org/download.html 如图所示&#xff0c;点击Windows图标…

[传智杯 #3 练习赛] 单位转换

题目描述 我们知道计算机的大小单位有 B, KB, MB 等&#xff0c;现在请你编写一个计算器进行大小单位换算。 提示&#xff0c;11 GB 210210 MB 220220 KB 230230 B。 输入格式 输入一个字符串&#xff0c;由一个 0 到 1023 之间的整数&#xff0c;一个单位名称&#xff…

2023年抗量子加密的十件大事

量子计算机攻破现有密码算法的那一天被称为“Q-Day”。一些安全专家认为&#xff0c;Q-Day将在未来十年内发生&#xff0c;但考虑到人工智能和量子计算能力的突飞猛进&#xff0c;后量子时代很有可能会提前到来。一些研究人员预测量子计算机可在2030年&#xff08;甚至更早&…

Python中判定列表是否包含某个元素的方法

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python中判定列表是否包含某个元素的方法&#xff0c;全文4000字&#xff0c;阅读大约10分钟。 在Python编程中&#xff0c;判定一个列表是否包含特定元素是一项常见任务。本…

大模型技术的发展与实践

一、大模型的概念 大型语言模型&#xff0c;也称大语言模型、大模型&#xff08;Large Language Model&#xff0c;LLM&#xff1b;Large Language Models&#xff0c;LLMs) 。 大语言模型是一种深度学习模型&#xff0c;特别是属于自然语言处理&#xff08;NLP&#xff09;的…