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

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

相关文章

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

SpringBoot加载profile全面解析

《SpringBoot加载profile全面解析》SpringBoot的Profile机制通过多配置文件和注解实现环境隔离,支持开发、测试、生产等不同环境的灵活配置切换,无需修改代码,关键点包括配置文... 目录题目详细答案什么是 Profile配置 Profile使用application-{profil

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

Java操作Word文档的全面指南

《Java操作Word文档的全面指南》在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文... 目录简介段落页头与页脚页码表格图片批注文本框目录图表简介Word编程最重要的类是org.apach

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决