首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Linux内核编程--内存映射共享内存

PROT_EXEC:映射区可执行 PROT_NONE:映射区不可访问 --flags参数取值: MAP_SHARED:变动是共享的,内存区域的读写影响到原文件 MAP_PRIVATE:变动是私有的,...: 内存映射共享内存的区别: 1.内存映射与文件关联,共享内存不需要与文件关联,把共享内存理解为内存上的一个匿名片段。...2.内存映射可以通过fork继承给子进程,共享内存不可以。 3.文件打开的函数不同,内存映射文件由open函数打开,共享内存区对象由shm_open函数打开。...但是它们被打开后返回的文件描述符都是由mmap函数映射到进程的地址空间。 共享内存允许多个进程共享一个给定的存储区。...*buf) --shmid:共享内存标识符 --cmd:共享内存控制指令 IPC_STAT:得到共享内存的状态 IPC_SET:改变共享内存的状态 IPC_RMID:删除该共享内存 --shmid_ds

5.8K10

c# 通过内存映射实现文件共享内存

内存映射文件是利用虚拟内存把文件映射到进程的地址空间中去,在此之后进程操作文件,就像操作进程空间里的地址一样了,比如使用c语言的 memcpy等内存操作的函数。...这种方法能够很好的应用在需要频繁处理一个文件或者是一个大文件的场合,这种方式处理IO效率比普通IO效率要高 共享内存内存映射文件的一种特殊情况,内存映射的是一块内存,而非磁盘上的文件。...操作系统给出了创建访问共享内存的API,需要共享内存的进程可以通过这一组定义好的API来访问多个进程之间共有的内存,各个进程访问这一段内存就 像访问一个硬盘上的文件一样。...MemoryMappedFiles命名空间,这个命名空间的类对windows 共享内存相关API做了封装,使.Net程序员可以更方便的使用内存映射文件。 在C#中使用共享内存。...以下App1的代码让用户输入一行文本到共享内存中;App2不停的刷新控制台,输出最新的共享内存内容;App3实现的功能和App2相同,但读取方法不同。

1.8K20

【Linux 内核 内存管理】内存映射原理 ② ( 内存映射概念 | 文件映射 | 匿名映射 | 内存映射原理 | 分配虚拟内存页 | 产生缺页异常 | 分配物理内存页 | 共享内存 | 进程内存 )

文章目录 一、内存映射概念 二、内存映射原理 1、分配虚拟内存页 2、产生缺页异常 3、分配物理内存页 三、共享内存 四、进程内存段的内存映射类型 一、内存映射概念 ---- 内存映射 概念 : "...内存映射 “ 就是在 进程的 ” 用户虚拟地址空间 " 中 , 创建一个 映射 , " 内存映射 " 有 2 种情况 , ① 文件映射 , ② 匿名映射 ; 文件映射 : 有 文件 支持 的 内存映射..., 并且在 " 页表 “ 中 , 将 ” 虚拟内存页 " 映射到 ” 物理内存页 " ; 三、共享内存 ---- 内存映射共享内存 关系 : 文件映射 : 在进程间的 " 共享内存 " 就是使用...共享的 " 文件映射 " 实现的 ; 匿名映射 : " 匿名映射 “ 一般是 ” 私有映射 " , 一般不作为 " 共享内存 " 使用 , 如果两个进程之间 共享 匿名映射 , 只能是 父子进程之间...才可以 ; 如果修改了 进程间的 " 共享内存 " 对应的 " 文件映射 " , 修改后不会立刻更新到文件中 , 调用 msync 函数 , 强制同步写入到文件中 ; 四、进程内存段的内存映射类型

8.2K20

Linux的内存共享映射(mmap和munmap)

Linux下的进程间通信也可以使用mmap的内存共享映射来实现,mmap的作用就是把磁盘文件的一部分直接映射到进程的内存中,那么进程就可以直接对该内存文件进行操作,mmap也设置了两种机制...:共享和私有,如果是共享映射,那么在内存中对文件进行修改,磁盘中对应的文件也会被修改,相反,磁盘中的文件有了修改,内存中的文件也被修改。...如果是私有映射,那么内存中的文件是独立的,二者进行修改都不会对对方造成影响。...通过这样的内存共享映射就相当于是进程直接对磁盘中的文件进行读写操作一样,那么如果有两个进程来mmap同一个文件,就实现了进程间的通信。...如果在运行中出现Bus error (core dumped)错误,需要考虑共享文件是否有存储空间(也就是说你要mmap一个4096的文件,但实际文件没有4096那么大)。

