0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

揭秘Apollo 3.5開源框架的通信機制如何運作

YB7m_Apollo_Dev ? 來源:lq ? 2019-04-25 14:27 ? 次閱讀

共享內存是指 (shared memory)在多處理器的計算機系統(tǒng)中,可以被不同中央處理器(CPU)訪問的大容量內存。由于多個CPU需要快速訪問存儲器,這樣就要對存儲器進行緩存(Cache)。

Linux中,每個進程都有屬于自己的進程控制塊(PCB)和地址空間(Addr Space),并且都有一個與之對應的頁表,負責將進程的虛擬地址與物理地址進行映射,通過內存管理單元(MMU)進行管理。兩個不同的虛擬地址通過頁表映射到物理空間的同一區(qū)域,它們所指向的這塊區(qū)域即共享內存。

進程通信是指進程之間的信息交換。PV操作是低級通信方式(P操作和V操作,P表示申請,V表示釋放)。高級通信方式是指以較高的效率傳輸大量數據的通信方式。高級通信方法主要有以下三類:

共享存儲

在通信的進程之間存在一塊可直接訪問的共享空間,通過對這片共享空間進行寫/讀操作實現(xiàn)進程之間的信息交換。

在對共享空間進行寫/讀操作時,需要使用同步互斥工具(如P操作,V操作),對共享空間的寫/讀進行控制。

消息傳遞系統(tǒng)

在消息傳遞系統(tǒng)中,進程間的數據交換是以消息(Message)為單位的。程序員直接利用系統(tǒng)提供的一組通信命令(原語)來實現(xiàn)通信。

操作系統(tǒng)隱藏了通信的實現(xiàn)細節(jié),大大簡化了通信程序編制的復雜性,因而獲得了廣泛的應用。在消息傳遞系統(tǒng)中,源進程可以直接或間接地將消息傳送給目標進程。

管道通信系統(tǒng)

管道通信是消息傳遞的一種特殊方式。所謂“管道”,是指用于連接一個讀進程和一個寫進程以實現(xiàn)它們之間通信的一個共享文件,又名pipe文件。它是讀寫進程的一個特殊文件(外存,數據量大),允許按照先來先服務的方式傳送數據,也能使進程同步執(zhí)行。

以下,ENJOY

用戶基于Cyber RT進行開發(fā)時,會將自己的模塊抽象為一系列的Component。這些Component既可以加載到同一個進程內運行,也可以加載到不同進程中運行。

目前,同主機不同進程的Component間默認通過共享內存進行通信。相比于其他進程間通信方式,共享內存具備以下幾個優(yōu)點:

由多個進程共享,適合多進程讀/寫;

通信過程中無系統(tǒng)調用,減少了運行態(tài)切換的開銷;

沒有用戶內存和內核內存之間的數據拷貝;

UNIX系統(tǒng)上有著各式各樣的IPC工具。根據工具的功能特點,可以將它們分為三類:

UNIX系統(tǒng)上IPC的結構圖

communication: 這類工具關注的是進程之間的數據傳輸;

signal: 信號既可以用于同步,還可以用于通信(傳遞signal number)。實時信號上還可以綁定數據。

synchronization: 這類工具關注的是進程之間操作的同步;

當然,不同工具的適用場景有所不同。比如pipe只能用于同一臺機器上的進程間通信,而socket卻可以用于網絡通信。

對于communication工具而言,我們可以將其分為兩類:

data transfer: 這類工具一般需要在用戶空間和內核空間之間進行兩次數據傳輸。以pipe為例,ProcessA在寫入數據的時候,需要將數據從用戶空間拷貝至內核空間;ProcessB在讀取數據時,需要將數據從內核空間拷貝至用戶空間。

Process的數據傳輸

shared memory: 共享內存允許進程通過將數據放到進程間共享的一塊內存中來完成信息交換。在通信過程中,一方面不需要系統(tǒng)調用,另一方面也沒有用戶空間和內核空間之間的數據傳輸。因此共享內存通信速度比其他data transfer工具要快。

自動駕駛系統(tǒng)中,一些傳感器的消息較大,例如點云,圖像等。另外,錄制全量數據時,消息總的頻率高(2000Hz~3000Hz),傳輸量大(約7GBytes/s)。因此,Cyber RT采取共享內存來進行進程間通信。

Cyber RT進程間通信主要有以下三個步驟:

消息寫入:發(fā)送方將消息寫入共享內存區(qū)域;

同步:發(fā)送方通知接收方有新消息可讀;

消息讀?。航邮辗綇墓蚕韮却鎱^(qū)域讀取消息;

下面介紹Cyber RT共享內存區(qū)域和通知機制的設計。

Cyber RT中所有消息都有對應的channel來標識,比如感知模塊輸出的障礙物消息的channel為"/apollo/perception/obstacles"。一個channel可能有多個writer和多個reader。為了減少內存拷貝,每個channel只有唯一的一塊共享內存區(qū)域(Segment)。該channel的所有writer和reader都通過這塊區(qū)域進行消息傳輸。

