文章目录前言原理初探共享内存的创建过程系列 API 的使用ftokshmgetshmatshmdtshmctl共享内存实例 前言 总结一下最近对于共享内存的学习, 可能比较浅显或者有疏漏, 欢迎指正! 原理初探 我们知道, 进程空间相互隔离, 互相对立, 但是共享内存允许多个进程可以访问同一块内存来达到进程间通信的目的. 共享内存是最高效的 IPC 机制, 它不涉及任何进程间的数据传输, 而且他和进程同处于用户空间, 不像消息队列, 信号量是内核空间的系统对象, 不需要花费额外的数据拷贝, 但是同时他并没有预防竞态条件, 也就是说在多进程利用共享内存进行通信的情况下, 我们需要自己去利用锁等操作来进行同步 共享内存的创建过程 当我们创建了一块共享内存, 其实是在 tmpfs 中创建了一个文件 (这个文件是存储于内存的), 也就意味着在 tmpfs 中创建了一个 iNode 节点 然后我们需要将这个创建好的文件映射到进程中 (如下图, 此图来自网络, 应该是哪个博客或者知乎吧…已经记不清了) 我们创 继续阅读 >>


吕子健 18/11/08 23:11:47
共享内存 共享内存简介 共享内存是所有进程间通信(IPC)手段中速度最快的,不同进程间使用事实上的同一内存区域,这样使得进程间使用信息时免去“复制”这一流程,减少开销。 以下面“进程A从文件f中读取数据,进行加工之后,将数据传递给进程B”这种场景为例,若使用其他的IPC形式,我们至少需要以下步骤: 1. 从文件f中复制数据到进程A的内存中; 2. 加工数据; 3. 将加工好的数据通过系统调用拷贝到内核空间中; 4. 进程B得知有数据发来,从内核空间将加工好的数据拷贝到进程B的内存中; 5. 进程B使用数据 而我们若使用共享内存,则至少需要以下三个步骤: 1. 从文件f中复制数据到共享内存区域中; 2. 加工数据; 3. 进程B使用数据 显然的,在使用共享内存时,我们减少了一些无意义的数据复制。 不过,在这之中还有一些隐藏在其中影响效率的其他细节——系统调用的数量。在我们使用其他的IPC形式时,读取、写入时将不可避免的使用系统调用,当进行大量的数据吞吐时,频繁的系统调用就会严重地拖累性能。而当我们使用 继续阅读 >>


娄泽豪 18/10/31 22:56:59
1、brk释放内存和sbrk分配内存 #include<unistd.h> int brk(void *end_data_segment); 成功返回0,否则为-1 将内存边界设置为参数所指定位置 void *sbrk(intptr_t increment); 成功返回之前的内存边界,失败返回(void*)-1 增加内存边界,返回为新分配内存的起始位置(sbrk(0)就是获得堆位置) 使用的例子 #include <iostream> #include <unistd.h> using namespace std; int main() { int* phead; // 指向首位置 int* pnow; // 指向当前指针位置 pnow = sbrk(0); // 先分配空闲区域 phead = pnow; // 固定首位置不变 for(int i=2; i<10000; i++) { 继续阅读 >>


