文档地址:What every programmer should know about memory

What every programmer should know about memory

introduction

内存性能的提升主要通过以下几个方面

  • RAM hardware design (speed and parallelism)
  • Memory controller designs.
  • CPU caches.
  • Direct memory access (DMA) for devices.

文章标题致敬

What Every Scientist Should Know About Floating-Point Arithmetic (oracle.com) 待阅读

关于南桥和北桥

image-20230706163231448

北桥是负责连接CPU和高速组件的芯片组,包括内存控制器、图形处理器(如果有独立显卡)、高速系统总线(如前端总线)等。它通常位于主板上靠近CPU的位置,负责高速数据传输和协调CPU与其他主要组件的通信。

南桥则是连接北桥和其他低速外设的芯片组。它负责管理与外部设备的连接,包括硬盘驱动器、USB接口、音频设备、网卡等。南桥也提供了一些基本的系统管理功能,如电源管理、硬件监控等。

随着CPU的发展,内存控制器和PCIE控制器整合到CPU中,传统的北桥功能已经整合到CPU内部了,南桥依然负责处理低速设备(未来也有可能被整合)。

image-20230706163717138

CPU通过MC(memory controller)连接内存,每个CPU连接对应的内存,相比于通过北桥连接提高了内存带宽。但是带来了NUMA架构的问题。

现代架构:

img

cache容量有限问题:预取

缓存一致性相关:

实现缓存一致性的两种方法

  • 写直达(write—through):修改cache line中的数据就直接写回内存
  • 写回(write-back):修改cache line以后将其标记为dirty,当cache line中的内容被替换时,dirty位的cache line将会写回内存

写直达相较于写回实现起来简单,但是频繁的写内存性能较差,因此写回更常见

写回还存在一个问题,当一个处理器的cache line是脏的,其他处理器想要访问这部分数据时,不能直接从内存读取,而是应该读取第一个处理器cache中的数据。

关于linux存储软件栈

mmap系统调用

mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。munmap执行相反的操作,删除特定地址区域的对象映射。

当使用mmap映射文件到进程后,就可以直接操作这段虚拟地址进行文件的读写等操作,不必再调用read,write等系统调用.但需注意,直接对该段内存写时不会写入超过当前文件大小的内容.

采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。

linux SHM shared memory

共享内存是进程间通信中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。

综述

宋宝华:世上最好的共享内存(Linux共享内存最透彻的一篇)-腾讯云开发者社区-腾讯云 (tencent.com)

API

进程间的通信方式(一):共享内存 - 知乎 (zhihu.com)