7.8K30

【Linux 内核 内存管理】引导内存分配器 bootmem ③ ( bootmem 引导内存分配器算法 | 低端内存映射 | 内存记录位图 | 最先适配算法 | 内存分配记录 | 内存操作函数 )

文章目录 一、bootmem 引导内存分配器算法 1、低端内存映射 2、内存记录位图 3、最先适配算法 4、内存分配记录 二、bootmem 引导内存分配器 内存操作 函数 ( alloc_bootmem...| free_bootmem ) 一、bootmem 引导内存分配器算法 ---- bootmem 引导内存分配器算法 ; 1、低端内存映射 低端内存映射 : 内核启动过程中 , 将 " 低端内存 "...交给 " 引导内存分配器 " 管理 , 低端内存 可以 直接映射到 内核虚拟地址空间 对应的 物理内存 ; 2、内存记录位图 内存记录位图 : 引导内存分配器 中 , 使用 " 位图 " 记录 物理页..." 位图 " , 找到 满足 内存需求大小 的 第一块 空闲的内存块 ; 4、内存分配记录 内存分配记录 : 为了有效利用内存 , " 引导内存分配器 " 支持小于 1 页的内存块分配 , bootmem_data...直接在该 物理页 上分配内存 ; 二、bootmem 引导内存分配器 内存操作 函数 ( alloc_bootmem | free_bootmem ) ---- " bootmem 引导内存分配器 "

3.3K10

【Linux 内核 内存管理】内存管理系统调用 ⑤ ( 代码示例 | 多进程共享 mmap 内存映射示例 )

文章目录 一、进程一描述 二、进程二描述 三、mmap 进程共享内存展示 一、进程一描述 ---- 在上一篇博客 【Linux 内核 内存管理】内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射...| munmap 删除内存映射 ) 中 , 完成了 进程一 的程序 , 在该进程中 , 创建并打开文件 , 为该文件设置大小 , 使用 mmap 创建 " 文件映射 " , 并通过直接访问内存的方式...; 二、进程二描述 ---- 进程二 的源码 , 与上一篇博客 【Linux 内核 内存管理】内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 ) 中 进程一..., 该内存页的内容可以 读取 写入 // MAP_SHARED : 指定映射关系 , 指的是该映射是进程的共享内存空间 // fd : 文件描述符 , 被映射的文件 //...mmap_demo_02.c 文件中 , 执行 gcc mmap_demo_02.c -o mmap_demo_02 命令 , 编译该源码 , 编译出的可执行文件为 mmap_demo_02 ; 三、mmap 进程共享内存展示

3.5K30

采用共享内存或文件映射的方式保存用户数据

[采用文件映射的解决方案]    下面介绍另一种解决方案给大家,那就是使用共享内存或文件映射的方式进行保存(重要不可丢失的数据,采用文件映射+DB的方式,而访问量高但是可丢的数据可以采用共享内存的方式)...更进一步,我们可以把这个数组mmap到一个文件中,这样,每次查询的时候,无论是单查还是批量查询,其实都是在查询共享内存,通过下标直接索引的方式,效率非常高,由于写操作比较少,所以刷文件的次数也很少,对磁盘...[面临的一些其它问题]    这种文件映射存储用户数据的方式,可以广泛应用于现在的互联网应用中。...这种方案的思想是,尽可能把所有用户数据粒度细化,保存在一台机器中,由于现在64位机器,最大可提供的内存到了32G,给用户进程使用的空间还是很大的,基本可以满足需求。...[总结] 这种文件映射的思想可以广泛应用于互联网,特别上SNS应用中,不仅效果好,也可以大大节省了服务器成本,更多的应用场景值得我们继续挖掘。

72120

跨平台协程库 - libcopp 简介

因为我觉得现代C++的很多工具对我们排除一些初级错误很有帮助(比如 static_assert ),所以在实现 libcopp 的过程中,我们是会检测环境并且尽可能地使用 C++ 的一些新特性来优化性能或是规避问题...,包括 通过malloc分配 、 mmap/unmap(Windows下是VirtualAlloc/VirtualFree) 、 自定义指定内存地址的分配器 、 Linux下的动态增长栈分配器 和 动态栈池分配器...其实在 libcopp 里如果选择使用 通过malloc分配 或者 自定义指定内存地址的分配器 也不会有这个问题。...这时候这个问题就凸显出来了,因为每次分配的时候都重新建立地址映射,那么物理页肯定就被释放了。 为了解决这个问题,我们就写了一个 动态栈池分配器 。...而之所以是 动态 的是因为我们项目中一台机器上可能会搭建很多测试环境,这些环境往往都是低负载、版本不同且提供给很多不同的人用的,所以可以减少低负载服务的内存占用,并且尽可能多地利用好已有 内存映射的逻辑地址

