一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

揭秘Apollo 3.5開(kāi)源框架的通信機(jī)制如何運(yùn)作

YB7m_Apollo_Dev ? 來(lái)源:lq ? 2019-04-25 14:27 ? 次閱讀

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

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

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

共享存儲(chǔ)

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

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

消息傳遞系統(tǒng)

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

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

管道通信系統(tǒng)

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

以下,ENJOY

用戶(hù)基于Cyber RT進(jìn)行開(kāi)發(fā)時(shí),會(huì)將自己的模塊抽象為一系列的Component。這些Component既可以加載到同一個(gè)進(jìn)程內(nèi)運(yùn)行,也可以加載到不同進(jìn)程中運(yùn)行。

目前,同主機(jī)不同進(jìn)程的Component間默認(rèn)通過(guò)共享內(nèi)存進(jìn)行通信。相比于其他進(jìn)程間通信方式,共享內(nèi)存具備以下幾個(gè)優(yōu)點(diǎn):

由多個(gè)進(jìn)程共享,適合多進(jìn)程讀/寫(xiě);

通信過(guò)程中無(wú)系統(tǒng)調(diào)用,減少了運(yùn)行態(tài)切換的開(kāi)銷(xiāo);

沒(méi)有用戶(hù)內(nèi)存和內(nèi)核內(nèi)存之間的數(shù)據(jù)拷貝;

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

UNIX系統(tǒng)上IPC的結(jié)構(gòu)圖

communication: 這類(lèi)工具關(guān)注的是進(jìn)程之間的數(shù)據(jù)傳輸;

signal: 信號(hào)既可以用于同步,還可以用于通信(傳遞signal number)。實(shí)時(shí)信號(hào)上還可以綁定數(shù)據(jù)。

synchronization: 這類(lèi)工具關(guān)注的是進(jìn)程之間操作的同步;

當(dāng)然,不同工具的適用場(chǎng)景有所不同。比如pipe只能用于同一臺(tái)機(jī)器上的進(jìn)程間通信,而socket卻可以用于網(wǎng)絡(luò)通信。

對(duì)于communication工具而言,我們可以將其分為兩類(lèi):

data transfer: 這類(lèi)工具一般需要在用戶(hù)空間和內(nèi)核空間之間進(jìn)行兩次數(shù)據(jù)傳輸。以pipe為例,ProcessA在寫(xiě)入數(shù)據(jù)的時(shí)候,需要將數(shù)據(jù)從用戶(hù)空間拷貝至內(nèi)核空間;ProcessB在讀取數(shù)據(jù)時(shí),需要將數(shù)據(jù)從內(nèi)核空間拷貝至用戶(hù)空間。

Process的數(shù)據(jù)傳輸

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

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

Cyber RT進(jìn)程間通信主要有以下三個(gè)步驟:

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

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

消息讀?。航邮辗綇墓蚕韮?nèi)存區(qū)域讀取消息;

下面介紹Cyber RT共享內(nèi)存區(qū)域和通知機(jī)制的設(shè)計(jì)。

Cyber RT中所有消息都有對(duì)應(yīng)的channel來(lái)標(biāo)識(shí),比如感知模塊輸出的障礙物消息的channel為"/apollo/perception/obstacles"。一個(gè)channel可能有多個(gè)writer和多個(gè)reader。為了減少內(nèi)存拷貝,每個(gè)channel只有唯一的一塊共享內(nèi)存區(qū)域(Segment)。該channel的所有writer和reader都通過(guò)這塊區(qū)域進(jìn)行消息傳輸。

Segment在內(nèi)存中的布局如下:

內(nèi)存中Segment的布局

state: 描述了當(dāng)前Segment的狀態(tài),包含已經(jīng)寫(xiě)入的消息數(shù)量等信息;

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

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

Segment對(duì)外的主要接口如下:

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應(yīng)當(dāng)成對(duì)出現(xiàn)。

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

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

另外,Cyber RT還實(shí)現(xiàn)基于UDP組播的通知機(jī)制。目前,默認(rèn)采取UDP組播來(lái)通知。

開(kāi)發(fā)者可以通過(guò)修改cyber/conf/cyber.pb.conf中transport_conf的notifier_type來(lái)更改通知機(jī)制。

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收到的完整過(guò)程如下圖所示:

SHM Transport通信過(guò)程

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

ShmReceiver:消息接收方。

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

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

ShmDispatcher:代替ShmReceiver進(jìn)行共享內(nèi)存監(jiān)聽(tīng)和數(shù)據(jù)讀取。

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

