共享内存(Shared Memory)是最简单的进程间通信方式,它允许多个进程访问相同的内存,一个进程改变其中的数据后,其他的进程都可以看到数据的变化。

共享内存是进程间最快速的通信方式:

`进程共享同一块内存空间。

`访问共享内存和访问私有内存一样快。

`不需要系统调用和内核入口。

`不造成不必要的内存复制。

内核不对共享内存的访问进行同步,因此程序员必须自己提供同步。

使用共享内存:

`某个进程分配内存段。

`使用这个内存段的进程要连接(attach)这个内存段。

`每个进程使用完共享内存段后,要分离(detach)这个内存段。

`在某个地方,必须有一个进程来销毁这个内存段。

Linux的内存模型:

`每个进程的虚拟内存被分为页(page)。

`每个进程维护自己的内存地址到虚拟内存页之间的映射。

`实际的数据存在于进程的内存地址上。

`尽管每个进程有自己的地址空间,多个进程的映射还是可以指向相同的页。

所有的共享内存段的大小,都是Linux内存页大小的整数倍。

Linux的页大小是4KB,不过程序员应该使用getpagesize函数来获得这个值。

分配:shmget

`第一个参数是一个整型的键,用于指定要创建的段。无关的进程可以通过指定同一个键来访问同一段共享内存。

`使用常量IPC_PRIVATE作为第一个参数,可以避免键的冲突。

`第二个参数是分配的段的大小(字节数)。实际分配的字节数会舍弃多余部分到页大小的整数倍。

`第三个参数是位标志,用来表示创建的选项。

``IPC_CREATE:表明要创建新的共享内存空间。

``IPC_EXCL:总是和上一个标志一起使用。如果指定键的共享内存段已经存在,这个标志会导致调用失败;如果没有指定这个标志,调用会返回已经占用这个键的共享内存段。

``模式标志:9个bit的标志,和系统的文件权限使用相同的标志,不过执行标志无效。这些标志定义在中。

`返回值是新创建的或者取得的内存段的标志符(SHMID)。

连接:shmat

`第一个参数是由shmget得到的标志符(SHMID)。

