深刻理解|以通信方式共享内存,不要以共享内存方式通信

C语言与CPP编程 2023-05-26 08:30

击上方“C语言与CPP编程”,选择“关注/置顶/星标公众号

干货福利,第一时间送达!

你好,我是飞宇。


题目是一句golang编程箴言,对它的理解可大可小。


往小了说,golang建议使用channel来共享信息而不是使用共享内存,这是一种优雅的方式,避免了数据同步带来的繁琐和低效。

往大了说,本质上还是让资源去调度请求,而不是让请求去调度资源

有些时候,思维的转变,问题的视角,会带来意想不到的收获

资源就那么多,所有请求有序使用资源的方式就是通信的方式,反过来,为每个请求虚拟出它独占资源的假象,那就是共享的方式。两种截然不同的方式,差异体现在仲裁成本,这个成本决定了它们承载并发的能力。

一个一个说。

电路交换 vs 分组交换



  • 电路交换试图占有整条电路(其实是最后一公里),若不成功,必须等到成功。

  • 分组交换将长信息分割成若干小数据包,小数据包统计复用链路。


批处理系统 vs 分时系统

  • 批处理用户一旦使用系统,则会独占系统到任务完成,其它用户等待。

  • 分时系统将时间分片,多用户被调度复用时间片。


CSMA/CD vs 交换式以太网

  • CSMA/CD主机试图独占总线发送数据包,若不成功便退避直到成功。

  • 交换式以太网数据包在交换机有序排队,复用buffer。


Apache vs Nginx

  • Apache为每一个请求生成一个task,该task一旦获得CPU,其它task将等待。

  • Nginx采用异步模型,所有请求分时复用固定数量task的CPU时间。


共享内存 vs erlang/go channel

  • 共享内存对写写以及读写是互斥,每次只允许一个操作,其它不得不等待,重试。

  • erlang/go channel将内容拆解为事务消息,依靠消息的有序传递共享信息。

...

我们来看上述两两比较的共性。

可将上述所有的二者抽象为争抢模式和有序模式:

  • 对于争抢模式,本质上需要对冲突进行仲裁。

  • 对于有序模式,本质上需要对并发进行调度。

所谓对冲突进行仲裁,意思就是发生冲突后怎么办。无论是退避重试,还是等待,此期间均是什么都做不了,且仲裁本身需要昂贵的成本。

并发调度就会好太多,有序化便无冲突,也就没有仲裁成本了,没有了仲裁,也就无需重试,等待,便可以干别的了,处理完全异步化。

我们再来对比之前技术优劣:

电路交换 vs 分组交换

  • 电路交换一旦占线,你需要自己不断重试。

  • 分组交换你只管发数据包,交换节点会自动调度这些数据包到达目的地后重组。


批处理系统 vs 分时系统

  • 批处理系统一旦系统被占,你就要排队等待或者待会儿再来。

  • 分时系统你只需要下发任务,任务调度系统会让所有用户的任务分时复用时间片。


CSMA/CD vs 交换式以太网

  • CSMA/CD网卡需要不断监听冲突并重试。

  • 交换式以太网卡只需要发包,交换机会排队调度来不及转发的数据包。


Apache vs Nginx

  • Apache线程/进程若没被调度到CPU,就需要等待直到被调度切换至CPU。

  • Nginx只需将事件通知到,工作进程便会轮询处理完所有请求。


共享内存 vs erlang/go channel

  • 共享内存访问需要加锁,若持锁失败,要么忙等重试,要么待会儿再来。

  • erlang/go channel以消息传递通信,消息发出后就不用管了,除非它希望得到回馈,完全异步。

可见,这又是一个殊途同归。同类的还有:

  • PCI vs PCIe,从总线到交换。

  • 宏内核 vs 微内核,从共享数据结构到消息传递。



  • Spin/RW Lock vs RCU Lock,从争抢锁到操作副本原子更新。


RCU原理

为什么冲突仲裁的争抢模式无法承载大并发,因为过载的冲突仲裁开销会将资源淹没,若要承载大并发,必然要采用调度的方式。要理解这一要素,需要换一个视角。

我们看操作的是信息的本身,还是信息的副本

回到本文题目,“以通信方式共享内存”操作信息的副本, 而“以共享内存方式通信”则操作信息本身。

