【FastDDS】Layer Transport ( 05-Shared Memory Transport)

6.4 共享內存傳輸

共享內存(SHM)傳輸依靠主機操作系統提供的共享內存機制,實現了在同一處理單元/機器上運行的實體之間的快速通信。

注意
Fast DDS 利用域參與者(DomainParticipant)的 GuidPrefix_t 來識別在同一主機上運行的對等方。GuidPrefix_t 的前 4 個字節相同的兩個參與者被視為在同一主機上運行。提供了 is_on_same_host_as() API 來檢查此條件。此外,還請考慮進程內傳輸的 GUID 前綴注意事項中包含的警告。

共享內存傳輸比 UDP / TCP 等其他網絡傳輸提供更好的性能,即使這些傳輸使用環回接口也是如此。這主要是由于以下原因:

  • 大型消息支持:網絡協議需要對數據進行分片,以符合特定協議和網絡棧的要求,從而增加了通信開銷。共享內存傳輸允許復制完整消息,其唯一的大小限制是機器的內存容量。
  • 減少內存復制次數:當向不同的端點發送相同的消息時,共享內存傳輸可以直接與所有目標端點共享相同的內存緩沖區。其他協議需要為每個端點執行一次消息復制。
  • 更少的操作系統開銷:初始設置完成后,共享內存傳輸所需的系統調用比其他協議少得多。因此,使用共享內存可以提高性能/減少時間消耗。

6.4.1 概念定義

本節描述基本概念,以幫助解釋共享內存傳輸如何將數據消息傳遞到適當的域參與者。其目的不是成為實現的詳盡參考,而是對每個概念進行全面解釋,以便用戶可以根據自己的需求配置傳輸。

本節中的許多描述將按照下圖所示的示例用例進行,其中參與者 1 向參與者 2 發送數據消息。請在理解定義時參考該圖。
在這里插入圖片描述

共享內存傳輸的序列圖

6.4.1.1 段(Segment)

段是可以從不同進程訪問的一塊共享內存。每個配置了共享內存傳輸的域參與者都會創建一個共享內存段。域參與者將需要傳遞給其他域參與者的任何數據寫入此段,遠程域參與者能夠使用共享內存機制直接讀取這些數據。

注意
使用具有更高權限的用戶(例如 root)啟動任何進程都可能導致通信問題,因為非特權用戶運行的進程可能無法寫入內存段。

每個段都有一個 segmentId,這是一個 16 字符的 UUID,用于唯一標識每個共享內存段。這些 segmentId 用于識別和訪問每個域參與者的段。

6.4.1.2 段緩沖區(Segment Buffer)

在共享內存段中分配的緩沖區。它充當放置在段中的 DDS 消息的容器。換句話說,域參與者在段上寫入的每條消息都將放在不同的緩沖區中。

6.4.1.3 緩沖區描述符(Buffer Descriptor)

它充當指向特定段中特定段緩沖區的指針。它包含 segmentId 和段緩沖區相對于段基址的偏移量。在與其他域參與者通信消息時,共享內存傳輸僅分發緩沖區描述符,避免了消息從一個域參與者復制到另一個域參與者。通過此描述符,接收域參與者可以訪問寫入緩沖區中的消息,因為它唯一地標識了段(通過 segmentId)和段緩沖區(通過其偏移量)。

6.4.1.4 端口(Port)

表示用于通信緩沖區描述符的通道。它在共享內存中實現為環形緩沖區,因此任何域參與者都可以潛在地在其上讀取或寫入信息。每個端口都有一個唯一的標識符,一個 32 位數字,可用于引用該端口。每個配置了共享內存傳輸的域參與者都會創建一個端口來接收緩沖區描述符。此端口的標識符在發現期間共享,以便遠程對等方知道要與每個域參與者通信時使用哪個端口。

域參與者為其接收端口創建一個偵聽器,以便在新的緩沖區描述符被推送到該端口時得到通知。

6.4.1.5 端口健康檢查(Port Health Check)

每次域參與者打開一個端口(用于讀取或寫入)時,都會執行健康檢查以評估其正確性。原因是如果涉及的某個進程在使用端口時崩潰,該端口可能會變得無法使用。如果附加的偵聽器在給定的超時時間內沒有響應,則該端口被視為已損壞,并將其銷毀后重新創建。

6.4.2 SharedMemTransportDescriptor

除了在 TransportDescriptorInterface 中定義的數據成員外,共享內存的傳輸描述符還定義了以下成員:

