码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 共享内存区


    共享内存区

    • 一、概述
      • 二、mmap函数
        • 三、munmap函数
        • 四、msync函数
        • 四、为何使用mmap
        • 五、在内存映射文件中给计数器持续加1
        • 六、文件映射
    • 1.私有文件映射
      • 2.共享文件映射
        • 3.内存映射I/O
        • 七、匿名映射
        • 八、重新映射一个映射区域:mremap函数
        • 九、非线性映射:remap_file_pages函数

    一、概述

    • 共享内存区是可用IPC形式中最快的。一旦这样的内存区映射到共享它的进程的地址空间,这些进程间数据的传递就不再涉及内核。

      • 往该共享内存区存放信息或从中取走信息的进程间通常需要某种形式的同步,各种形式的同步:互斥锁、条件变量、读写锁、记录锁、信号量。

    实现共享内存实现客户-服务器文件复制程序中涉及的步骤:

    1. 服务器使用一个信号量取得访问某个共享内存区对象的权利。
    2. 服务器将数据从输入文件读入到该共享内存区对象。read函数的第二个参数所指定的数据缓冲区地址指向这个共享内存区对象。
    3. 服务器读入完毕时,使用一个信号量通知客户。
    4. 客户将这些数据从共享内存区对象写出到输出文件中。

    在这里插入图片描述
    此程序只复制两次,一次从输入文件到共享内存区,另一次从共享内存区到输出文件。

    二、mmap函数

    mmap函数把一个文件或一个Posix共享内存对象映射到调用进程的地址空间。使用该函数的三个目的:

    1. 使用普通文件以提供内存映射I/O。
    2. 使用特殊文件以提供匿名内存映射。
    3. 使用shm_open以提供无亲缘关系进程间的Posix共享内存区。
    #include
    void *mmap(void *addr,size_t len,int port,int flags,int fd,off_t offset);
    //addr:指定描述符fd应被映射到进程内存空间的起始地址,通常指定为空指针,自己选择地址。
    //len:映射到调用进程地址空间中的字节数,从被映射文件开头起第offset个字节出开始。
    //offset通常设置为0。
    

    在这里插入图片描述
    内存映射区的保护由prot参数指定,属性值如下:读写模式PROT_READ|PORT_WRITE。

    在这里插入图片描述

    flags属性值如下图所示:
    在这里插入图片描述

    在这里插入图片描述

    1. MAP_SHARED或MAP_PRIVATE这两个标志必须指定一个并可有选择地或上MAP_FIXED。

    2. 若指定了MAP_PRIVATE,则调用进程对被映射数据所作的修改只对该进程可见,而不改变其底层支撑对象(或者是一个文件对象,或者是一 个共享内存区对象)。

    3. 若指定了MAP_SHARED,则调用进程对被映射数据所作的修改对于共享该对象的所有进程都可见,而且确实改变了其底层支撑对象。

    4. 移植性上考虑,MAP_FIXED不应该指定

    5. 若没有指定该标志,但是addr不是一个空指针,那么addr如何处置取决于实现。

    6. 不为空的addr值通常被当作有关该内存区应如何具体定位的线索。

    7. 可移植的代码应把addr指定成 一 个空指针,并且不指定MAP_FIXED。

    父子进程之间共享内存区的方法之 一 :父进程在调用fork前先指定MAP_SHARED调用mmap。Posix.1保证父进程中的内存映射关系存留到子进程中。而且父进程所作的修改子进程能看到,反过来也 一 样。

    三、munmap函数

    此函数从某个进程的地址空间删除一个映射关系。

    #include
    int munmap(void *addr,size_t len);
    //addr:mmap返回的地址
    //len:映射区的大小。
    
    1. 再次访问这些地址将导致向调用进程产生一个SIGSEGV信号。

    2. 若被映射区是使用MAP_PRIVATE标志映射,则调用进程对它所作为的变动都会被丢弃。

    四、msync函数

    1. 内核的虚拟内存算法保持内存映射文件( 一 般在硬盘上)与内存映射区 (在内存中)的同步,前提是它是 一 个MAP_SHARED内存区。

    2. 若修改了处于内存映射到某个文件的内存区中某个位置的内容,那么内核将在稍后某个时刻相应地更新文件。

    3. 确信硬盘上的文件内容与内存映射区中的内容 一 致,于是调用msync来执行这种同步。

    #include
    int msync(void *addr,size_t len
  • 相关阅读:
    LabVIEW性能和内存管理 6
    Qt第六十六章:展示数据的标签
    软考高级(信息系统项目管理师)高频考点-项目管理计划
    python---生成器表达式
    华为机试真题 C++ 实现【猴子爬山】
    共模干扰、差模干扰 以及运放共模抑制比(Common-mode rejection ratio, CMRR)
    21天学Python --- 打卡7:Spider爬虫入门
    『亚马逊云科技产品测评』活动征文|AWS 云服务器 EC2 实例类型及其适用场景详细说明
    pdd.order.list.get拼多多店铺订单列表查询接口(店铺订单详情接口,订单明文接口,订单解密接口,订单插旗接口,订单备注接口)代码对接教程
    GcExcel:Java 应用创建、修改和保存 Excel 电子表格 -Crack
  • 原文地址:https://blog.csdn.net/weixin_50866517/article/details/127110685
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号