继续以“以通信方式共享内存,不要以共享内存方式通信”这句话展开。

从云原生开始。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

浙江温州皮鞋湿,下雨进水不会胖。

以通信方式共享内存,不要以共享内存方式通信(2)相关推荐

  1. python slice是共享内存吗_python共享内存实现进程通信

    1.概述 共享内存可以说是最有用的进程间通信方式.两个不同的进程共享内存的意思是:同一块物理内存被映射到两个进程的各自的进程地址空间.一个进程可以及时看到另一个进程对共享内存的更新,反之亦然.采用共享 ...

  2. mmap内存映射、system V共享内存和Posix共享内存

    linux内核支持多种共享内存方式,如mmap内存映射,Posix共享内存,以system V共享内存.当内核空间和用户空间存在大量数据交互时,共享内存映射就成了这种情况下的不二选择.它能够最大限度的 ...

  3. linux如何创建共享内存,linux实现共享内存同步的四种方法

    https://blog.csdn.net/sunxiaopengsun/article/details/79869115 本文主要对实现共享内存同步的四种方法进行了介绍. 共享内存是一种最为高效的进 ...

  4. mysql数据库映射到内存_基于共享内存的数据库映射

    基于共享内存的数据库映射 概述 随着各类行业软件对性能追求越来越高,因此对数据库处理的速度提出了新的挑战.然而大部分复杂的业务处理往往依赖体量较大的关系数据(如:Oracle,Mysql,Postgr ...

  5. 【Android 内存优化】Java 内存模型 ( Java 虚拟机内存模型 | 线程私有区 | 共享数据区 | 内存回收算法 | 引用计数 | 可达性分析 )

    文章目录 一. Java 虚拟机内存模型 二. 程序计数器 ( 线程私有区 ) 三. 虚拟机栈 ( 线程私有区 ) 四. 本地方法栈 ( 线程私有区 ) 五. 方法区 ( 共享数据区 ) 1. 方法区 ...

  6. Java堆内存是线程共享的!面试官:你确定吗?

    作者 l Hollis 来源 l Hollis(ID:hollischuang) Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点,所以,即使是一个Java的初学者,也一定或 ...

  7. RTX5 | 内存池04 - 共享内存用于线程之间的通讯(阻塞方式)- 使用信号量

    文章目录 一.前言 二.实验目的 三.代码 3.1.main.h 3.2.main.c 四.Debug 4.1.System Analyzer 4.2.Debug (printf) Viewer 一. ...

  8. Java 堆内存是线程共享的!面试官:你确定吗?

    作者 l Hollis 本文经授权转载自Hollis(ID:hollischuang) Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点,所以,即使是一个Java的初学者,也 ...

  9. oracle共享池的结构,Oracle 10g内存结构之共享池的相关知识及使用简介

    Oracle 10g内存结构之共享池的相关知识及使用简介 之前我们介绍了:Oracle 10g内存结构之系统全局区简介,本文我们接着介绍一下Oracle 10g内存结构之共享池的相关知识,接下来就让我 ...

最新文章

  1. 数据中心停机事故的教训:关注基础设施
  2. Swif基础语法01
  3. Oracle日志分类
  4. 【软件质量】代码注释的消极作用
  5. python登录界面源码_基于Python的自媒体小助手---登录页面的实现代码
  6. oracle数据库建立主键约束,数据库-Oracle主键约束和唯一索引的黑与白
  7. JAVA设计模式之【职责链模式】
  8. 来,亮点抢先看!网易智企机器之心即将联合发布 AI 白皮书
  9. 防盗报警器c语言程序,基于AT89C2051设计的无线防盗报警器 附程序
  10. java 图片渐变消失_透明背景图像与渐变
  11. HTML语言代码参考(中英文对照)
  12. 工业相机 镜头 焦距 视野 计算相关
  13. 55ide游戏引擎教程2:新建项目Hello World
  14. trac mysql_Trac的安装和简单使用
  15. Mysql 查询数据并按顺序添加序号
  16. 云函数支付以及支付回调
  17. 网站快照异常预示网站优化有问题
  18. Oracle登录时出现ERROR: ORA-01031 insufficient privileges
  19. 面试必备之建造者模式
  20. 404php模板,WordPress程序设置404.php模板

热门文章

  1. 十大经典排序算法-选择排序算法详解
  2. Android学习笔记(三)之带有侧边索引的快速查找(跟带字母索引查找的通讯录差不多)
  3. java加锁等待_java中的锁池和等待池
  4. SPECTRUM数字化仪M2p系列再添新成员--5Ms/s采样率
  5. 神经网络logistic回归模型,logistic回归的基本理论
  6. kali linux的安装教程
  7. qss设置平面按钮_QSS基础-设置控件样式
  8. 概率论-随机变量的数字特征
  9. vc 控制台添加托盘显示_编程达人
  10. android 高仿苹果listview,高仿 MIUI 弹性拉伸 view ,支持RecyclerView, ListView, GridView, ScrollView ......