成員數據類型默認值訪問器 / 修改器描述
segment_size_uint32_t512*1024segment_size()共享內存段的大小(以字節為單位)。
port_queue_capacity_uint32_t512port_queue_capacity()監聽端口的大小(以消息數為單位)。
healthy_check_timeout_ms_uint32_t1000healthy_check_timeout_ms()端口健康檢查的超時時間(以毫秒為單位)。
rtps_dump_file_string""rtps_dump_file()協議轉儲文件的完整路徑。
default_reception_threadsThreadSettingsdefault_reception_threads接收線程的默認 ThreadSettings。
reception_threadsstd::map<uint32_t,ThreadSettings>reception_threads特定端口上接收線程的 ThreadSettings。
dump_thread()ThreadSettingsdump_thread()共享內存轉儲線程的 ThreadSettings。

如果 rtps_dump_file_ 不為空,則域參與者上的所有共享內存流量(發送和接收的)都會被跟蹤到一個文件中。輸出文件格式是 tcpdump 十六進制文本,可以使用 Wireshark 等協議分析器應用程序進行處理。具體來說,要使用 Wireshark 打開該文件,請使用“從十六進制轉儲導入”選項,并使用“原始 IPv4”封裝類型。

注意
SharedMemTransportDescriptorkind 值由 LOCATOR_KIND_SHM 給出。

警告
segment_size() 設置為接近或小于數據大小會帶來很高的數據丟失風險,因為在單次發送操作期間,寫入操作會覆蓋緩沖區。

6.4.3 啟用共享內存傳輸

Fast DDS 默認啟用共享內存傳輸。不過,應用程序可以根據需要啟用其他共享內存傳輸。要在域參與者中啟用新的共享內存傳輸,首先創建一個 SharedMemTransportDescriptor 的實例,并將其添加到域參與者的用戶傳輸列表中。

下面的示例展示了在 C++ 代碼和 XML 文件中的實現過程。

C++

DomainParticipantQos qos;// 創建新傳輸的描述符。
std::shared_ptr<SharedMemTransportDescriptor> shm_transport =std::make_shared<SharedMemTransportDescriptor>();// [可選] 線程設置配置
shm_transport->default_reception_threads(eprosima::fastdds::rtps::ThreadSettings{-1, 0, 0, -1});
shm_transport->set_thread_config_for_port(12345, eprosima::fastdds::rtps::ThreadSettings{-1, 0, 0, -1});
shm_transport->dump_thread(eprosima::fastdds::rtps::ThreadSettings{-1, 0, 0, -1});// 將傳輸層鏈接到參與者。
qos.transport().user_transports.push_back(shm_transport);

XML

<?xml version="1.0" encoding="UTF-8" ?>
<dds><profiles xmlns="http://www.eprosima.com"><transport_descriptors><!-- 創建新傳輸的描述符 --><transport_descriptor><transport_id>shm_transport</transport_id><type>SHM</type><default_reception_threads> <!-- 可選 --><scheduling_policy>-1</scheduling_policy><priority>0</priority><affinity>0</affinity><stack_size>-1</stack_size></default_reception_threads><reception_threads> <!-- 可選 --><reception_thread port="12345"><scheduling_policy>-1</scheduling_policy><priority>0</priority><affinity>0</affinity><stack_size>-1</stack_size></reception_thread></reception_threads><dump_thread> <!-- 可選 --><scheduling_policy>-1</scheduling_policy><priority>0</priority><affinity>0</affinity><stack_size>-1</stack_size></dump_thread></transport_descriptor></transport_descriptors><participant profile_name="SHMParticipant"><rtps><!-- 將傳輸層鏈接到參與者 --><userTransports><transport_id>shm_transport</transport_id></userTransports></rtps></participant></profiles>
</dds>

注意
如果啟用了多種傳輸,發現流量始終使用 UDP/TCP 傳輸,即使在同一臺機器上運行的兩個參與者都啟用了共享內存傳輸也是如此。如果一個或多個參與者僅啟用了共享內存,而其他參與者同時使用其他傳輸,則可能導致發現問題。此外,當同一臺機器上的兩個參與者啟用了共享內存傳輸時,它們之間的用戶數據通信會自動僅通過共享內存傳輸執行。這些兩個參與者之間不會使用其余已啟用的傳輸。

提示
要通過共享內存配置發現流量,必須禁用默認的內置傳輸。這樣,通信就完全使用共享內存執行。下面的代碼片段示例展示了在 C++ 代碼和 XML 文件中的實現過程。完整示例請參見傳輸機制示例。

C++

DomainParticipantQos qos;// 創建新傳輸的描述符。
std::shared_ptr<SharedMemTransportDescriptor> shm_transport =std::make_shared<SharedMemTransportDescriptor>();// 將傳輸層鏈接到參與者。
qos.transport().user_transports.push_back(shm_transport);// 顯式配置共享內存傳輸
qos.transport().use_builtin_transports = false;

XML