之前消息傳輸過(guò)程中有4次數(shù)據(jù)拷貝:

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;

改進(jìn)后,去除了中間變量string的使用,只保留必要的2次數(shù)據(jù)拷貝。

Cyber RT實(shí)現(xiàn)了一系列高性能的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),如ReadWriteLock, AtomicHashMap等。

在通信相關(guān)的代碼實(shí)現(xiàn)中,大量使用了上述基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),從而進(jìn)一步提升了性能。

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

Cyber RT與Apollo ROS傳輸性能比較

本文首先介紹了常見(jiàn)的IPC工具,然后結(jié)合自動(dòng)駕駛的實(shí)際場(chǎng)景,解釋了使用共享內(nèi)存進(jìn)行進(jìn)程間通信的原因。之后,圍繞通信的過(guò)程,介紹了共享內(nèi)存區(qū)域和通知機(jī)制的設(shè)計(jì)。最后,對(duì)比了Cyber RT和Apollo ROS的進(jìn)程間傳輸性能。

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

    關(guān)注

    0

    文章

    14

    瀏覽量

    7445
  • 開(kāi)源框架
    +關(guān)注

    關(guān)注

    0

    文章

    32

    瀏覽量

    9480
  • Apollo
    +關(guān)注

    關(guān)注

    5

    文章

    345

    瀏覽量

    18655

原文標(biāo)題:技術(shù)文檔丨Cyber RT 進(jìn)程間通信

文章出處:【微信號(hào):Apollo_Developers,微信公眾號(hào):Apollo開(kāi)發(fā)者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

    如何使用核心模塊開(kāi)發(fā)設(shè)備控制功能(iOS APP開(kāi)發(fā))導(dǎo)讀:本次教程我們?cè)?b class='flag-5'>開(kāi)源框架代碼基礎(chǔ)上做一個(gè)控制gokit紅燈開(kāi)的App,Wi-Fi設(shè)備接入機(jī)智云客戶(hù)端調(diào)試工具包括 iOS Demo
    發(fā)表于 11-28 18:14

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

    物聯(lián)網(wǎng)APP開(kāi)源框架教程(二)—— iOS APP開(kāi)發(fā)又稱(chēng):如何使用核心模塊開(kāi)發(fā)設(shè)備控制功能(iOS APP開(kāi)發(fā))導(dǎo)讀:本次教程我們?cè)?b class='flag-5'>開(kāi)源框架代碼基礎(chǔ)上做一個(gè)控制gokit紅燈開(kāi)的Ap
    發(fā)表于 12-07 10:54

    機(jī)智云開(kāi)源框架介紹

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

    機(jī)智云APP開(kāi)源框架介紹

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

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

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

    【HarmonyOS】應(yīng)用開(kāi)發(fā)3-HarmonyOS應(yīng)用程序框架揭秘

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

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

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

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

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

    史上最強(qiáng)版本 Apollo 3.5黑科技

    Apollo 3.5全面解讀,含干貨PPT資料。
    的頭像 發(fā)表于 01-12 08:58 ?5587次閱讀
    史上最強(qiáng)版本 <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版本在技術(shù)框架中對(duì)14個(gè)模塊進(jìn)行了升級(jí),主要分布在硬件、軟件平臺(tái)上。
    的頭像 發(fā)表于 03-01 08:32 ?9290次閱讀

    納米框架Esp32開(kāi)源分享

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

    無(wú)線通信模塊管理框架RIL簡(jiǎn)介

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

    揭秘國(guó)外IP代理背后的技術(shù)原理與運(yùn)作機(jī)制

    國(guó)外IP代理背后的技術(shù)原理與運(yùn)作機(jī)制主要基于代理服務(wù)器和IP地址的轉(zhuǎn)發(fā)機(jī)制。
    的頭像 發(fā)表于 11-23 17:32 ?478次閱讀

    AUTOSAR通信框架的優(yōu)勢(shì) AUTOSAR通信實(shí)例與應(yīng)用場(chǎng)景

    ,以簡(jiǎn)化汽車(chē)電子控制單元(ECU)的開(kāi)發(fā)和生產(chǎn)。AUTOSAR通信框架是該架構(gòu)的核心組成部分之一,它提供了一套標(biāo)準(zhǔn)化的通信機(jī)制,使得不同ECU之間的
    的頭像 發(fā)表于 12-17 14:58 ?777次閱讀