3.2K10

协程框架(libcopp)v2优化、自适应栈池和同类库的Benchmark对比

libcopp v2内存布局 开发libcopp v2版本的最大目的是优化allocator的接口和内存碎片。 原来的allocator虽然是可定制的,但是是内置的。...同时栈分配器也可以是多种选择,采用系统地址映射加保护帧、采用malloc或者自定义分配器。...我们知道在Linux中,在内存地址被实际使用前,是不会有物理内存映射进来的。...在第一次访问未映射地址的时候(特别是协程第一次切入到执行栈),会触发一次缺页中断,然后由操作系统把实际物理页映射上去,然后再继续执行。这个缺页中断引起的开销是其他协程创建流程总和的大约10倍左右。...(cached)/2GB(free) CMake 3.11.3 GCC版本 8.1.0 Golang版本 1.10.2 (20180216) Boost

81830

协程框架(libcopp)v2优化、自适应栈池和同类库的Benchmark对比

libcopp v2内存布局 开发libcopp v2版本的最大目的是优化allocator的接口和内存碎片。 原来的allocator虽然是可定制的,但是是内置的。...同时栈分配器也可以是多种选择,采用系统地址映射加保护帧、采用malloc或者自定义分配器。...我们知道在Linux中,在内存地址被实际使用前,是不会有物理内存映射进来的。...在第一次访问未映射地址的时候(特别是协程第一次切入到执行栈),会触发一次缺页中断,然后由操作系统把实际物理页映射上去,然后再继续执行。这个缺页中断引起的开销是其他协程创建流程总和的大约10倍左右。...2.86GB(used)/2.84GB(cached)/2GB(free) CMake 3.11.3 GCC版本 8.1.0 Golang版本 1.10.2 (20180216) Boost版本(libgo

54310

Boost.Lockfree官方文档翻译

从操作系统分配内存不是无锁的。这使得不可能实现真正动态大小的无阻塞数据结构。boost.lockfree中基于节点的数据结构使用内存池来分配内部节点。...如果内存池被耗尽,新节点的内存就需要从操作系统中分配。但是所有boost.lockfree中的数据结构都能配置为避免内存分配(相对应的,某些调用将失败)。这对那些需要无锁内存分配的实时系统特别有用。...定义分配器boost.lockfree支持具状态分配器,并且与Boost.Interprocess的分配器兼容。...无锁数据结构的内存管理是一个不平凡的问题,因为我们需要避免一个线程释放了一个内部节点,但另一个线程仍然在使用它的情况。Boost.lockfree使用了一个简单的方法不归还任何内存至操作系统。...这样做是出于两个原因:首先,依赖于内存分配器的实现释放内存,可能会阻塞(因此该实现将不再无锁),其次,大多数内存回收算法都是具有专利的。

38330

Boost.Lockfree官方文档

内存分配 从操作系统分配内存不是无锁的。这使得不可能实现真正的动态大小的非阻塞数据结构。 boost.lockfree基于节点的数据结构使用内存池分配内部节点。...如果此内存池已用完,则必须从操作系统分配用于新节点的内存。但是,可以配置boost.lockfree的所有数据结构来避免内存分配(相反,特定的调用将失败)。这对于需要无锁内存分配的实时系统特别有用。...boost::lockfree::capacity 在编译时设置数据结构的容量。 这意味着数据结构是固定大小的。 boost::lockfree::allocator 定义分配器。...boost.lockfree支持状态分配器,并且与Boost.Interprocess分配器兼容。 示例 队列 boost::lockfree::queue类实现了一个多写入器/多读取器队列。...这样做有两个原因:首先,取决于内存分配器的实现,释放内存可能会阻塞(因此该实现将不再是无锁的),其次,大多数内存回收算法均已申请专利。 ABA预防 ABA问题是实现无锁数据结构时的常见问题。

1.9K20

【Linux 内核 内存管理】内存管理架构 ③ ( Linux 内核中的内存管理模块 | 页分配器 | 不连续页分配器 | 内存控制组 | 硬件设备内存管理 | MMU | 页表缓存 | 高速缓存 )

文章目录 一、Linux 内核中的内存管理模块 二、硬件设备内存管理 一、Linux 内核中的内存管理模块 ---- Linux 内核还需要处理如下内容 : ① 页错误异常处理 ② 页表管理 ③ 引导内存分配器...: 页分配器 , 块分配器 , 不连续页分配器 , 连续内存分配器 , 每处理器内存分配器 ; " 页分配器 " 负责分配 内存物理页 , 使用的是 " 伙伴分配器 " ; " 不连续页分配器 " 提供了...vmalloc 函数 用于分配内存 , vfree 函数 用于 释放内存 ; 申请的 " 不连续物理页 “ 可以 映射到 ” 连续的虚拟页 " ; ④ 内存碎片整理 ⑤ 内存耗尽处理 ⑥ 内存控制组...回收内存 ; ⑦ 页回收处理 二、硬件设备内存管理 ---- 硬件设备内存管理 : ① CPU 处理器 中的 " 内存管理单元 " ( MMU ) 和 高速缓存 ; ② 物理内存 在 " 内存管理单元..." ( MMU ) 中 , 还有一个 " 页表缓存 " ; 页表缓存 中缓存了 最近使用的 " 页表映射 “ , 该映射的作用是 将 ” 物理地址 " 映射为 " 虚拟地址 " ; CPU 处理器

1.4K40

OpenResty 和 Nginx 如何分配和管理内存

操作系统为每个进程分配和管理虚拟内存,并将实际使用的虚拟内存页,映射到物理内存页上去(比如 DDR4 内存条等设备里的)。...只要这个进程没有在这个巨大的虚拟内存空间中读写很多内存页,就不会有任何问题。 这部分实际映射到物理内存设备上的虚拟内存空间,才是我们真正需要关注的。...Nginx 核心及其模块也通过这个系统分配器分配内存(有一个例外是 Nginx 的共享内存区域,我们后面会讲到)。...这些共享内存是通过 UNIX 系统调用 mmap() 直接分配的,因此完全绕过了标准 C 运行时库的分配器。 Nginx 共享内存是所有 Nginx 工作进程之间共享的。...这些用户仍会看到系统分配器内存用量和 Nginx 共享内存区域的使用量,偶尔也会涉及一些其他内存分配器。 OpenResty XRay 仍然可以用于直接检查和分析这些服务器进程,甚至在生产环境。

1.4K10

【Linux 内核 内存管理】内存管理系统调用 ② ( mmap 创建内存映射 | mmap 创建内存映射 与 malloc 申请内存对比 | mmap 创建内存映射 与 普通文件操作对比 )

4、mmap 创建内存映射 二、mmap 创建内存映射 与 普通文件操作 对比 一、mmap 创建内存映射 与 malloc 申请内存对比 ---- 1、malloc 函数原型 C 标准库 stdlib.h..." , glibc 库 的 " 内存分配器 " ptmalloc , 负责调用 系统接口层 的 brk sbrk mmap munmap 等系统调用 申请内存 ; ② 系统调用 : 用户空间 的 内存管理函数...小于 划分阈值 , glibc 库 的 ptmalloc " 内存分配器 " 会使用 brk 系统调用 , 向 Linux 内核申请内存 ; 使用 mmap 系统调用 : 如果 应用程序 申请的内存大小...大于等于 划分阈值 , glibc 库 的 ptmalloc " 内存分配器 " 会使用 mmap 系统调用 , 向 Linux 内核申请内存 ; 4、mmap 创建内存映射 mmap 可以直接向 Linux..." 文件映射 “ 类型的 ” 内存映射 “ , 进而实现了 ” 共享内存操作 " ;

6.1K20

libcopp的线程安全、栈池和merge boost.context 1.64.0

另外栈池使用模板实现了,因为希望能够自定义池子里没有对象时的分配策略,并且能使用之前的栈分配器。所以模板的参数就是原来的分配器的类型。...然后这次的merge里我看到的CHANGELOG里有关于MinGW的修复,所以就去看了下他改了什么,结果发现其实是一个非常2B的错误(写错了一个寄存器名字)。...我思考了一下,虽然当时做了很多软件工程上的预留(比如允许共享action之类)。...但是实际使用过程中,这些预留很多都没有必要,未来会考虑移除这些预留,并且和boost.context的call/cc一样直接分配在栈上,这样能进一步减少内存碎片,不过这个优化会导致结构变化和部分API向前不兼容...大致的思路就是尽可能把这些数据保存在栈里,不需要额外分配,这样就减少了内存碎片,也同时减少malloc的负担。

71510
领券