<?xml version="1.0" encoding="UTF-8" ?>
<profiles xmlns="http://www.eprosima.com"><transport_descriptors><!-- 創建新傳輸的描述符 --><transport_descriptor><transport_id>shm_transport_only</transport_id><type>SHM</type></transport_descriptor></transport_descriptors><participant profile_name="DisableBuiltinTransportsParticipant"><rtps><!-- 將傳輸層鏈接到參與者 --><userTransports><transport_id>shm_transport_only</transport_id></userTransports><useBuiltinTransports>false</useBuiltinTransports></rtps></participant>
</profiles>

6.4.4 傳輸機制示例

在 delivery_mechanisms 文件夾中可以找到一個適用于受支持傳輸機制的“hello world”示例。它展示了通過所需傳輸機制(可以僅設置為共享內存)進行通信的發布者和訂閱者。

本頁內容
6.4.1. 概念定義
6.4.1.1. 段
6.4.1.2. 段緩沖區
6.4.1.3. 緩沖區描述符
6.4.1.4. 端口
6.4.2. SharedMemTransportDescriptor
6.4.3. 啟用共享內存傳輸
6.4.4. 傳輸機制示例

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95920.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95920.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95920.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

記 2025/9/6

人工智能常見的模型按照處理問題分為6大類&#xff1a;處理權重問題的權重模型、處理狀態問題的狀態模型、處理序列問題的問題模型、處理表示問題的表示模型、處理相似度的相似模型、處理分類問題的分類模型。權重是計算特定狀態下事物的重要性。狀態問題是刻畫權重動態變化的過…

開啟Python之路,第一節學習大綱-從入門到進階

前端開啟Python之路&#xff0c;前端有沒有必要卷后端技術&#xff0c;歡迎各位大神批評指正 第一階段&#xff1a;基礎入門 (打好根基) 目標&#xff1a; 理解編程基本概念&#xff0c;掌握 Python 核心語法&#xff0c;能編寫簡單的腳本程序。 1、環境搭建與開發工具 安裝 Py…

webshell及冰蝎雙擊無法打開?

什么是webshell&#xff1f; web:萬維網 shell&#xff1a;是指一種應用程序&#xff0c;為用戶和系統之間建立連接&#xff0c;通過這個界面訪問操作系統內核的服務 webshell:是以asp、aspx、php、jsp或者cgi等網頁文件形式存在的一種命令執行環境&#xff0c;也可以將其稱做…

【星閃】Hi2821 | PWM脈寬調制模塊 + 呼吸燈例程

1. 簡介PWM&#xff08;Pulse Width Modulation&#xff09;&#xff0c;全稱脈寬調制&#xff0c;通過對一系列脈沖的寬度進行調制&#xff0c;等效出所需波形。即對模擬信號電平進行數字編碼&#xff0c;通過調節頻率、占空比的變化來調節信號的變化。一個 PWM 周期內由一段高…

51單片機---硬件學習(電子琴、主從應答模式、modbus模型、DS18B20傳感器顯示溫度)

一、串行通信與并行通信1、串行通信定義&#xff1a;數據一位一位地按順序通過單條傳輸線進行傳輸的通信方式。優點&#xff1a;傳輸線少&#xff0c;成本低&#xff0c;適合長距離傳輸缺點&#xff1a;傳輸速度相對較慢2、并行通信定義&#xff1a;數據的各位同時通過多條并行…

SpringBoot后端開發常用工具詳細介紹——SpringSecurity認證用戶保證安全

簡單的開始 創建SpringBoot項目 首先創建一個簡單的springboot項目&#xff0c;假設端口為8888&#xff0c;添加controller控制層&#xff0c;并在其中添加TestController控制類&#xff0c;那么啟動springboot項目之后&#xff0c;訪localhost:8888/api/message頁面會顯示my…

別再手工縫合API了!開源LLMOps神器LMForge,讓你像搭積木一樣玩轉AI智能體!

你是否受夠了這些&#xff1f; 剛調通OpenAI的API&#xff0c;老板說“咱們試試國產模型降本增效”&#xff0c;你看著滿屏的if-else只想說“我暈”。想給AI加上“查天氣”、“執行代碼”的能力&#xff0c;卻發現Function Calling的代碼復雜得讓人頭皮發麻。本地的Agentdemo驚…

window使用ffmep工具,加自定義腳本執行視頻轉碼成h264(運營人員使用)

技術文章大綱&#xff1a;ffmep配合腳本使用1. 需要提供腳本給視頻轉碼的給運營,給運營上傳視頻使用安裝ffmep windows版本(目前我使用的就是windows)將腳本里面的執行路徑修改成自己的電腦安裝ffmep/bin/ffmep.exe路徑處理好之后就點擊執行2.環境準備ffmep windows版解壓到一個…

Leetcode 240. 搜索二維矩陣 II 矩陣 / 二分

原題鏈接&#xff1a; Leetcode 240. 搜索二維矩陣 II 解法一&#xff1a;排除法 參考 【圖解】排除法&#xff0c;一圖秒懂&#xff01;&#xff08;Python/Java/C/C/Go/JS/Rust&#xff09; 從右上角&#xff1a; class Solution { public:bool searchMatrix(vector<vec…

