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

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

相关文章

揭秘未来艺术:AI绘画工具全面介绍

📑前言 随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面。在艺术创作领域,AI技术同样展现出了其独特的魅力。今天,我们就来一起探索这个神秘而引人入胜的领域,深入了解AI绘画工具的奥秘及其为艺术创作带来的革命性变革。 一、AI绘画工具的崛起 1.1 颠覆传统绘画模式 在过去,绘画是艺术家们通过手中的画笔,蘸取颜料,在画布上自由挥洒的创造性过程。然而,随着AI绘画工

认识LangChain

介绍 LangChain 是一个用于开发由大型语言模型(LLM)支持的应用程序的框架。LangChain使得构建LLM应用更简单,大致三个阶段: 开发阶段 Conceptual guide | 🦜️🔗 LangChainProviders | 🦜️🔗 LangChainTemplates | 🦜️🔗 LangChain使用LangChain的开源构建块和组件构建您的应用程序。使

图形编辑器基于Paper.js教程03:认识Paper.js中的所有类

先来认一下Paper的资源对象,小弟有哪些,有个整体的认识。认个脸。 在Paper.js的 官方文档中类大致有如下这些: 基类: ProjectViewItemPointToolSizeSegmentRectangleCurveCurveLocationMatrixColorStyleTweenToolEventGradientGradientStopEvent 二级或三级类 继承Ite

JavaWeb 学习笔记 spring+jdbc整合开发初步

JdbcTemplate类是Spring的核心类之一,可以在org.springframework.jdbc.core中找到它。JdbcTemplate类在内部已经处理数据库的建立和释放,可以避免一些常见的错误。JdbcTemplate类可直接通过数据源的应用实例化,然后在服务中使用,也可在xml配置中作为JavaBean应用给服务使用直接上一个实例步骤1.xml配置 <?xml version

等保测评:全面保障信息系统安全的必要举措

等保测评(信息安全等级保护测评)是评估信息系统安全等级的重要过程,旨在确保信息系统能够抵御各种安全威胁,保障信息的机密性、完整性和可用性。以下是一篇关于等保测评的文章,内容清晰、分点表示,并参考了相关数字和信息。 一、引言 随着信息技术的快速发展,信息系统在各行各业中的应用越来越广泛,但同时也面临着日益严峻的安全威胁。为了保障信息系统的安全,我国实施了信息安全等级保护制度,要求对信息系统进行等

Android匿名共享内存

ashmem的使用流程如下: 1.ashmem_create_region创建匿名共享内存区域,本质是调用open系统调用 2.ioctl设置共享内存的名字和大小,设置的名字为/dev/ashmem/,名字的存在就为了能够让其他人找到目标 3.mmap映射文件中的虚拟内存以及物理内存 4.直接对着这一块地址区域读写。 其中ioctl必须设置名字和大小,不然没办法进行映射,因为在映射之前进行了校验

【从0实现React18】 (三) 初探reconciler 带你初步探寻React的核心逻辑

Reconciler 使React核心逻辑所在的模块,中文名叫协调器,协调(reconciler)就是diff算法的意思 reconciler有什么用? 在前端框架出现之前,通常会使用 jQuery 这样的库来开发页面。jQuery 是一个过程驱动的库,开发者需要直接调用浏览器的宿主环境 API,例如 DOM 操作等。这意味着开发者需要手动管理页面状态和交互,通过执行一系列的操作来更新页面。

Rxjava2最全面的解析

说到区别,可能有的小伙伴会问,我没看过rxjava1。可以直接看rxjava2么。个人觉得不必要,因为 rxjava2.x 是按照 Reactive-Streams specification 规范完全的重写的,完全独立于 rxjava1.x 而存在,它改变了以往 rxjava1的用法。换句话说,我学java需不需要先学C语言一样。 那么两者的区别体现在哪呢?主要是如下几个方面: 空指针问题

Java参数传递造成参数值改变的情况--值传递和引用传递的初步理解

值传递 值传递,像int,float之类的简单类型进行的是值传递 [java]  view plain copy print ? public static void main(String[] args) {       int i = 900;       System.out.println(i);          changeInt(i);       S

ARC学习(3)基本编程模型认识(三)

笔者来介绍arc的编程模型的中断流程和异常流程 1、中断介绍 主要介绍一下中断进入的流程,包括需要配置的寄存器等信息。 中断号:16-255,总共240个中断。触发类型:脉冲或者电平触发中断优先级:16个,0最大,15最小。中断向量表地址:地址0x400对齐,因为中断+异常的地址总共大小占用0x400的字节中断向量大小:32位 1.1 中断配置流程 配置全局优先级阈值,STATUS