初步认识共享内存(并不全面)

2024-06-22 19:58

本文主要是介绍初步认识共享内存(并不全面),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

共享内存是系统处于多个进程之间通讯的考虑,而预留的一块内存区。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据的传递就不再涉及内核(即进程不再通过执行任何进入内核的系统调用来彼此传递数据).共享内存是最高效的IPC机制,因为它不涉及进程之间的任何数据传输。

两个不同进程A和B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到B对共享内存中的数据的更新。
     当然,既然是共享,必然需要某种共享机制,互斥锁、信号量等
共享内存方式,进程可以直接读取内存,而不需要数据的拷贝,因此速度挺快。


举个例子,【客户服务器文件复制程序】(即同一系统中一个进程读source文件数据发送给另一个进程写道destination文件中)中的通常步骤:
    1、服务器从输入文件读,该文件的数据由内核读入自己的内存空间,然后从内核复制到服务器进程
    2、服务器往一个管道、FIFO或消息队列以一条消息的形式写入这些数据。这些IPC形式通常需要把这些数据从进程复制到内核。
    3、客户从该IPC通道读出这些数据,这通常需要把这些数据从内核复制到进程
    4、最后,将这些数据从由write函数的第二个参数指定的客户缓冲区复制到输出文件


这里总共需要四次数据复制,而且这四次是在内核和进程间进行的,往往开销很大
然而,通过让两个或两个以上进程共享一个内存区,就绕过了上述的问题。当然,这些进程必须协调或同步对该共享去内存的使用。
因此,现在步骤如下:
    1、服务器使用(譬如)一个信号量取得访问某个共享内存区对象的权力。
    2、服务器将数据从输入文件读入到共享内存区对象。read函数的第二个参数指向这个共享内存区对象
    3、服务器读入完毕时,使用一个信号量通知客户
    4、客户将这些数据从该共享内存区对象写出到输出文件中



从这里看出,总共复制了两次,即从文件到共享内存区和从共享内存区到文件
要强调的是,默认情况下通过fork派生的子进程并不与其父进程共享内存区



void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);
//mmap函数把一个文件或者一个POSIX共享内存区对象映射到调用进程的地址空间
//使用此函数有3个目的:
//1、使用普通文件以提供内存映射I/O
//2、使用特殊文件以提供匿名内存映射
//3、使用sem_open以提供无亲缘关系进程间的POSIX共享内存区
//其中addr可以指定描述符被映射到的进程内存空间的起始地址,常为空指针,告诉内核自己去选择地址
//

这篇关于初步认识共享内存(并不全面)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1085263

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

初步学习Android的感想

之前在学习java语言的时候就经常听说过Android这门语言,那时候感觉Android有些神秘感,再加上Android是用来开发移动设备的一门语言,所以一直对Android抱有一种兴奋的心情。 在我开始接触 Android之后,感觉超好玩,因为可以在自己的手机设备上开发一些我喜欢的小应用,再想想之前说学习Android应该会很难,但是如果你真的接触了,而且有JAVA的功底,我想学习Androi

C++第四十七弹---深入理解异常机制:try, catch, throw全面解析

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C++详解】 目录 1.C语言传统的处理错误的方式 2.C++异常概念 3. 异常的使用 3.1 异常的抛出和捕获 3.2 异常的重新抛出 3.3 异常安全 3.4 异常规范 4.自定义异常体系 5.C++标准库的异常体系 1.C语言传统的处理错误的方式 传统的错误处理机制:

SpringMVC-1.认识及配置

SpringMVC是一个基于请求驱动的Web框架,和structs一样是目前最优秀的基于MVC框架,现在的项目一般都使用SpringMVC代替Structs。 MVC模式中,Model是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象在数据库中存取数据。View是应用程序中处理数据显示的部分,通常视图是依据模型数据创建。Controller是应用程序中处理用户交互的部分。通常控制器负责从视

【H2O2|全栈】关于HTML(1)认识HTML

HTML相关知识 目录 前言 准备工作 WEB前端是什么? HTML是什么? 如何运行HTML文件? 标签 概念 分类 双标签和单标签 行内标签和块标签 HTML文档结构 预告和回顾 UI设计相关 Markdown | Md文档相关  项目合作管理相关  后话 前言 本系列的博客将分享前端HTML的相关知识点。 本篇作为本系列的第一期博客,主要讲解H