OCR 證件識別:驅動澳門酒店自助入住智能化

澳門酒店作為國際旅游窗口&#xff0c;每日接待持多元證件的旅客&#xff0c;OCR 證件識別技術的應用&#xff0c;讓自助入住終端實現 “一證通辦”&#xff0c;大幅提升服務效率。?旅客在自助終端辦理入住時&#xff0c;只需將護照、港澳通行證、回鄉證、電子身份證等證件貼近…

深入解析匯編語言的奧秘

匯編語言簡介匯編語言&#xff08;Assembly Language&#xff09;是一種低級編程語言&#xff0c;直接對應計算機的機器指令集。它通過助記符&#xff08;如 MOV、ADD&#xff09;代替二進制操作碼&#xff0c;更接近硬件架構&#xff0c;常用于性能優化、嵌入式開發或逆向工程…

Nextcloud 實戰:打造屬于你的私有云與在線協作平臺

隨著數據安全與隱私保護意識的提升&#xff0c;越來越多的個人和組織選擇自建云平臺來替代公有云。Nextcloud 作為一款開源的文件同步與協作套件&#xff0c;不僅能實現類似網盤的文件存儲與分享&#xff0c;還提供日歷、聯系人、即時通訊、在線文檔編輯等協作功能&#xff0c;…

實踐指南:利用衡石AI Data Agent實現自然語言驅動的指標開發與歸因

在數字化轉型的深水區&#xff0c;企業數據團隊常面臨兩難困境&#xff1a;業務部門需要敏捷響應的指標分析&#xff0c;但傳統BI工具依賴技術團隊編寫SQL&#xff0c;導致需求交付周期長達數周&#xff1b;而直接暴露底層數據又存在安全與合規風險。衡石科技推出的AI Data Age…

知微集:Python中的線程(三)

歡迎來到"一起學點什么吧"的合集「NLP知微集」。在這里&#xff0c;我們不愿宏大敘事&#xff0c;只聚焦于自然語言處理領域中那些細微卻關鍵的“齒輪”與“螺絲釘”。我相信&#xff0c;真正深刻的理解&#xff0c;源于對細節的洞察。本期&#xff0c;我將為您拆解的…

動態規劃入門:從記憶化搜索到動態規劃

在開始對動態規劃的講解之前&#xff0c;我們需要先對記憶化搜索進行回顧&#xff1a; 什么是記憶化搜索&#xff1f; 在搜索過程中&#xff0c;當搜索樹中存在大量重復的節點時&#xff0c;我們可以通過引入一個"備忘錄"&#xff08;通常是一個數組或哈希表&#…

Boost搜索引擎 網絡庫與前端(4)

文章目錄前言一、引入網絡庫模塊引入cpp-httplibcpp-httplib測試正式編寫http_server二、前端模塊三、項目的可能拓展總結前言 終于到了最后一篇嘍&#xff0c;嘻嘻&#xff01; 一、引入網絡庫模塊 引入cpp-httplib 下載地址如下&#xff0c;我個人不喜歡新版本 ??cpp-http…

Flink反壓問題

背景在使用flink的過程中&#xff0c;多次遇到過反壓&#xff08;backpressure&#xff09;的問題&#xff0c;這通常是因為數據處理的速率超過了數據源或下游系統的處理能力導致。反壓的底層剖析網絡流控一個重要的概念是網絡流控&#xff0c;如上圖&#xff0c;不同的Consume…

Day5-中間件與請求處理

昨天搞定了異步優化&#xff0c;今天來解決一些實際問題。Day4的API雖然性能不錯&#xff0c;但還缺少一些企業級應用必備的功能。 現在的問題 前端無法訪問API&#xff08;跨域問題&#xff09;沒有請求日志&#xff0c;出問題難以排查錯誤信息格式不統一缺少統一的請求處理機…

【LeetCode熱題100道筆記】反轉鏈表

題目描述 給你單鏈表的頭節點 head &#xff0c;請你反轉鏈表&#xff0c;并返回反轉后的鏈表。 示例 1&#xff1a;輸入&#xff1a;head [1,2,3,4,5] 輸出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a;輸入&#xff1a;head [1,2] 輸出&#xff1a;[2,1] 示例 3&#xff1a;…

Oracle:select top 5

在Oracle數據庫中實現SELECT TOP 5功能需采用特定語法&#xff0c;因其原生不支持TOP關鍵字。以下是兩種主流實現方式&#xff1a;?ROWNUM結合子查詢?先通過子查詢排序數據&#xff0c;再在外層用ROWNUM限制行數&#xff1a;SELECT * FROM ( SELECT * FROM 表名 ORDER BY 排序…