Segment在內存中的布局如下:

內存中Segment的布局

state: 描述了當前Segment的狀態(tài),包含已經寫入的消息數量等信息;

block: 用于標記block buffer的讀寫狀態(tài)。block的數量是由該Segment傳輸消息的大小決定的。比如消息小于16KBytes時,block數量為512。

block buffer: 用于存放序列化后的消息,數量與block一致。

Segment對外的主要接口如下:

1//structWritableBlock{ 2//uint32_tindex=0; 3//Block*block=nullptr; 4//uint8_t*buf=nullptr; 5//}; 6//usingReadableBlock=WritableBlock; 7 8classSegment{ 9public:10...11boolAcquireBlockToWrite(std::size_tmsg_size,WritableBlock*writable_block);12voidReleaseWrittenBlock(constWritableBlock&writable_block);1314boolAcquireBlockToRead(ReadableBlock*readable_block);15voidReleaseReadBlock(constReadableBlock&readable_block);16...17};

Acquire與Release應當成對出現(xiàn)。

發(fā)送方將消息寫入到共享內存區(qū)域后,需要通知接收方有新消息可讀。為了減少線程使用,Cyber RT采取了單線程監(jiān)聽。有一個專門的Dispatcher來執(zhí)行監(jiān)聽操作,同一進程內的所有接收者都委托這個Dispatcher來進行監(jiān)聽。

在具體實現(xiàn)上,經典的做法是采用mutex+condition_variable。當沒有新消息可讀時,Dispatcher在condition_variable上執(zhí)行wait操作。發(fā)送方寫入消息后,執(zhí)行notify操作。然而,實際測試發(fā)現(xiàn)notify有一定的抖動。因此,最終還是采取了輪詢的方式實現(xiàn)。

另外,Cyber RT還實現(xiàn)基于UDP組播的通知機制。目前,默認采取UDP組播來通知。

開發(fā)者可以通過修改cyber/conf/cyber.pb.conf中transport_conf的notifier_type來更改通知機制。

