首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏零拷贝技术

    3、mmap(内存映射、共享

    mmap:内存映射(内存、用户缓冲区共享一块映射数据) 直接将磁盘文件数基于DMA引擎拷贝据映射到内核缓冲区,同时用户缓冲区是跟内核缓冲区共享一块映射数据, 建立映射后,不需要从内核缓冲区拷贝到用户缓冲区 mmap:产生4次用户上下文切换,3次拷贝。 mmap() 系统调用函数会直接把内核缓冲区里的数据映射到用户空间,这样,操作系统内核与用户空间共享缓冲区,就不需要再进行任何的数据拷贝操作。 接着,应用进程跟操作系统内核「共享」这个缓冲区;2、第二次拷贝:应用进程再调用 write(),操作系统直接将内核缓冲区的数据拷贝到 socket 缓冲区中,这一切都发生在内核态,由 CPU 来搬运数据 ;3、第三次拷贝:最后,把内核的 socket 缓冲区里的数据,拷贝到网卡的缓冲区里,这个过程是由 DMA 搬运的。

    61100编辑于 2024-03-10
  • 来自专栏nginx遇上redis

    nginx共享内存共享内存的实现

    我们知道,如果我们的模块中要使用一个共享内存,需要调用ngx_shared_memory_add来创建共享内存。 而ngx_shared_memory_add不会马上创建一个共享内存,它是先登记一下共享内存的使用信息,比如名称、大小等,然后在进程初始化的时候再进行共享内存的创建与初始化。 两个相同名字的共享内存大小要一样。 2. 两个相同名字的共享内存tag要一样。 3. 如果当前共享内存已经存在,则不需要再次添加。会返回同一个共享内存 4. 我们看到,在对每一个共享内存,先调用ngx_shm_alloc创建共享内存,然后调用ngx_init_zone_pool对共享内存进行初始化,然后调用我们自己添加的共享内存init函数。 NGX_ERROR; } // 初始化slab分配器 sp->end = zn->shm.addr + zn->shm.size; sp->min_shift = 3;

    5.3K30发布于 2019-10-15
  • 来自专栏编程语言的世界

    php共享内存,php共享内存的使用

    $shmop) {    throw new Exception('创建共享内存失败');}//(1.3).向内存写入数据$text = 'A:大家好,我是A进程,我创建的内存空间啊,欢迎大家一起来耍啊 shmop_write($shmop, $text, 0)) {    throw new Exception('共享内存写入数据失败');}//(1.4).用完关闭资源(并不会清除内存数据,只关闭资源句柄 $shmop) {    throw new Exception('打开共享内存失败');}//(2.2).从内存读取数据$data = shmop_read($shmop, 0, 1024);file_put_contents PHP_EOL;//(2.3).删除共享内存.不需要close.直接删除shmop_delete($shmop);(3).注意事项通过ipcs -m 命令可以查看已经创建的共享内存通过ipcrm -M key 命令可以删除通过shm_key创建的共享内存共享内存不会因为进程退出而丢失,会一直存在系统中,除非删除它

    1.8K30编辑于 2023-06-03
  • 来自专栏全栈程序员必看

    共享内存同步机制_共享内存通信机制

    共享内存是System V版本的最后一个进程间通信方式。共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。 不同进程之间共享内存通常为同一段物理内存。进程可以将同一段物理内存连接到他们自己的地址空间中,所有的进程都可以访问共享内存中的地址。 如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。 共享内存的接口函数以及指令 1.查看系统中的共享存储段 ipcs -m 2.删除系统中的共享存储段 ipcrm -m [shmid] 3.shmget ( ):创建共享内存 int shmget(key_t 5.shmdt ( ):去关联共享内存 当一个进程不需要共享内存的时候,就需要去关联。该函数并不删除所指定的共享内存区,而是将之前用shmat函数连接好的共享内存区脱离目前的进程。

    2.6K40编辑于 2022-11-01
  • 来自专栏编程技术专栏

    POSIX共享内存

    如下图所示: image.png 共享内存也是一种IPC,它是目前可用IPC中最快的,它是使用方式是将同一个内存区映射到共享它的不同进程的地址空间中,这样这些进程间的通信就不再需要通过内核,只需对该共享内存区域进程操作就可以了 ,和其他IPC不同的是,共享内存的使用需要用户自己进行同步操作。 对shm_open创建的POSIX共享内存区对象进程内存映射,以供无亲缘进程间进行通信。 - 1]:"<<(int)memPtr[4096 * 3 - 1]<<endl; cout<<"[4096 * 3]:"<<(int)memPtr[4096 * 3]<<endl; 基于mmap的POSIX共享内存 上面介绍了通过内存映射文件进行进程间的通信的方式,现在要介绍的是通过POSIX共享内存区对象进行进程间的通信。

    3.5K10发布于 2019-08-31
  • 来自专栏逆向技术

    Win3内存管理之私有内存共享内存的申请与释放

        一丶内存简介私有内存申请   通过上一篇文章.我们理解了虚拟内存与物理内存的区别. 那么我们有API事专门申请虚拟内存与物理内存的. 有私有内存共享内存. 私有内存的意思就是这块内存申请只在本进程的物理页当中. 共享内存就是这个物理页 A B两个进程都可以使用. 并没有进0环(内核) 二丶共享内存申请 1.共享内存申请   共享内存其实就是物理页可以共享使用了. A进程申请物理页往这个物理页填写内容. B进程就可以读取了. 我们具体的API   1. 进程共享物理页的名字.如果希望这个物理页B进程可以使用则需要给一个名字. ; 3.取消关联 BOOL UnmapViewOfFile( LPCVOID lpBaseAddress // starting address); 虚拟地址 关闭物理页映射则使用CloseHandle

    1.7K20发布于 2018-09-28
  • 来自专栏猿人谷

    unix共享内存要点

    2.随内核持续     *nix的共享内存有两套API:Posix和System V     两者的主要差别是共享内存的大小         1.Posix共享内存大小可通过函数ftruncate随时修改         2.System V共享内存大小在创建时就已经确定,而且最大值根据系统有所不同     Posix共享内存     #include <sys/mman.h>  (mmap,munmap mmap将句柄作为共享内存的底层支撑对象,映射到内存中,这样可以不通过read、write在进程之间共享内存。由此推测一下,在*nix的进程间传 递数据更加原始的方法是进程间读写一个文件。 V的共享内存有大小的限制,所以可考虑,使用共享内存数组来解决这个问。 虽然数组的大小即一个进程可以获取共享内存的数量也是有限制,但是可以缓解System V单个共享内存过小的问题。

    1.2K50发布于 2018-01-17
  • 来自专栏深入理解Android

    Android匿名共享内存

    ashmem的使用流程如下: 1.ashmem_create_region创建匿名共享内存区域,本质是调用open系统调用 2.ioctl设置共享内存的名字和大小,设置的名字为/dev/ashmem/ ,名字的存在就为了能够让其他人找到目标 3.mmap映射文件中的虚拟内存以及物理内存 4.直接对着这一块地址区域读写。 Binder的mmap时候已经通过伙伴系统绑定了物理页和虚拟内存之间的联系,而Ashmem则是通过缺页中断,调用相关的函数才进行绑定。 Ashmem就是打通一块大的内存通道方便进程之间通信大数据。而Binder更加倾向小规模的指令,并且这种指令有明确的方向和顺序,保证每一个指令的可靠性。

    1.2K20编辑于 2022-06-22
  • 来自专栏又见苍岚

    Python - mmap 共享内存

    python的mmap库提供了共享内存的实践方案可以完成信息在内存间交互。 简介 共享内存 内存共享是两个不同的进程共享内存的意思:同一块物理内存被映射到两个进程的各自的进程地址空间。 当需要写入时,找到内存名称,然后写入内存,等需要读取时候, 首先要知道你要读取多大(因为物理内存比你要读取的东东大,全部读取的话会读到一些“空”的东西),然后寻找对应名称的物理块,然后读取,就是这么简单 flags:MAP_PRIVATE:这段内存映射只有本进程可用;mmap.MAP_SHARED:将内存映射和其他进程共享,所有映射了同一文件的进程,都能够看到其中一个所做的更改; **prot:* 使用示例 写入数据进共享内存 import ctypes import mmap # 核心库 import os import struct import numpy as np # 创建内存映射文件句柄 buf.flush(0, 100) # 关闭 buf.close() 从共享内存中读取数据 import mmap import os import struct import cv2 import

    2.3K30编辑于 2022-08-04
  • 来自专栏乐意学点小编程

    【Linux】systemV共享内存

    由于同一时间可能有多组进程进行通信,所以系统当中可能存在多个共享内存块,所以操作系统要把这些内存管理起来,所以内核中会有一个结构体来描述共享内存 二、系统调用接口 1、申请共享内存 (一)key的获取 在调用shmget函数时,虽然创建或获取了共享内存段的标识符,但进程还不能直接访问该共享内存,只有通过shmat函数将共享内存段附加到进程的地址空间后,进程才能像访问普通内存一样访问共享内存段中的数据 SHM_ANON 匿名共享内存 部分系统支持该标志,用于创建匿名共享内存段,此时 shmid 参数会被忽略,可结合 shmaddr 使用,常用于父子进程间的内存共享 3、将内存共享段与当前进程脱离 结构体中的值来更新与 shmid 关联的共享内存段的部分状态信息,可以更新的信息包括共享内存段的所有者、权限等 IPC_RMID 删除共享内存段 标记与 shmid 关联的共享内存段为删除状态,当最后一个使用该共享内存段的进程分离它之后 3、processb.cpp #include "comm.hpp" int main() { //调用GetShm函数获取一个共享内存段的标识符shmid //在参数相同、无特殊情况的情况下,

    1.7K10编辑于 2025-03-25
  • 来自专栏若是烟花

    C语言共享内存

    共享内存是进程间通信中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。 参考资料: 共享内存 linux进程间的通信(C): 共享内存 共享内存特点 共享内存是进程间共享数据最快的方法 一个进程向共享内存写入数据,共享这个内存区域的所有进程就可以立即看到其中的内容。 使用共享内存需要注意的是多进程之间对一个给定存储区访问的互斥 若一个进程正在向共享区写数据,则在它操作完成之前,其他的进程不应当去读、写这些数据。 , char *argv[]) { // 共享内存的shmid int shmid; // 共享内存的key key_t key; char *shmadd; shmadd = shmat(shmid, NULL, 0)) < 0) { perror("shmat error."); exit(-1); } // 拷贝共享数据到共享内存

    4.9K20发布于 2020-07-27
  • 来自专栏王亚昌的专栏

    UNIX共享内存总结

        共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。 进程间通讯-生产者消费者模式     生产者进程和消费者进程通讯常使用共享内存,比如一个网络服务器,接入进程收到数据包后,直接写到共享内存中,并唤醒处理进程,处理进程从共享内存中读数据包,进行处理。 父子进程间通讯     由于fork产生的子进程和父进程不共享内存区,所以父子进程间的通讯也可以使用共享内存,以POSIX共享内存为例,父进程启动后使用MAP_SHARED建立内存映射,并返回指针ptr 这样父、子进程便共享了ptr指向的内存区。 3. 比较好的解决办法是,由一个进程负责把配置文件加载到共享内存中,然后所有需要这份配置的进程只要使用这个共享内存即可。 【共享内存分类】 1.

    2.8K40发布于 2018-08-03
  • 来自专栏Java架构师必看

    PHP共享内存

    在asp.net和java中都有共享内存,php除了可以使用Memcached等方式变通以外其实php也是支持共享内存的!

    1.7K20发布于 2021-03-22
  • 来自专栏猿人谷

    unix共享内存要点

    2.随内核持续     *nix的共享内存有两套API:Posix和System V     两者的主要差别是共享内存的大小         1.Posix共享内存大小可通过函数ftruncate随时修改         2.System V共享内存大小在创建时就已经确定,而且最大值根据系统有所不同     Posix共享内存     #include <sys/mman.h>  (mmap,munmap mmap将句柄作为共享内存的底层支撑对象,映射到内存中,这样可以不通过read、write在进程之间共享内存。由此推测一下,在*nix的进程间传 递数据更加原始的方法是进程间读写一个文件。 V的共享内存有大小的限制,所以可考虑,使用共享内存数组来解决这个问。 虽然数组的大小即一个进程可以获取共享内存的数量也是有限制,但是可以缓解System V单个共享内存过小的问题。

    1.1K100发布于 2018-01-17
  • 来自专栏Initial programming

    初识Linux · 共享内存

    那么新的问题来了:是否存在多个共享内存?如果存在多个共享内存,那么OS是否有必要对共享内存进行管理?如果要实施管理,OS是如何进行管理的? 所以我们得出一个结论,共享内存 = 共享内存的数据 + 共享内存的属性!! 那么我们现在就可以直接进入到了代码部分了。 对于第一种模式,IPC_CREAT,代表的是如果创建的共享内存不存在,就创建,如果存在共享内存,就获取该共享内存并返回,说白了就是总能够获取一个共享内存,但是不一定是全新的。 最后一个参数,key,我们首先思考一个问题,开辟了共享内存之后,进程通过什么方式知道共享内存呢? 因为进程之间使用共享内存是要进行挂接的,也就是将共享内存的地址給进程。 那么我们得知道地址吧? shmid:这是由shmget函数返回的共享内存对象的系统标识符。

    1.9K10编辑于 2024-11-19
  • 来自专栏linux驱动个人学习

    内存页面共享-KSM

    一、KSM概述 KSM的全称是 Kernel Samepage Merging,主要应用在虚拟化环境中,它允许内核通过合并内存页面来节省内存,从来可以增加虚拟机的并发数据。 上层的应用通过 madvise() 给某内存区域增加 MADV_MERGEABLE 或者 MADV_UNMERGEABLE 标记,造成对系统调用的访问,该系统调用由 SYSCALL_DEFINE3(madvise SYSCALL_DEFINE3 在这里会进行一个预处理,如找到该内存区域的所有VMA,并调用 madvise_vma 进行进一步处理。 vma->vm_flags = new_flags; out: return error; } ksm_madvise 在这一步会找到 vma 所属进程(mm),并判断标记决定是否对页面进行共享 如果需要共享,调用 __ksm_enter()并传递当前 vma 所属的 mm 地址。

    2.6K51发布于 2020-08-28
  • 来自专栏行走的机械人

    一文详解共享内存-附带QT共享内存Demo实现

    共享内存允许两个不相关的进程访问同一个逻辑内存共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。 但从上解释可以看出,共享内存需要做到进程间的信息同步,但共享内存本身是没有这种功能的,所以共享内存实现进程间通信常常搭配信号量来使用。 3共享内存的使用流程 看完上面的概念肯定是无法理解的。下面我们举一个例子的流程。 现在Read光知道共享内存的名字了,但它还不知道共享内存的逻辑地址,所以需要同attach(链接)将Read与共享内存链接在一起。 这时Read就可以读取共享内存了。 当读取完共享内存后,需要detach将该进程与共享内存分离。否则当其它进程想要访问这块共享内存时,就会attach失败。

    3.5K30编辑于 2022-09-19
  • 来自专栏存储公众号:王知鱼

    H3:CXL 内存共享架构与解决方案

    CXL内存应用:内存数据库和AI应用 3. CXL内存系统:硬件和软件规格 4. CXL实现:CPU、CXL交换机、CXL内存和操作系统 5. 软件功能 FALCON C5022 Fabric Manager • 可组合的主机间内存共享内存动态添加和移除 • CXL端口配置到主机或设备端口 • 可配置的主机内存地址 • 链接能力和状态 Management VCS 模式解决方案在 CXL 2.0 和后续版本中被引入,用于改进内存访问效率和资源分配灵活性,尤其是在多主机共享内存或设备资源的环境中。 • 数据中心资源共享:支持多个服务器节点在同一平台上共享内存模块,降低硬件成本并提高内存利用率。 Memory Modular(CXL 内存模块) • E3.S 是标准的外形规格,但高密度的 E3.S 成本过高。

    1.1K10编辑于 2025-02-11
  • 来自专栏萌新的日常

    【Linux】system V 共享内存

    可以,其他进程也可以通信 所以在任何时刻,可能有多个共享内存在被使用 系统中一定会存在很多共享内存同时存在 操作系统要不要整体管理所有的共享内存呢?要 操作性系统如何管理多个共享内存呢? 先描述,在组织 并不是在内存中开辟空间即可,系统为了管理共享内存,构建对应的描述共享内存的结构体对象 共享内存=共享内存的内核数据结构(伪代码:struct shm)+真正开辟的内存空间 2. 创建共享内存 获取共享内存 创建共享内存,调用shmget函数,通过两个选项 若共享内存不存在则创建,若存在则报错 而获取共享内存,调用shmget函数,则返回已有的共享内存 ---- 此时运行可执行程序 ,发现server与client的shmid(共享内存标识符)相同 3. / 3.将自己和共享内存关联起来 char*start=attachshm(shmid); //通信 //4.

    1.6K20编辑于 2023-10-16
  • 来自专栏C++与Linux的学习之路

    Linux进程通信——共享内存

    共享内存 原理与概念 两个进程的PCB创建虚拟地址空间然后映射到物理内存中,每个进程因为是独立的,所以在物理内存中的地址也不同。 那么共享内存是怎么做到的呢? 这里共享内存也是一样的,OS要先描述再组织,才能进行管理,每次申请一块共享内存,OS还会给这块共享内存申请一个数据结构对象。 所以:共享内存 = 物理内存快 + 共享内存的相关属性 OS管理的是对这个共享内存的数据结构对象做管理的。 那么在创建共享内存的时候,如何保证共享内存在OS中是唯一的呢?答案就是key。 nullptr) == -1) { std::cerr << errno << ":" << strerror(shmid) << std::endl; exit(3) nullptr) == -1) { std::cerr << errno << ":" << strerror(shmid) << std::endl; exit(3)

    6.9K30编辑于 2023-05-03
领券