操作信息副本可以保证同时有且只有一个实体操作该副本,如果有两个实体需要操作该副本,那就再复制一个副本,这就保证了无冲突,业务流是可控无阻塞的。

RCU可做到业务无阻塞并发,无论是spinlock还是rwlock,都做不到。spinlock/rwlock锁临界区,造成临界区串行化,而RCU没临界区,它将本属于临界区的逻辑作为副本操作,择机原子更新,这便可做到无阻塞并发。

操作副本是无阻塞并发的甘泉,如果把并发看作是时间扩展性,那么将信息共享到远方则是空间扩展性,完成这件事的是网络,目前它是TCP/IP网络。TCP/IP网络采用了“以通信方式共享内存”的方式,它无疑是正确的。

我不懂erlang,但大致知道它的意思,erlang没有变量,只操作副本,它是通信网络在编程语言上的映射,对于golang,大概也是如此,使用go channel可以像网络收发一样来处理信息。

我们看socket接口,它实属用通信的方式共享内存的古老方式。

socket接口一开始是进程间通信机制,与之通信的进程可在本机,也可在远处,可在世界任意地方。“以通信方式共享内存“,是最原始的编程模式,一直到现在依然正确。

共享内存是一种本地优化,仅有编程意义,却没有扩展性,无论是无阻塞并发的时间扩展性,还是将信息传递给远方的空间扩展性。

共享内存是一种本地优化,优化的是指令操作延时,与其将信息封装成消息并传递,不如直接操作信息本身,它编程更简单,代码指令更少,执行延时更低。但高并发并不care指令延时,高并发care同时执行的有效指令数,而spin,switch不属于有效指令,故共享内存天生不与高并发配对。

此外,还是那个观点,网络编程场景,普遍毫秒级的单流通信延时,共享内存相比消息传递节省个微妙甚至纳秒级的操作延时,并无太大意义。要怪就怪光速吧。

从云原生开始

云原生是面向微服务的架构,而消息传递是微服务交互的媒介,每个工人都接触过关于消息队列的概念,正是消息支撑了云原生微服务。

消息并不封装状态,消息本身无状态,状态通过消息之间的交互来体现。消息交互可自由组合,这是分布式的源泉,而云原生本身就是面向分布式的设计。

一个部署云原生应用的IDC机房就是缩小版的全球TCP/IP互联网,无状态的消息在分布式的微服务之间传递,状态仅由微服务的交互定义和维护。

甚至一台物理主机内部板卡也成了微型版的全球TCP/IP互联网,无状态的消息在分布式的模块之间传递,状态仅由模块之间的交互定义和维护。

共享内存类似总线,大家拥有平等访问权,但写访问时要独占。我们可以从总线和消息交换的关系看共享内存的处境。

曾经,主机主板上很多总线,很多模块都要先争抢获得总线控制权才能与CPU或别的模块通信,但后来PCIe将总线改成了由Hub互联的交换网络,采用消息交换替换了总线仲裁。

以太网在此之前已经走过了同样的轨迹。

近来年被工人们提倡的微内核思想,大致也是这么回事,将对共享数据结构的操作换成了消息传递。

为什么这些都和全球TCP/IP互联网类比呢?因为TCP/IP的基础就是异步的,无状态的,分布式的,消息传递的分组交换网

总线简单朴素,随着系统规模的扩大,总线争抢带来的时间损耗指数级上升,人们发现总线无法支持高并发及无法物理扩展时,消息传递便替换了总线。大规模系统,消息操作带来的额外延时是可以忽略不计的。

无论内部板卡,局域网,PCI,操作系统都是从局域范围开始的,它们一开始从总线开始便不足为奇。然而互联网一开始就是连接分布式广域端的,一开始就不适合采用总线结构,这反过来说明总线在分布式场景的不适用。

我一向赞美TCP/IP端到端原则,正是它无状态的IP细腰让互联网规模得以任意扩大而不引入额外开销,而细腰也是无状态消息交换的核心,只在发送端和接收端之间定义和维护状态,而不是所有端一起维护共享总线或内存的状态。

因此,消息传递也遵循端到端原则,可以自由扩展规模,总线和共享内存则相反。

以上从局域扩而大之的视角,我们看到了消息传递替换总线的趋势。

反过来,从广域向内缩,规模在渐小,传输延时在渐短,越来越不分布式,无状态消息传递带来的可扩展优势越发无用武之地,其额外封装带来的额外延时逐渐承担了端到端延时的大头。

