【转载】ipcs与Linux共享内存】的更多相关文章

一.共享内存相关知识 所谓共享内存,就是多个进程间共同地使用同一段物理内存空间,它是通过将同一段物理内存映射到不同进程的 虚拟空间来实现的.由于映射到不同进程的虚拟空间中,不同进程可以直接使用,不需要像消息队列那样进行复制,所以共享内存的效率很高.共享内存可以通过mmap()映射普通文件机制来实现,也可以System V共享内存机制来实现,System V是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信,也就是说每个共享内存区域对应特殊文件系统shm中的一个文件. 二.共享内存原理…
笔者最近在阅读Aerospike 论文时,发现了Aerospike是利用了Linux 共享内存机制来实现的存储索引快速重建的.这种方式比传统利用索引文件进行快速重启的方式大大提高了效率.(减少了磁盘 i/o,但是缺点是耗费内存,并且服务器一旦重启之后就只能冷重启了~~)而目前笔者工作之中维护的 NoSQL 数据库也是通过同样的机制实现存储索引的快速重建的,工欲善其事,必先利其器.所以笔者花时间调研了一下Linux共享内存的机制,希望对各位有所帮助~~ 1.共享内存简介 说到共享内存,有过操作系统…
在进程通信应用中会用到共享内存,这就涉及到了IPC,与IPC相关的命令包括:ipcs.ipcrm(释放IPC).IPCS命令是Linux下显示进程间通信设施状态的工具.我们知道,系统进行进程间通信(IPC)的时候,可用的方式包括信号量.共享内存.消息队列.管道.信号(signal).套接字等形式[2].使用IPCS可以查看共享内存.信号量.消息队列的状态. 当下系统是Centos,执行ipcs命令查看 说明: 第一列就是共享内存的key: 第二列是共享内存的编号shmid: 第三列就是创建的用户…
linux 共享内存shm_open实现进程间大数据交互 read.c #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <sys/mman.h> #include <string.h> #include <errno.h> #include <unistd.h> /* int…
共享内存是最高效的IPC机制,因为它不涉及进程之间的任何数据传输.这种高效带来的问题是,我们必须用其他手段来同步进程对共享内存的访问,否则会产生竞态条件.所以,共享内存通常和其他进程间通信方式一起使用. linux 共享内存有四个系统调用:shmget, shmat, shmdt, shmctl shmget 创建一段新的共享内存,或者获取一段已经存在的共享内存: #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t…
Linux共享内存编程实例 原文链接:http://blog.csdn.net/pcliuguangtao/article/details/6526119 /*共享内存允许两个或多个进程进程共享同一块内存(这块内存会映射到各个进程自己独立的地址空间) 从而使得这些进程可以相互通信. 在GNU/Linux中所有的进程都有唯一的虚拟地址空间,而共享内存应用编程接口API允许一个进程使 用公共内存区段.但是对内存的共享访问其复杂度也相应增加.共享内存的优点是简易性. 使用消息队列时,一个进程要向队列中…
完整删除共享内存脚本 #!/bin/sh function rmshm() { zero_status=`ipcs -m|awk '{print $6}'|grep -w 0|wc -l` if [ $zero_status -eq 0 ];then echo "Warnning: not status eq 0 shmid,exitting........" return 0 fi get_shmid=`ipcs -m|grep -w 0|awk '{print $2}'` for…
inux系统编程我一直看 <GNU/LINUX编程指南>,只是讲的太简单了,通常是书和网络上的资料结合着来掌握才比较全面 .在掌握了书上的内容后,再来都其他资料 . 原文链接 http://www.cnblogs.com/skyme/archive/2011/01/04/1925404.html 共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区.在/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一个共享内存区的最大字节数shmmax,系统范围内最大共享内存区…
所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式.是针对其他通信机制运行效率较低而设计的.往往与其它通信机制,如 信号量结合使用,来达到进程间的同步及互斥.其他进程能把同一段共享内存段“连接到”他们自己的地址空间里去.所有进程都能访问共享内存中的地址.如果一 个进程向这段共享内存写了数据,所做的改动会即时被有访问同一段共享内存的其他进程看到.共享内存的使用大大降低了在大规模数据处理过程中内存的消耗,但 是共享内存的使用中有很多的陷阱,一不注意就很容易导致程序崩溃. 超过…
在使用共享内存的程序异常退出时,由于没有释放掉共享内存,在调试时会出现错误.您可以使用shell命令来查看与释放已经分配的共享内存,下面将详细说明如何进行查看和释放分配的共享内存的方法. 预备知识 Linux中通过API函数shmget创建的共享内存一般都是在程序中使用shmctl来释放的,但是有时为了调试程序,开发人员可能通过 Ctrl + C等方式发送中断信号来结束程序,此时程序申请的共享内存就不能得到释放,当然如果程序没有改动的话,重新运行程序时仍然会使用上次申请的共享内存,但是 如果我们…
说起共享内存,一般来说会让人想起下面一些方法:1.多线程.线程之间的内存都是共享的.更确切的说,属于同一进程的线程使用的是同一个地址空间,而不是在不同地址空间之间进行内存共享:2.父子进程间的内存共享.父进程以MAP_SHARED|MAP_ANONYMOUS选项mmap一块匿名内存,fork之后,其子孙进程之间就能共享这块内存.这种共享内存由于受到进程父子关系的限制,一般较少使用:3.mmap文件.多个进程mmap到同一个文件,实际上就是大家在共享文件page cache中的内存.不过文件牵涉到…
1.什么是共享内存在前面讲虚拟内存机制时,有讲到Linux的内存映射机制:初始化虚拟内存区域时,会把虚拟内存和磁盘文件对象对应起来.由于内存映射机制,一个磁盘文件对象可被多个进程共享访问,也可被多个进程私有访问.当共享访问时,一个进程的对该对象的修改会显示到其他进程.当私有访问时,修改时会产生保护故障,内核会拷贝这个私有对象,修改的是这个新对象,其他进程指向的是原来的对象.所以,共享内存是指不同进程访问同一个逻辑内存. 2.共享内存的使用Linux提供了一组共享内存API,声明在头文件sys/s…
这是实际linux系统显示的实际数据: beijibing@bjb-desktop:/proc/sys/kernel$ cat shmmax  33554432 beijibing@bjb-desktop:/proc/sys/kernel$ cat shmmni 4096 beijibing@bjb-desktop:/proc/sys/kernel$ cat msgmax 8192 beijibing@bjb-desktop:/proc/sys/kernel$ cat msgmni 622 be…
一.什么是共享内存区 共享内存区是最快的可用IPC形式.它允许多个不相关的进程去访问同一部分逻辑内存.如果需要在两个运行中的进程之间传输数据,共享内存将是一种效率极高的解决方案.一旦这样的内存区映射到共享它的进程的地址空间,这些进程间数据的传输就不再涉及内核.这样就可以减少系统调用时间,提高程序效率. 共享内存是由IPC为一个进程创建的一个特殊的地址范围,它将出现在进程的地址空间中.其他进程可以把同一段共享内存段"连接到"它们自己的地址空间里去.所有进程都可以访问共享内存中的地址.如果…
/*共享内存允许两个或多个进程进程共享同一块内存(这块内存会映射到各个进程自己独立的地址空间) 从而使得这些进程可以相互通信. 在GNU/Linux中所有的进程都有唯一的虚拟地址空间,而共享内存应用编程接口API允许一个进程使 用公共内存区段.但是对内存的共享访问其复杂度也相应增加.共享内存的优点是简易性. 使用消息队列时,一个进程要向队列中写入消息,这要引起从用户地址空间向内核地址空间的一次复制, 同样一个进程进行消息读取时也要进行一次复制.共享内存的优点是完全省去了这些操作. 共享内存会映射…
共享内存段被多个进程附加的时候,如果不是所有进程都已经调用shmdt,那么删除该共享内存段时,会出现一个临时的不完整的共享内存段(key值是0),无法彻底删除.只有当所有进程都调用shmdt,这个临时的不完整共享内存段才会消失. //共享内存 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/ipc.h> #inc…
shmget int shmget(key_t key, size_t size, int flag);//开辟一段共享内存 key_t key :标识符的规则() size_t size :共享内存的大小 int flag :读写的权限 返回值:成功返回一个贡献内存的id,失败返回 -1: 当key的取值为IPC_PRIVATE,则函数shmget()将创建一块新的共享内存:如果key的取值为0,而参数shmflg中设置了IPC_PRIVATE这个标志,则同样将创建一块新的共享内存. size…
共享内存允许系统内两个或多个进程共享同一块内存空间,并且数据不用在客户进程和服务器进程间复制,因此共享内存是通信速度最快的一种IPC. 实现的机制简单描述如下:一个进程在系统中申请开辟了一块共享内存空间,然后使用这个共享内存空间的各个进程分别打开这个共享内存空间,并将这个内存空间映射到自己的进程空间上,这样各个进程就可以共同使用这个共享内存空间,就如同使用自己进程地址空间的内存一样. 要实现共享内存空间,内核做了许多工作:比如给每个共享内存块分发一个“身份证”.允许用户进程将共享内存映射到各自的…
共享内存是IPC的一种机制,允许两个不相关的进程共享同一块内存 //共享内存可以双向通信,但其本身没有相应机制,需要程序编写者设计,本例为单向通信(分为读端和写端). 共享内存读端: #include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <sys/ipc.h> #include <sys/shm.h> //自定义数…
1.  共享内存是在shmget时创建出来的, 在 shmget(USER_SHARE_MEM_KEY,  sizeof(ADDR_NODE) , IPC_CREAT|0666)) ==-1) 的 sizeof() 时创建出来的,   共享内存的结构体不能存在指针之类的内容. 2. 共享内存里不能存在堆 3.正常创建共享内存的方式: http://www.360doc.com/content/11/0902/12/1162697_145212524.shtml 使用 ftok 创建对应的 key…
共享内存的基本概念 共享内存区是最快的IPC形式.一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据. 下图是共享内存示意图: 下图是用管道或者消息队列传递数据示意图: 内核为每个IPC对象维护一个数据结构 下图是用共享内存传递数据示意图: System V共享内存API: 首先了解一下下面结构体 struct shmid_ds {               struct ipc_perm shm_perm…
这篇文章将讲述别一种进程间通信的机制——信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信——使用信号.下面就进入信号量的讲解.   一.什么是信号量 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域.临界区域是指执行数据更新的代码需要独占式地执行.而信号量就可以提供这样的一种访问机制,让一个临界…
顾名思义,消息队列就是一些消息的列表,用户可以在消息队列中添加消息和读取消息等.从这点上看,消息队列具有一定的FIFO特性,但是它可以实现消息的随机查询,比FIFO具有更大的优势.同时,这些消息又是存在于内核中的,由“队列ID”来标识. 消息队列的实现包括创建或打开消息队列.添加消息.读取消息和控制消息队列4种操作,其中创建或打开消息队列使用的函数是msgget(),这里创建的消息队列的数量会受到系统消息队列数量的限制:添加消息使用的函数是msgsnd(),它把消息添加到已打开的消息队列末尾:读…
一.共享内存简介 共享内存是进程间通信中高效方便的方式之一.共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针,两个进程可以对一块共享内存进行读写. 共享内存并未提供进程同步机制,使用共享内存完成进程间通信时,需要借助互斥量或者信号量来完成进程的同步.这里说一下互斥量与信号量的区别.互斥量用于线程的互斥,信号量用于线程的同步,这是互斥量与信号量的本质区别,其次信号量实现互斥量的功能. 本文结合个人实际项目需求,采用互斥量实现进程间…
共享内存 共享内存(shared memory)是最简单的Linux进程间通信方式之一. 使用共享内存,不同进程可以对同一块内存进行读写. 由于所有进程对共享内存的访问就和访问自己的内存空间一样,而不需要进行额外系统调用或内核操作,同时还避免了多余的内存拷贝,所以,这种方式是效率最高.速度最快的进程间通信方式. 这种最大限度的自由也给共享内存带来了缺点:内核并不提供任何对共享内存访问的同步机制,比如 同时对共享内存的相同地址进行写操作,则后写的数据会覆盖之前的数据.所以,使用共享内存一般还需要使…
Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> 参考:C和指针学习 说明:本文非常的长,也是为了便于查找和比较,所以放在一起了 Linux 传统的进程间通信有很多,如各类管道.消息队列.内存共享.信号量等等.但它们都无法介于内核态与用户态使用,原因如表 通信方法 无法介于内核态与用户态的原因 管道(不包括命名管道) 局限于父子进程间的通信. 消息队列 在…
共享内存 IPC 原理 共享内存进程间通信机制主要用于实现进程间大量的数据传输,下图所示为进程间使用共享内存实现大量数据传输的示意图: 共享内存是在内存中单独开辟的一段内存空间,这段内存空间有自己特有的数据结构,包括访问权限.大小和最近访问的时间等.该数据结构定义如下: from /usr/include/linux/shm.h struct shmid_ds { struct ipc_perm shm_perm; /* operation perms 操作权限 */ int shm_segsz…
概述 url=MdyPihmS_tWLwgWL5CMzaTrwDFHu6euAJJUAjKvlzbJmRw7RfhmkBWwAloo7Y65hLY-kQdHsbqWYP2wc2fk8yq">共享内存是进程间通信中最简单的方式之中的一个.共享内存同意两个或很多其他进程訪问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针. 当一个进程改变了这块地址中的内容的时候,其他进程都会察觉到这个更改. 共享内存的特点: 1)共享内存是进程间共享数据的一种最快的方法.…
参考 http://www.startos.com/linux/tips/2011012822078.html 1)Linux和所有的UNIX操作系统都允许通过共享内存在应用程序之间共享存储空间. 2)有两类基本的API函数用于在进程间共享内存:System v和POSIX.  (当然,还有mmap,属于POSIX的) 3)这两类函数上使用相同的原则,核心思想就是任何要被共享的内存都必须经过显示的分配. 4)因为所有进程共享同一块内存,共享内存在各种进程间通信方式中具有最高的效率. 5)内核没有…
引言 - ipc - shm 共享内存 本文会通过案例了解ipc 的共享内存机制使用, 后面会讲解C 如何使用外部内存服务memcached. 好先开始了解 linux 共享内存机制. 推荐先参看下面内容回顾一下 共享内存 linux api. linux进程间的通信(C): 共享内存    http://blog.chinaunix.net/uid-26000296-id-3421346.html 上面文章可以简单看一下概念.  下面这篇文章好些, 可以细看加深共享内存api使用熟练度. Li…