陈文浩 18/08/13 15:41:54
一、运行时的数据区域 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。每个线程都有一个独立的程序计数器,彼此间计数器互不影响,独立存储,即是“线程私有”的内存。 在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、跳转、循坏、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 当线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果执行的是Native方法,这个计数器的值则为空,此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。 Native关键字说明其修饰的方法是一个原生态的方法,方法对应的实现不是在当前文件,而是在用其他语言(入C、C++等)实现的文件。Java语言本身不能对操作系统底层进行访问和操作,但可以通过JNI(Java Native In 继续阅读 >>


李猛 18/08/08 08:20:41
一起来学习JVM吧 我们在学习C++的时候知道,每一个new操作都要对应相应的delete操作,否则会出现内存泄漏的问题,同理C语言的malloc和free也是如此。那么对于Java这门语言,我们却无需这样做,这一切都归结于JVM的强大,在虚拟机自动内存管理机制的帮助下,我们一般只需创建对象(申请内存),而不需要关注或者主动的销毁对象。不过,也正是因为我们把内存控制的权力交给了JVM,一旦出现内存泄漏和溢出方面的问题,如果不了解JVM如何使用内存,那么排查起来会异常困难。所以这篇博客就让我们来看看Java的内存区域~ JVM在执行Java程序的过程中会把它所管理的内存划分为JVM将内存主要划分为五个区域:方法区、Java堆、虚拟机栈、本地方法栈、程序计数器。如下如所示: 我们一个一个来看这些区域都有什么用途~ 程序计数器(Program Counter Register) 这是一块较小的内存空间,是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条 继续阅读 >>


贺含悦 18/07/27 01:18:40
0 内存管理概述 包括内存管理和虚拟内存管理。 内存管理包括:内存管理概念、交换与覆盖、连续分配管理方式和非连续分配管理方式(分页管理方式、分段管理方式、段页式管理方式)。 虚拟内存管理包括:虚拟内存概念、请求分页管理方式、页面置换算法、页面分配策略、工作集和抖动。 内存管理的概念 操作系统对内存的划分和动态分配 内存管理的功能 内存空间的分配与回收:由操作系统完成主存储器空间的分配和管理,使程序员摆脱存储分配的麻烦,提高编程效率。 地址转换:在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致,因此存储管理必须提供地址变换功能,把逻辑地址转换成相应的物理地址。 内存空间的扩充:利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。 存储保护:保证各道作业在各自的存储空间内运行,.互不干扰。 1 存储器的层次结构 CPU 寄存器 寄存器 主存 高速缓存 主存 磁盘缓存 辅存 磁盘 可移动存储介质 寄存器,高速缓存,主存,磁盘缓存属于 继续阅读 >>


刘生玺 18/07/02 23:14:35
继承与动态内存分配 在基类或派生类中含有指针时,要考虑内存分配情况(new与delete),还要考虑在进行对象间赋值时指针隐藏的问题(使用默认复制构造函数在析构时会造成原对象中的指针指向的内存空间被释放,为浅复制) 因此需要: 1. 重载运算符’=‘、’<<‘,实现深度复制; 2. 在构造函数中使用new进行动态内存分配,在析构函数中使用delete进行内存释放; 3. 将析构函数声明为虚函数 在以下代码中还有一个小技巧来简化代码,即代码重用,在后续代码中使用已定义过的代码,例如:在C的构造函数中使用已经定义过的A的构造函数,这样就可以只对C类新增的数据部分进行初始化。 #include <iostream> #include <string> #include <cstring> using namespace std; class A { private: char *label; //使用指针,需要动态分配内存 继续阅读 >>


王良 18/05/16 23:37:26
这个我是感觉在思路上没有那么复杂啦,参考书上的提示应该能够自己写出来,就直接上代码了 #include<iostream> #include<memory> #include<utility> #include<string> #include<algorithm> //Equivalent to " vector<string> " class StrVec{ public: StrVec():elements(nullptr),frist_free(nullptr),cap(nullptr){ } StrVec( const StrVec & ) ; StrVec( const std::initializer_list<std::string> & ) ; StrVec& operator=( const StrVec & ) ; 继续阅读 >>


刘生玺 18/04/19 19:17:33
翻译自Spark官网文档,版本:2.3.0 spark内存管理概览 Spark很大一部分内存用于storage和execution,即存储和执行任务。execution memory指的是在shuffle,join,sorts,aggregation操作中使用的内存,storage memory指的是用于整个集群缓存数据和传播中间数据的内存。 spark中storage和execution分享一个统一的区域(M),当没有execution memory被使用,storage可以占用全部可用内存,反之亦然。storage占用execution memory时且有必要时execution可以驱逐storage,直到storage memory使用量低于一个阈值(R)。也就是说R描述了一个小于M的缓存区域,绝不会被驱逐。execution占用storage memory时因为实现复杂所以storage不会驱逐execution。 spark有两个相关配置项: 1. saprk.memory.frac 继续阅读 >>


高朴 18/04/09 23:30:55
buddy system简介: buddy system内存管理,努力让内存分配与相邻内存合并能快速进行(对于普通算法来讲,合并内存相当困难),它利用的是计算机擅长处理2的幂运算。 我们创建一系列空闲块列表,每一种都是2的倍数。 举个例子,如果最小分配单元是8字节,整个内存空间有1M。我们创建8字节内存块链表,16字节内存块链表,32字节内存块链表,64,128,256,512,1k,2K, 4K, 8K, 16K, 32K, 64K, 128K, 256K, 512K 和一个1M内存块链表。 除了1M内存块链表有一个可用单元,其余链表初始为空。所有的内存分配都会向上取整到2的倍数—-70K会向上取整到128K,15K会向上取整到16K,等等。 什么是Buddy buddy system允许一个被分配块单元平均拆分成两个大小是原来一半的块单元,这两个块单元互为伙伴。块B的伙伴必须满足大小跟块B一样大,并且内存地址相邻(才可以合并)。 另一个伙伴性质是所有块单元在内存中的地址必须能被它自 继续阅读 >>


楚东方 18/03/03 22:58:13