除去额外的消息封装和传输操作,所有不多的实体直接操作信息所在的内存,最小化端到端延时便成了可观的收益,因此,总线和共享内存便是微缩版系统的极致了。

总结

这就两边都说得通了,从小规模到大规模,总线和共享内存被消息传递替代,从大规模到小规模,总线和共享内存则是消息传递的优化

就像广义相对论,牛顿力学,量子力学一样,不同的规模尺度有不同的哲学。

来源:https://zhuanlan.zhihu.com/p/498589747

EOF


你好,我是飞宇,本硕均于某中流985 CS就读,先后于百度搜索以及字节某电商部门担任Linux C/C++后端研发工程师。

同时,我也是知乎博主@韩飞宇,日常分享C/C++、计算机学习经验、工作体会,欢迎点击此处查看我以前的学习笔记&经验&分享的资源。

我组建了一些社群一起交流,群里有大牛也有小白,如果你有意可以一起进群交流。

欢迎你添加我的微信,我拉你进技术交流群。此外,我也会经常在微信上分享一些计算机学习经验以及工作体验,还有一些内推机会。

扫描上方二维码,加我微信

我的私人微信

C语言与CPP编程 C语言/C++开发,C语言/C++基础知识,C语言/C++学习路线,C语言/C++进阶,数据结构;算法;python;计算机基础等
评论 (0)
  • 【拆解】+南孚测电器拆解 之前在天猫上买了一盒南孚电池,他给我送了一个小东西—测电器。今天我们就来拆解一下这个小东西,看看它是怎么设计和工作的。 三颗指示灯显示电池剩余电量。当点亮3颗LED时,则表示点亮充足。当点亮2颗LED时,则表示还能用。当点亮1颗LED时,表示点亮地建议更换,当无法点亮LED时,则表示没电了。外壳上还印有正负极,以免用户将电池放反。 这个小东西拆解也很方便,一个螺丝刀稍微撬几下。外壳就下来了,它是通过卡扣连接。 开盖后,测电线路板清晰呈现在眼前。 让我们看看小小的线路板有
    zhusx123 2025-04-05 15:41 53浏览
  • 【拆解】+沈月同款CCD相机SONY DSC-P8拆解 这个清明假期,闲来无事,给大伙带来一个老古董物品的拆解--索尼SONY DSC-P8 CCD相机。这个产品是老婆好几年前在海鲜市场淘来的,由于显示屏老化,无法正常显示界面了,只有显示背光。但是这也无法阻止爱人的拍照。一顿盲操作依旧可以拍出CCD古董相机的质感。如下实拍: 由于这个相机目前都在吃灰。我就拿过来拆解,看看里面都是怎样个设计,满足下电子爱好者的探索。 首先给大伙展示下这台老相机的全貌。正视图  后视图 
    zhusx123 2025-04-06 17:38 86浏览
  • 及时生产 JIT(Just In Time)的起源JIT 起源于 20 世纪 70 年代爆发的全球石油危机和由此引发的自然资源短缺,这对仰赖进口原物料发展经济的日本冲击最大。当时日本的生产企业为了增强竞争力、提高产品利润,在原物料成本难以降低的情况下,只能从生产和流通过程中寻找利润源,降低库存、库存和运输等方面的生产性费用。根据这种思想,日本丰田汽车公司创立的一种具有特色的现代化生产方式,即 JIT,并由此取得了意想不到的成果。由于它不断地用于汽车生产,随后被越来越多的许多行业和企业所采用,为日
    优思学院 2025-04-07 11:56 88浏览
  • 引言:POPO声的成因与影响在语音芯片应用中,WT588F08A作为一款支持DAC+功放输出的高集成方案,常因电路设计或信号处理不当,在音频播放结束后出现POPO声(瞬态噪声)。这种噪声不仅影响用户体验,还可能暴露电路设计缺陷。本文将基于实际案例,解析POPO声的成因并提供系统化的解决方案。一、POPO声的根源分析1. 功放电路状态切换的瞬态冲击当DAC输出的音频信号突然停止时,功放芯片的输入端若处于高阻态或无信号状态,其内部放大电路会因电源电压突变产生瞬态电流,通过喇叭表现为POPO声。关键因
    广州唯创电子 2025-04-07 09:01 91浏览
  • 引言:小型化趋势下的语音芯片需求随着消费电子、物联网及便携式设备的快速发展,产品设计对芯片的小型化、高集成度和低功耗提出了更高要求。厂家凭借其创新的QFN封装技术,推出WTV系列(如WTV380)及WT2003H系列语音芯片,以超小体积、高性能和成本优势,为紧凑型设备提供理想解决方案。产品核心亮点1. QFN封装技术赋能超小体积极致尺寸:WTV380采用QFN32封装,尺寸仅4×4毫米,WT2003H系列同样基于QFN工艺,可满足智能穿戴、微型传感器等对空间严苛的场景需求。高密度集成:QFN封装
    广州唯创电子 2025-04-07 08:47 70浏览
  • 在科技浪潮奔涌的当下,云计算领域的竞争可谓是如火如荼。百度智能云作为其中的重要参与者,近年来成绩斐然。2024年,百度智能云在第四季度营收同比增长26%,这样的增速在行业内十分惹眼。回顾全年,智能云业务的强劲增长势头也十分明显,2024年第一季度,其收入达到47亿元,同比增长12%;第二季度营收51亿元,同比增长14%。从数据来看,百度智能云在营收方面一路高歌猛进,展现出强大的发展潜力。然而,市场对百度智能云的表现似乎并不完全买账。2024年,尽管百度智能云数据亮眼,但百度股价却在震荡中下行。在
    用户1742991715177 2025-04-06 20:25 63浏览
  • 医疗影像设备(如CT、MRI、超声诊断仪等)对PCB的精度、可靠性和信号完整性要求极高。这类设备需要处理微伏级信号、高频数据传输,同时需通过严格的EMC/EMI测试。制造此类PCB需从材料选择、层叠设计、工艺控制等多维度优化。以下是关键技术与经验分享。 1. 材料选择:高频与生物兼容性优先医疗影像设备PCB常采用 Rogers RO4000系列 或 Isola FR4高速材料,以降低介电损耗并保证信号稳定性。例如,捷多邦在客户案例中曾为某超声探头厂商推荐 Rogers RO4350B
    捷多邦 2025-04-07 10:22 82浏览
  • 在影像软的发展历程中,美图曾凭借着美图秀秀等一系列产品,在“颜值经济”的赛道上占据了领先地位,成为了人们日常生活中不可或缺的一部分,也曾在资本市场上风光无限,2016 年上市时,市值一度超过46亿美元,备受瞩目。 然而,随着市场的不断发展和竞争的日益激烈,美图逐渐陷入了困境。商业模式单一,过度依赖在线广告收入,使得其在市场波动面前显得脆弱不堪;多元化尝试,涉足手机、电商、短视频、医美等多个领域,但大多以失败告终,不仅未能带来新的增长点,反而消耗了大量的资源。更为严峻的是,用户流失问题日
    用户1742991715177 2025-04-05 22:24 65浏览
  • 在追求环境质量升级与产业效能突破的当下,温湿度控制正成为横跨多个行业领域的核心命题。作为环境参数中的关键指标,温湿度的精准调控不仅承载着人们对舒适人居环境的期待,更深度关联着工业生产、科研实验及仓储物流等场景的运营效率与安全标准。从应用场景上看,智能家居领域要求温湿度系统实现与人体节律的协同调节,半导体洁净车间要求控制温湿度范围及其波动以保障良品率,而现代化仓储物流体系则依赖温湿度的实时监测预防各种产品的腐损与锈化。温湿度传感器作为实现温湿度监测的关键元器件,其重要性正在各行各业中凸显而出。温湿
    华普微HOPERF 2025-04-07 10:05 78浏览
  •   安全生产预警系统作为现代工业与安全管理的重要组成部分,正以前所未有的技术引领力,创新性地塑造着未来的安全管理模式。这一系统通过集成多种先进技术,如物联网、大数据、人工智能、云计算等,实现了对生产环境中潜在危险因素的实时监测、智能分析与及时预警,为企业的安全生产提供了坚实的技术保障。   技术引领:   物联网技术:物联网技术使得各类安全监测设备能够互联互通,形成一张覆盖全生产区域的安全感知网络。传感器、摄像头等终端设备实时采集温度、压力、气体浓度、人员位置等关键数据,为预警系统提供丰富的
    北京华盛恒辉软件开发 2025-04-05 22:18 76浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