linux下共享内存模块实现原理详解
1. 模块概述
shm 模块是一个专为实现高效的进程间通信而设计的模块。它巧妙结合了共享内存(Shared Memory)和事件通知机制(eventfd),为系统提供了低延迟、高带宽的数据传输能力,是连接不同进程的重要桥梁。
#mermaid-svg-fiARL3cLlS4Pbphc{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fiARL3cLlS4Pbphc .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fiARL3cLlS4Pbphc .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fiARL3cLlS4Pbphc .error-icon{fill:#552222;}#mermaid-svg-fiARL3cLlS4Pbphc .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fiARL3cLlS4Pbphc .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fiARL3cLlS4Pbphc .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fiARL3cLlS4Pbphc .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fiARL3cLlS4Pbphc .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fiARL3cLlS4Pbphc .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fiARL3cLlS4Pbphc .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fiARL3cLlS4Pbphc .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fiARL3cLlS4Pbphc .marker.cross{stroke:#333333;}#mermaid-svg-fiARL3cLlS4Pbphc svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fiARL3cLlS4Pbphc p{margin:0;}#mermaid-svg-fiARL3cLlS4Pbphc .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-fiARL3cLlS4Pbphc .cluster-label text{fill:#333;}#mermaid-svg-fiARL3cLlS4Pbphc .cluster-label span{color:#333;}#mermaid-svg-fiARL3cLlS4Pbphc .cluster-label span p{background-color:transparent;}#mermaid-svg-fiARL3cLlS4Pbphc .label text,#mermaid-svg-fiARL3cLlS4Pbphc span{fill:#333;color:#333;}#mermaid-svg-fiARL3cLlS4Pbphc .node rect,#mermaid-svg-fiARL3cLlS4Pbphc .node circle,#mermaid-svg-fiARL3cLlS4Pbphc .node ellipse,#mermaid-svg-fiARL3cLlS4Pbphc .node polygon,#mermaid-svg-fiARL3cLlS4Pbphc .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fiARL3cLlS4Pbphc .rough-node .label text,#mermaid-svg-fiARL3cLlS4Pbphc .node .label text,#mermaid-svg-fiARL3cLlS4Pbphc .image-shape .label,#mermaid-svg-fiARL3cLlS4Pbphc .icon-shape .label{text-anchor:middle;}#mermaid-svg-fiARL3cLlS4Pbphc .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fiARL3cLlS4Pbphc .rough-node .label,#mermaid-svg-fiARL3cLlS4Pbphc .node .label,#mermaid-svg-fiARL3cLlS4Pbphc .image-shape .label,#mermaid-svg-fiARL3cLlS4Pbphc .icon-shape .label{text-align:center;}#mermaid-svg-fiARL3cLlS4Pbphc .node.clickable{cursor:pointer;}#mermaid-svg-fiARL3cLlS4Pbphc .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fiARL3cLlS4Pbphc .arrowheadPath{fill:#333333;}#mermaid-svg-fiARL3cLlS4Pbphc .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fiARL3cLlS4Pbphc .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fiARL3cLlS4Pbphc .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fiARL3cLlS4Pbphc .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fiARL3cLlS4Pbphc .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fiARL3cLlS4Pbphc .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fiARL3cLlS4Pbphc .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fiARL3cLlS4Pbphc .cluster text{fill:#333;}#mermaid-svg-fiARL3cLlS4Pbphc .cluster span{color:#333;}#mermaid-svg-fiARL3cLlS4Pbphc div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fiARL3cLlS4Pbphc .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fiARL3cLlS4Pbphc rect.text{fill:none;stroke-width:0;}#mermaid-svg-fiARL3cLlS4Pbphc .icon-shape,#mermaid-svg-fiARL3cLlS4Pbphc .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fiARL3cLlS4Pbphc .icon-shape p,#mermaid-svg-fiARL3cLlS4Pbphc .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fiARL3cLlS4Pbphc .icon-shape rect,#mermaid-svg-fiARL3cLlS4Pbphc .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fiARL3cLlS4Pbphc .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fiARL3cLlS4Pbphc .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fiARL3cLlS4Pbphc :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
接收进程
shm模块
发送进程
数据生成
写入共享内存
向eventfd写入数据长度
eventFD组件
epoll监控
读取eventfd数据
触发事件通知
从共享内存读取数据
广播数据事件
事件监听器
处理接收到的数据
2. 核心组件
2.1 组件结构
shm 模块由三个核心组件协同工作,共同实现高效的进程间通信:
| shm | 主类 | 对外提供统一接口,协调各组件工作流程 |
| eventFD | 辅助类 | 实现事件通知机制,监听数据就绪状态 |
| sharedMem | 底层组件 | 负责共享内存的创建、管理和数据读写 |
2.2 类图
#mermaid-svg-CqqJUhLxvkIFBleU{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-CqqJUhLxvkIFBleU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-CqqJUhLxvkIFBleU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-CqqJUhLxvkIFBleU .error-icon{fill:#552222;}#mermaid-svg-CqqJUhLxvkIFBleU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CqqJUhLxvkIFBleU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-CqqJUhLxvkIFBleU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CqqJUhLxvkIFBleU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CqqJUhLxvkIFBleU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-CqqJUhLxvkIFBleU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CqqJUhLxvkIFBleU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CqqJUhLxvkIFBleU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CqqJUhLxvkIFBleU .marker.cross{stroke:#333333;}#mermaid-svg-CqqJUhLxvkIFBleU svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CqqJUhLxvkIFBleU p{margin:0;}#mermaid-svg-CqqJUhLxvkIFBleU g.classGroup text{fill:#9370DB;stroke:none;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-CqqJUhLxvkIFBleU g.classGroup text .title{font-weight:bolder;}#mermaid-svg-CqqJUhLxvkIFBleU .nodeLabel,#mermaid-svg-CqqJUhLxvkIFBleU .edgeLabel{color:#131300;}#mermaid-svg-CqqJUhLxvkIFBleU .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-CqqJUhLxvkIFBleU .label text{fill:#131300;}#mermaid-svg-CqqJUhLxvkIFBleU .labelBkg{background:#ECECFF;}#mermaid-svg-CqqJUhLxvkIFBleU .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-CqqJUhLxvkIFBleU .classTitle{font-weight:bolder;}#mermaid-svg-CqqJUhLxvkIFBleU .node rect,#mermaid-svg-CqqJUhLxvkIFBleU .node circle,#mermaid-svg-CqqJUhLxvkIFBleU .node ellipse,#mermaid-svg-CqqJUhLxvkIFBleU .node polygon,#mermaid-svg-CqqJUhLxvkIFBleU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CqqJUhLxvkIFBleU .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-CqqJUhLxvkIFBleU g.clickable{cursor:pointer;}#mermaid-svg-CqqJUhLxvkIFBleU g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-CqqJUhLxvkIFBleU g.classGroup line{stroke:#9370DB;stroke-wid