1transport_conf{ 2shm_conf{ 3#"multicast""condition" 4notifier_type:"multicast" 5shm_locator{ 6ip:"239.255.0.100" 7port:8888 8} 9}10participant_attr{11lease_duration:1212announcement_period:313domain_id_gain:20014port_base:1000015}16communication_mode{17same_proc:INTRA18diff_proc:SHM19diff_host:RTPS20}21resource_limit{22max_history_depth:100023}24}

消息從ShmTransmitter發(fā)出,到ShmReceiver收到的完整過程如下圖所示:

SHM Transport通信過程

ShmTransmitter:消息發(fā)送方。

ShmReceiver:消息接收方。

Segment:共享內存區(qū)域的抽象,內部包含一個循環(huán)隊列(一系列blocks),每個block均可進行讀寫操作。

Notifier:用于發(fā)送/監(jiān)聽共享內存可讀通知。

ShmDispatcher:代替ShmReceiver進行共享內存監(jiān)聽和數據讀取。

Cyber RT與Apollo ROS的進程間通信都是使用的共享內存。相比于Apollo ROS,Cyber RT主要做了以下兩個方面的改進。

之前消息傳輸過程中有4次數據拷貝:

serialize message to a string;

copy data of string to shared memory area;

copy data of shared memory area to a string;

deserialize message from string;

改進后,去除了中間變量string的使用,只保留必要的2次數據拷貝。

Cyber RT實現(xiàn)了一系列高性能的基礎數據結構,如ReadWriteLock, AtomicHashMap等。

在通信相關的代碼實現(xiàn)中,大量使用了上述基礎數據結構,從而進一步提升了性能。

對比發(fā)現(xiàn),Cyber RT進程間傳輸性能優(yōu)于Apollo ROS。

Cyber RT與Apollo ROS傳輸性能比較

本文首先介紹了常見的IPC工具,然后結合自動駕駛的實際場景,解釋了使用共享內存進行進程間通信的原因。之后,圍繞通信的過程,介紹了共享內存區(qū)域和通知機制的設計。最后,對比了Cyber RT和Apollo ROS的進程間傳輸性能。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 通信機制
    +關注

    關注

    0

    文章

    13

    瀏覽量

    7382
  • 開源框架
    +關注

    關注

    0

    文章

    32

    瀏覽量

    9407
  • Apollo
    +關注

    關注

    5

    文章

    340

    瀏覽量

    18378

原文標題:技術文檔丨Cyber RT 進程間通信

文章出處:【微信號:Apollo_Developers,微信公眾號:Apollo開發(fā)者社區(qū)】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    [資料分享]+Android框架揭秘

    `[資料分享]+Android框架揭秘一、看威武霸氣的封面作者:(韓)金泰延等 二、讀讀簡介,看看適合你嗎? 《android框架揭秘》通過對android系統(tǒng)源代碼的分析,主要介紹
    發(fā)表于 09-26 09:47

    開源框架教程(二)—— iOS APP開發(fā)

    如何使用核心模塊開發(fā)設備控制功能(iOS APP開發(fā))導讀:本次教程我們在開源框架代碼基礎上做一個控制gokit紅燈開的App,Wi-Fi設備接入機智云客戶端調試工具包括 iOS Demo
    發(fā)表于 11-28 18:14

    物聯(lián)網APP開源框架教程(二)—— iOS APP開發(fā)

    物聯(lián)網APP開源框架教程(二)—— iOS APP開發(fā)又稱:如何使用核心模塊開發(fā)設備控制功能(iOS APP開發(fā))導讀:本次教程我們在開源框架代碼基礎上做一個控制gokit紅燈開的Ap
    發(fā)表于 12-07 10:54

    機智云開源框架介紹

    機智云物聯(lián)網開源框架App工程(Eclipse工程)https://git.oschina.net/dantang/GizOpenSource_AppKit_Android 介紹:機智云開源
    發(fā)表于 12-27 15:47

    機智云APP開源框架介紹

    機智云物聯(lián)網開源框架App工程(Eclipse工程)介紹:機智云開源框架(GizOpenSource_AppKit_Android) 是開源
    發(fā)表于 02-15 17:56

    [Android框架揭秘].金泰延等.掃描版

    本帖最后由 lee_st 于 2018-2-11 23:28 編輯 [Android框架揭秘].金泰延等.掃描版
    發(fā)表于 02-11 23:14

    【HarmonyOS】應用開發(fā)3-HarmonyOS應用程序框架揭秘

    的全場景世界,不愧是HarmonyOS!小編為大家截取了部分HarmonyOS應用開發(fā)- HarmonyOS程序應用框架揭秘的資料,先來一見為快吧!看到這里你是否還意猶未盡呢!更多干貨內容請點擊左下角附件下載,
    發(fā)表于 10-27 09:44

    MQTT通信開源項目的系統(tǒng)構成框架

    基于STM32和阿里云物聯(lián)網平臺的MQTT通信開源項目有哪些使用注意事項?
    發(fā)表于 10-09 09:35

    Apollo Heritage版音頻接口附帶的插件

     Universal Audio在去年推出的Apollo Heritage版音頻接口提供了5個或10個獲獎的UAD插件,包括Teletronix?、Fairchild?、Pultec?、Helios
    發(fā)表于 01-24 08:59

    共建、共享開源EDA核心共性技術框架|2023開放原子全球開源峰會開源EDA分論壇成功舉辦

    。 ** openDACS工委會聯(lián)合主任&執(zhí)行總監(jiān)何均宏** 何均宏圍繞“開源機制探索——產學研聯(lián)合規(guī)劃共性技術框架”作引導發(fā)言。他指出,半導體產業(yè)史上,有成功的產學研合作與競爭案例,日本
    發(fā)表于 06-16 13:45

    百度全球首發(fā)的Apollo3.5將在美國貨車上率先試用

    解決方案Apollo Enterprise正式問世;百度Apollo3.5發(fā)布,可支持復雜城市道路自動駕駛,并發(fā)布了全球首個面向自動駕駛的高性能 ... 日前,百度在拉斯維加斯舉行的2019CES(消費電子展)上
    發(fā)表于 01-12 07:26 ?486次閱讀

    史上最強版本 Apollo 3.5黑科技

    Apollo 3.5全面解讀,含干貨PPT資料。
    的頭像 發(fā)表于 01-12 08:58 ?5347次閱讀
    史上最強版本 <b class='flag-5'>Apollo</b> <b class='flag-5'>3.5</b>黑科技

    Apollo 3.5發(fā)布,版本更新一覽(附下載鏈接)

    今年1月,Apollo 3.5在CES 2019上發(fā)布。全新的3.5版本在技術框架中對14個模塊進行了升級,主要分布在硬件、軟件平臺上。
    的頭像 發(fā)表于 03-01 08:32 ?9036次閱讀

    納米框架Esp32開源分享

    電子發(fā)燒友網站提供《納米框架Esp32開源分享.zip》資料免費下載
    發(fā)表于 11-08 14:36 ?1次下載
    納米<b class='flag-5'>框架</b>Esp32<b class='flag-5'>開源</b>分享

    無線通信模塊管理框架RIL簡介

    大家好,今天分享一個開源框架 RIL(Radio Interface Layer),嵌入式平臺的無線通信模塊管理框架。
    的頭像 發(fā)表于 12-21 09:24 ?1880次閱讀
    無線<b class='flag-5'>通信</b>模塊管理<b class='flag-5'>框架</b>RIL簡介