`第二个参数是指向你想要映射到的本进程的地址空间的指针。如果指定NULL,Linux负责选择一个可用的地址。

===================================================

python的共享内存

python的multiprocessing模块提供两种共享内存,sharedctypes与Manager,

Manager效率较低,但支持远程共享内存。

sharedctypes效率较高,快Manager两个数量级,在多进程访问时与普通内存访问相当

结果比较如下:

test array

elapsed 0:00:00.119707

test dict

elapsed 0:00:00.152856

test shared manager list

elapsed 0:00:37.87666

test sharedctypes list in main process

elapsed 0:00:00.154170

test sharedctypes list in subprocess

elapsed 0:00:00.303328

elapsed 0:00:00.327261

elapsed 0:00:00.349312

elapsed 0:00:00.318946

elapsed 0:00:00.364301

elapsed 0:00:00.370176

elapsed 0:00:00.343588

elapsed 0:00:00.348737

代码如下:

import array

from datetime import datetime, timedelta

size = 1000000

def tranverse(a):

t = datetime.now()

for i in range(size):

a[i]

print 'elapsed %s'% (datetime.now()- t)

a = array.array('i', [i for i in range(size)])

print 'test array'

tranverse(a)

a = {}

for i in range(size):

a[i] = i

print 'test dict'

tranverse(a)

from multiprocessing import Manager

manager = Manager()

a = manager.list([i for i in range(size)])

print 'test shared manager list'

tranverse(a)

from multiprocessing.sharedctypes import RawArray

a = RawArray( 'i', [i for i in range(size)] )

print 'test sharedctypes list in main process'

tranverse(a)

from multiprocessing import Process

ps = [Process(target=tranverse, args=(a, )) for i in range(8)]

print 'test sharedctypes list in subprocess'

for p in ps:

p.start()

for p in ps:

p.join()

python 共享内存 c_python共享内存 - DK's Blog - 博客园相关推荐

  1. python贴吧发帖脚本-一个发布文章到博客园的 Python 脚本

    我的个人独立博客是基于 Hexo 搭建的,因为小站,Google 搜索引擎收录文章比较慢,还搜不到 为了解决这个问题,希望把文章也顺便发布到博客平台博客园上.但不想每次手动复制粘贴,打算利用脚本实现, ...

  2. python密码破解工具_一个最简单的博客园文章密码暴力破解器-python3实现

    一个最简单的博客园文章密码暴力破解器-python3实现 我之前想写路由器的密码暴力破解器,我手上只有极路由,发现极路由有安全限制,只能允许连续10密码错误,所以我改拿博客园练手. 博客园的博客有个功 ...

  3. csv是python内置模块吗_Python--CSV模块 - 一只小小的寄居蟹 - 博客园

    import csv with open('/etc/passwd', 'r') as f: reader = csv.reader(f, delimiter=':', quoting=csv.QUO ...

  4. python函数参数定义不合法_面试题 - Operater - 博客园

    1.执行这行代码结果是多少[i**i for i in range(3)] 我写的答案是[0,1,3],忘记了0**0是1 [1,1,3] 2.关于python内存管理:变量可以无需指定类型,可以使用 ...

  5. python关于通讯录模型_python写一个通讯录 - wtwexile - 博客园

    python写一个通讯录 闲着没事,用python写一个模拟通讯录,要求要实现常用的通讯录的功能,基本流程如下 接下来就按照这个流程实现各个模块的功能 1. 定义一个类,并初始化 1 import j ...

  6. python爬虫抢演唱会_Python爬虫爬了七天七夜终于爬出了博客园粉丝数排行榜

    Python爬虫爬了七天七夜终于爬出了博客园粉丝数排行榜 [Python爬虫]爬了七天七夜,终于爬出了博客园粉丝数排行榜! 爬虫数据采集接单,大小不限,欢迎各位科研教师,学生,企业相关人员咨询,QQ: ...

  7. 限制会话id服务端不共享_会话控制 - able-woman - 博客园

    会话控制是什么? cookie和session都是跟踪整个会话过程的技术手段.而会话,就是用户通过浏览器和服务器的一次通话. 为什么要有会话控制? 因为HTTP协议是无状态的,服务器不知道用户上一次做 ...

  8. Linux系统内存管理之伙伴系统分析 - 旭东的博客 - 博客园

    Linux系统内存管理之伙伴系统分析 - 旭东的博客 - 博客园 Linux系统内存管理之伙伴系统分析 今天去面试,一位面试官提到了内存管理的伙伴系统,当时就懵了,因为根本就没有听说过.晚上回来在实验 ...

  9. 分布式Session共享(二):tomcat+memcached实现session共享 - 萝卜兔子 - 博客园

    分布式Session共享(二):tomcat+memcached实现session共享 - 萝卜兔子 - 博客园 http://www.cnblogs.com/notDog/p/5341219.htm ...

最新文章

  1. hdu-4302-Holedox Eating-线段树-单点更新,有策略的单点查询
  2. 在实际案例(费用系统)中落地DDD
  3. 浅谈2D游戏设计模式--游戏剧情设计(1)
  4. 使用 OSC Maven 第三方仓库
  5. sqlplus远程连接k8s集群部署的oracle
  6. 一个创业者的妥协与希望
  7. matlab之norm函数
  8. 内连接(INNER JOIN)
  9. java web开发技术大_2021年六大javaweb开发主流技术
  10. startlogging中设置setstdout=false来禁用这个功能。_Windows 10禁用USB选择性暂停设置,峰哥教你解决USB设备失灵问题...
  11. Vue 实践过程中的几个问题
  12. js prototype 原型对象
  13. 封面型网页html,网站设计常用网页版式
  14. caffe中各种loss函数
  15. 录屏软件 OBS 入门笔记
  16. 微信小程序云开发:使用cms平台来创建json数组
  17. supervisor安装
  18. TypeScript中any、unknown、void、never类型讲解
  19. Linux下装无线网卡(Ubuntu)
  20. PAT A1062 Talent and Virtue (25分)

热门文章

  1. ZeroTier-全网畅连
  2. 计网PPT 第八章 互联网上的音频和视频服务
  3. MySQL数据库——锁机制
  4. html图片查看代码实现,如何用HTML5实现图片预览和查看原图的功能
  5. 大恒相机文件配置V1.1
  6. 干掉广告和钓鱼,这款神器绝了!
  7. 关于机器人坐标系变换的笔记
  8. TL-R473P-AC【搭配面板式AP组网设置方法】
  9. Buffer(缓冲器)
  10. 绿幕换背景、绿幕视频实时换背景