Python 3.8 新增 multiprocessing.SharedMemory 支持共享内存

Thu 28 February 2019

Python 在 2019-02-25 释出了 3.8 早期预览版 3.8.0a2,其中新增了 multiprocessing.SharedMemory 用以支持共享内存,大大提高多进程之间通信效率。简单看了一下实现代码主要涉及如下 Python 模块

在 POSIX 平台下共享内存创建过程如下:

  1. 基于 tmpfs 打开或创建具名(文件名)的共享内存,得到文件描述符
  2. 通过 mmap 将文件描述符映射进程的内存地址空间
  3. 通过 memoryview 直接访问经过 mmap 映射后的的内存地址空间

锁的问题

memoryview 通过如下方式使用:

s = bytearray(b'aaa')
m = memoryview(s)
m[0] = 98
print(s)  # outputs: bytearray(b'baa')

当上面代码执行 m[0] = 98 时实际上调用的是 C 代码 memory_ass_sub,然后调用 PACK_SINGLE 通过 memcpy 覆盖指针原有的值。

所以直接操作 multiprocessing.SharedMemory 会产生数据竞争,不应该直接使用,应该使用 multiprocessing.Valuemultiprocessing.Array 这种更高层的抽象,锁在这一层级实现。

参见

更多关于共享内存参见:


Category: Python Tagged: Python 3.8 multiprocessing 共享 内存 shared memory

comments


译文:Go 内存分配器可视化指南

Sat 23 February 2019

当我第一次开始尝试理解 Go 语言的内存分配器时,整个过程让我抓狂。一切看起来都像一个神秘的黑盒子。因为几乎所有技术魔法(technical wizardry)都隐藏在抽象之下,所以你需要一层一层的剥离才能去理解它。

我们将通过这篇文章来一层层的剥离这些细节。如果你想学习所有关于 Go 内存分配器的知识,那么这篇文章正适合你。

物理内存和虚拟内存

每一个内存分配器都需要运行在由底层操作系统管理的虚拟内存空间(Virtual Memory Space)之上。

下图是一个物理内存单元(Physical Memory Cell)的简要说明(非精准)

A simple illustration of a Physical Memory Cell

一个内存单元的概述经过大大简化之后描述如下:

  1. 地址线(Address line)(晶体管做的开关)用于访问电容器(数据到数据线(Data Lines))。
  2. 如果地址线有电流流动(显式为红色),数据线可以写入到电容器,所以电容器带电,逻辑值表示 “1”。
  3. 如果地址线没有电流流动(显式为绿色),数据线不可以写入到电容器,所以电容器不带电,逻辑值表示 “0”
  4. 当 CPU …

Category: Go Tagged: Go memory allocator

comments

Read More
Page 1 of 1

Fork me on GitHub